使用nginx部署vue项目时,请求接口报404,但是postman能够拿到数据:解决办法

问题重现

在使用nginx部署vue项目时,使用的是前后端分离的方式部署vue,采用nginx反向代理部署的,但是当我把打包后的文件放入 /nginx/html/文件下时,然后再将nginx的配置文件修改如下:

这里我是在宝塔面版里面直接修改的配置文件

server
    {
        listen 80;
        server_name localhost;
        
        location / {
          root html;
          index index.html index.htm;
        }
        #error_page   404   /404.html;
        include enable-php.conf;

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires      30d;
        }

        location ~ .*\.(js|css)?$
        {
            expires      12h;
        }

        location ~ /\.
        {
            deny all;
        }
        access_log  /www/wwwlogs/access.log;
    }
然后就出现如下问题:

在这里插入图片描述
我刷新之后,就变成如下页面:
在这里插入图片描述
这里有两个问题,一个是,发送的请求报404,并且路由跳转的时候,出现404的情况。

问题分析

首先我们需要分析,vue-cli的配置文件vue.config.js,这里说的就是为了解决跨域写的配置文件。vue-cli官网的说法:如果你的前端应用和后端 API 服务器没有运行在同一个主机上,你需要在开发环境下将 API 请求代理到 API 服务器。这个问题可以通过 vue.config.js 中的 devServer.proxy 选项来配置。

module.exports = {
  devServer: {
    proxy: {
      '/api': {
        target: '<url>',
        ws: true,
        changeOrigin: true
      },
      '/foo': {
        target: '<other_url>'
      }
    }
  }
}

可以发现为了解决跨域问题,vue在启动项目的时候也启动了一个node写的内置服务器,域名和端口是:localhost:8080,细心的小伙伴可以发现,vue ui 界面就是这个地址,当使用axios发送请求时,vue会帮你把请求的端口拼接到 localhost:8080 后面,如:http://localhost:8080/category 这种形式,并且再把这个地址的域名和端口号替换成 target属性中的端口号入下:

假如访问的是 /api/category 这个接口。
首先vue会将这个接口变成:http://localhost:8080/api/category。
然后vue会根据vue.config.js 中配置target属性值来替换请求,变成:htttp://test.com:3000/category,这样就解决了跨域,因为vue里面这个服务器也是用nodejs写的,之间通信不需要跨域,而页面访问的接口,都是localhost:8080这个端口,就不存在跨域了。

module.exports = {
  devServer: {
    proxy: {
      '/api': {
        target: 'htttp://test.com:3000/',//服务器的请求地址
        ws: true,
        changeOrigin: true,
        pathRewrite: {
 		  '/api': '', // 这里就是替换方法,把路由中的api替换为空
      	}
    }
  }
}

上面讲了跨域的原理,这是我们可以发现,其实搭建vue项目还要发送一次请求,但是我们再nginx中确没有写代理,并且这里的另外一个问题,就是使用vue中的vue-router写的路由访问不了。这是因为:在vue中使用的是js渲染的虚拟目录,而在nginx配置中并没有实际的资源,所有会出现404。

解决方法

在nginx中添加配置:

server
    {
    	#代理80端口
        listen 80;
        server_name localhost;
        
        location / {
          root html;
          index index.html index.htm;
          try_files $uri $uri/ @router;
        }
		location @router {
            rewrite ^.*$ /index.html last;
        }
        #正向代理vue中转发的请求
        #找到以 /api 结尾的请求
        location ^~ /api/ {
            proxy_pass   http://127.0.0.1:3000/;
        }

        #error_page   404   /404.html;
        include enable-php.conf;

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires      30d;
        }

        location ~ .*\.(js|css)?$
        {
            expires      12h;
        }

        location ~ /\.
        {
            deny all;
        }
        access_log  /www/wwwlogs/access.log;
    }

这样就能正常访问了

在这里插入图片描述

假如出现这样的问题:
在这里插入图片描述
这个可能是配置nginx出了问题:需要仔细看一下
在这里插入图片描述
出现问题的主要原因是nginx配置异常,没有正确转发后端接口地址。

### 部署 Vue 和 Spring 构成的前后端分离项目的教程 以下是将 Vue 和 Spring 构建的前后端分离项目部署Linux 虚拟机的具体流程: #### 1. 准备工作 确保已经准备好以下资源: - 已经开发完成并打包好的前端 (Vue) 和后端 (Spring Boot) 项目文件。 - 可访问的 Ubuntu 或其他 Linux 发行版虚拟机。 --- #### 2. 后端项目部署 ##### a. 连接服务器 通过工具 FinalShell 或者 SSH 命令连接至目标 Linux 虚拟机[^3]。 ##### b. 安装 Java 环境 如果尚未安装 JDK,可以通过以下命令安装 OpenJDK: ```bash sudo apt update && sudo apt install default-jdk -y ``` 验证安装成功: ```bash java -version ``` ##### c. 配置 Spring Boot 应用程序 上传已构建好的 `.jar` 文件到服务器指定目录(如 `/home/springboot/`),并通过以下命令启动应用程序: ```bash nohup java -jar your-spring-boot-app.jar > app.log 2>&1 & ``` 其中 `your-spring-boot-app.jar` 是实际的应用名称。日志会保存在当前路径下的 `app.log` 中以便后续排查问题[^1]。 调整配置文件中的 IP 地址为服务器公网地址或者本地回环地址 (`0.0.0.0`),使得外部可以正常访问 API 接口。 --- #### 3. 前端项目部署 ##### a. 安装 Nginx Nginx 将作为反向代理来处理静态资源请求以及转发给后端接口调用。执行如下操作安装 Nginx: ```bash sudo apt update && sudo apt install nginx -y ``` 检查状态确认运行无误: ```bash systemctl status nginx ``` ##### b. 静态资源配置 将编译后的 Vue 项目文件夹复制到默认网站根目录 `/var/www/html/` 下面,并修改其权限允许读取内容: ```bash cp -r dist/* /var/www/html/ chmod -R 755 /var/www/html/ ``` 编辑站点配置文件以支持 SPA 单页面应用模式,在 `/etc/nginx/sites-available/default` 添加重写规则: ```nginx location / { try_files $uri /index.html; } ``` 最后重启服务使更改生效: ```bash sudo systemctl restart nginx ``` 对于更复杂的场景可能还需要设置跨域资源共享 CORS 头部信息或其他安全措施[^4]。 --- #### 4. 测试与优化 打开浏览器输入域名或 IP 访问首页查看效果;同利用 Postman 等工具测试 RESTful APIs 是否能够正确返回数据。若有异常则查阅后台打印的日志定位错误原因。 --- ### 注意事项 - **防火墙开放必要端口**:确保 HTTP(80)/HTTPS(443),还有自定义的服务监听端口号未被屏蔽掉。 - **性能监控与扩展能力规划**:随着业务增长考虑引入负载均衡器、缓存机制等手段提升用户体验质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值