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

  • 原创
  • 作者:程序员三丰
  • 发布时间:2022-08-30 12:04
  • 浏览量:589
最近的项目使用 Ant Design Pro of Vue v3.0.2 搭建管理后台,开发环境通过 vue.config.js 的 devServer.proxy 请求 API 完全正常。但是打包后按照官方 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;

分析总结

配置项 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/api/xxx,如果 Header 里 Host 有值,就直接拿 请求 Header 里面的 Host 的值。

参考资料

声明:本文为原创文章,51blog.xyz和作者拥有版权,如需转载,请注明来源于51blog.xyz并保留原文链接:https://www.51blog.xyz/article/31

文章归档

强烈推荐的PHP全栈开发后台管理系统
buildadmin logo
Thinkphp8 Vue3 Element PLus TypeScript Vite Pinia

🔥BuildAdmin是一个永久免费开源,无需授权即可商业使用,且使用了流行技术栈快速创建商业级后台管理系统。

推荐文章

热门标签

PHP ThinkPHP ThinkPHP5.1 Go Mysql Mysql5.7 Redis Linux CentOS7 Git HTML CSS CSS3 Javascript JQuery Vue LayUI VMware Uniapp 微信小程序 docker wiki Confluence7 学习笔记 uView ES6 Ant Design Pro of Vue React ThinkPHP6.0 chrome 扩展 翻译工具 Nuxt SSR 服务端渲染 scrollreveal.js ThinkPHP8.0 Mac webman 跨域CORS vscode GitHub ECharts Canvas vue3 three.js 微信支付 PHP全栈开发 Python AI 人工智能 AI辅助 工作经验 实战笔记