当前位置: 首页 > news >正文

Ant Design Pro of Vue 构建打包后使用 Nginx 发布,API 请求报 404 错

文章目录

  • 问题描述
    • 开发环境
    • 复现步骤
  • 解决问题
    • 解决思路和步骤
    • 解决问题
    • 问题解析
    • 分析总结
    • 参考资料

问题描述

开发环境

Vue + Yarn + WebStorm + Nginx(来自 phpstudy_pro 集成环境)

复现步骤

  1. 根据 Ant Design Pro of Vue 官网文档安装部署搭建项目,具体细节这里不做细讲,下文都以项目在正常开发为前提,界面功能交互可正常操作,API 接口可正常访问。
  2. 执行 yarn build 构建打包成功,在根目录下生成dist文件夹,就是打包后生成文件。
  3. 通过 phpstudy_pro 创建网站,将 上一步 dist 内所有文件复制到新创建的网站的根目录下。
  4. 修改上一步创建的网站的配置文件。下面是官网的配置代码:
server {
    listen 80;
    # gzip config
    gzip on;
    gzip_min_length 1k;
    gzip_comp_level 9;
    gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
    gzip_vary on;
    gzip_disable "MSIE [1-6]\.";

    root /usr/share/nginx/html;

    location / {
        # 用于配合 browserHistory 使用
        try_files $uri $uri/ /index.html;

        # 如果有资源,建议使用 https + http2,配合按需加载可以获得更好的体验
        # rewrite ^/(.*)$ https://preview.pro.loacg.com/$1 permanent;

    }
    location /api {
        proxy_pass https://preview.pro.loacg.com;
        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_set_header   Host              $http_host;
        proxy_set_header   X-Real-IP         $remote_addr;
    }
}

我调整简化完的配置代码如下:

server {
    listen        8093;
    server_name  edumis-admin.test;
    root   "E:/www.bch/www.dist";
    location / {
        try_files $uri $uri/ /index.html;
    }
    location /api {
        proxy_pass http://test-api.51blog.xyz;
        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_set_header   Host              $http_host;
        proxy_set_header   X-Real-IP         $remote_addr;
    }
    location /uploadfile {
        proxy_pass http://test-api.51blog.xyz;
        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_set_header   Host              $http_host;
        proxy_set_header   X-Real-IP         $remote_addr;
    }
}

【说明】
集成环境或软件版本不同,可能配置文件内容会有差异,但大同小异,关键代码应该都一样。

切记,配置完,确认已保存配置文件,然后重启 Nginx!!!否则配置不会生效。

  1. 打开浏览器,访问项目,此时应该会发现静态资源正常访问,但是请求的 API 均报出 404 错误。

解决问题

解决思路和步骤

  1. 首先确认 API 服务正常(通过 API 测试工具,或找相关开发人员确认);
  2. 检查 Nginx 配置文件,确认没有问题;
  3. 通过排除法(开启和关闭注释)排查关键配置项;(虽然比较笨,但我就是通过该方式找到问题的,其实最佳方式应该是考虑如何查看请求转发日志,但我还没找到这个解决方案。)

通过以上三步我找到了问题所在,是配置项的问题,其实说到底还是配置文件有问题,配置项语法没问题,是由于不了解配置项的值的意义,才出现错误的。这个配置项是 proxy_set_header Host $http_host;

解决问题

往往令我们抓狂是找不到问题或者说找问题的过程,只要定位了问题所在,有了思考的方向,就轻松多了。
具体解决办法如下:

proxy_set_header Host $http_host; 替换为 proxy_set_header Host $proxy_host; 保存配置文件,重启 Nginx,API 即可正常访问。

问题解析

先通过两种方式好好了解一下这个配置项proxy_set_header Host $http_host;

  • 如果你英文足够好,直接上nginx 官方 API ,直接、高效、专业,(链接地址:https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header)
  • 那只能通过查阅网络资料,google、csdn、百度一下、……

分析总结

配置项 proxy_set_header Host 的值可设置为:

  • $proxy_host:如果配置了 upstream, 那么$proxy_host 的值就是 upstream 的名字;否则 $proxy_host 的值就是 proxy_pass 后面的地址;

  • $host:如果请求 Header 里 Host 无值,直接拿 server_name 的值进行填充;否则,就直接拿 请求 Header 里面的 Host 的值。

  • $http_host:如果请求 Header 里 Host 无值,直接拿 server_name 的值进行填充。并加上端口。如果是 80/443 则不加。 其实就是取请求 url 里面的值。 http://server:port/v1,如果 Header 里 Host 有值,就直接拿 请求 Header 里面的 Host 的值。

参考资料

  • 解决 Nginx 配置 proxy_pass 后 返回 404 问题
  • Module ngx_http_proxy_module

相关文章:

  • 多功能音频工具的旗舰音乐编辑工具!Music Studio
  • Spring循环依赖
  • iptables规则表及规则链及语法
  • “云”上交通,“翼”路畅行
  • java计算机毕业设计科学评价系统源码+数据库+系统+lw文档+mybatis+运行部署
  • 【分享】“简道云“ 在集简云平台集成应用的常见问题与解决方案
  • springboot保险公司车辆事故跟踪系统毕业设计源码011444
  • k8s如何部署kubernetes-dashboard
  • uniapp开发微信、支付宝小程序订阅消息
  • IC入行第一步:怎样选择岗位和公司?
  • flink1.13报错:The file STDOUT does not exist on the TaskExecutor
  • java计算机毕业设计口腔医院网站源码+数据库+系统+lw文档+mybatis+运行部署
  • 比较两个文本,找出在另一文本中出现过的串并换某种格式输出
  • Windows下安装虚拟环境
  • SpringMVC之注解驱动的控制器
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • Android系统模拟器绘制实现概述
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • CAP理论的例子讲解
  • ECMAScript6(0):ES6简明参考手册
  • JS专题之继承
  • Netty 4.1 源代码学习:线程模型
  • python_bomb----数据类型总结
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 工作手记之html2canvas使用概述
  • 我有几个粽子,和一个故事
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • scrapy中间件源码分析及常用中间件大全
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #pragma multi_compile #pragma shader_feature
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (4.10~4.16)
  • (9)目标检测_SSD的原理
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (HAL库版)freeRTOS移植STMF103
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (二)fiber的基本认识
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (附源码)ssm码农论坛 毕业设计 231126
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (转)程序员技术练级攻略
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .NET DataGridView数据绑定说明
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET NPOI导出Excel详解
  • .net 设置默认首页
  • .NET正则基础之——正则委托
  • /bin/rm: 参数列表过长"的解决办法
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • @Documented注解的作用
  • @property python知乎_Python3基础之:property