Vue Router搭配Nginx刷新404及Nginx部署Java Jar问题求助
问题解决:Vue Router刷新404 + Nginx搭配Java Jar运行方案
一、Vue Router刷新/手动输入URL出现404的解决
你的核心问题是Nginx配置中root和proxy_pass指令冲突,导致前端路由请求无法正确处理。结合你的配置和现象,分两种部署场景给出解决方案:
场景1:前端静态文件独立部署在Nginx,后端API通过代理转发
这种场景下,前端打包后的dist文件放在Nginx目录,API请求转发到后端服务。修改HTTPS server块的配置:
server { listen 443 ssl; server_name mmsdev.kolmarbnh.co.kr; ssl_certificate .crt; ssl_certificate_key .key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; # 处理前端静态资源和路由:所有路由请求返回index.html,由Vue Router接管 location / { root C:/path/to/your/vue/dist; # 替换为你的Vue项目dist目录绝对路径 index index.html index.htm; try_files $uri $uri/ /index.html; } # 转发API请求到后端服务(假设API以/api开头,可根据实际调整) location /api { proxy_pass $service_url; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; } }
- 原理:
try_files会先找对应路径的静态文件,找不到就返回index.html,让Vue Router处理前端路由;API请求单独转发到后端,避免和前端路由冲突。
场景2:后端服务(如Spring Boot)已包含前端静态资源
如果你的后端服务已经打包了前端文件,只需在后端配置路由转发,Nginx保持反向代理即可:
- 后端添加路由转发代码(以Spring Boot为例):
@Controller public class RouteForwardController { // 匹配所有非静态资源的请求,转发到index.html @RequestMapping(value = "/**/{path:[^.]*}") public String forwardToIndex() { return "forward:/index.html"; } }
- Nginx的
location /保持原有的proxy_pass配置即可,无需添加try_files。
你之前配置失效的原因
你直接在原有location /中添加try_files,导致Nginx优先读取本地html目录下的文件,而不是代理到后端服务,所以根路径/无法访问;/login虽然能显示,但因为API请求没有被正确转发,导致功能异常。
二、Nginx服务器上运行Java Jar包的方案
Nginx本身不直接运行Java Jar,Jar包由JVM执行,Nginx仅作为反向代理转发请求到Jar服务。步骤如下:
1. 准备Java环境
- 检查服务器是否安装Java:执行
java -version,确保版本符合Jar包要求 - 未安装则根据系统(Windows/Linux)安装对应版本的JDK或JRE
2. 启动Java Jar包
- 前台启动(终端关闭后服务停止,用于调试):
java -jar your-app.jar - 后台启动(终端关闭后服务持续运行):
- Windows:
start /B java -jar your-app.jar,或使用winsw工具注册为系统服务 - Linux:
nohup java -jar your-app.jar > app.log 2>&1 &(日志输出到app.log)
- Windows:
3. 配置Nginx反向代理
假设Jar包服务运行在localhost:8080,在Nginx的server块中添加:
location / { proxy_pass http://localhost:8080; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; }
如果需要同时运行多个Jar服务,可通过不同的location前缀区分:
location /app1 { proxy_pass http://localhost:8080; # 其他proxy_set_header配置同上 } location /app2 { proxy_pass http://localhost:8081; # 其他proxy_set_header配置同上 }
4. 可选:优化Jar服务管理(Linux)
将Jar注册为systemd服务,实现开机自启和故障自动重启:
- 创建服务文件
/etc/systemd/system/yourapp.service:
[Unit] Description=Your Java Application After=network.target [Service] User=root ExecStart=/usr/bin/java -jar /path/to/your-app.jar Restart=always RestartSec=3 [Install] WantedBy=multi-user.target
- 执行以下命令启用服务:
systemctl daemon-reload systemctl start yourapp systemctl enable yourapp
内容的提问来源于stack exchange,提问作者hansol choi
相关产品推荐
相关产品推荐

