Nginx重写规则不生效,路径总是404怎么办?

东方尚斌 阅读 31

我用Nginx部署了一个前端项目,想把所有非静态资源的请求都重写到index.html,但配置了rewrite后刷新页面还是404。

我试过在location里加rewrite ^(.*)$ /index.html last;,也试过用try_files,但都不行。下面是我的配置:

location / {
    root /usr/share/nginx/html;
    index index.html;
    rewrite ^(.*)$ /index.html last;
}
我来解答 赞 5 收藏
二维码
手机扫码查看
2 条解答
书生シ玉佩
看起来你的配置思路是对的,但有些细节可能需要调整。我来一步步解释怎么解决这个问题。

首先,你想要的效果是把所有请求都导向到index.html,这通常用try_files来做会更合适一些。rewrite虽然能实现类似效果,但在某些情况下可能会导致意外行为。

下面是经过优化后的配置示例:


server {
listen 80;
server_name example.com;

root /usr/share/nginx/html;

# 这里我们定义了location /
location / {
# try_files指令会依次检查文件是否存在
# 如果都没找到,就返回index.html
try_files $uri $uri/ /index.html;

# 注意这里不需要写rewrite了
# 原理是这样的:当用户访问一个路径时
# Nginx会先检查这个路径是否存在对应的静态文件
# 如果都没有找到,就会返回最后指定的文件(index.html)
}
}


这段配置的关键在于try_files $uri $uri/ /index.html;
1. $uri表示完整的请求路径,比如/user/profile
2. $uri/表示以斜杠结尾的目录形式,比如/user/profile/
3. 最后一个参数/index.html就是当上面两个都找不到时要使用的文件

记得在修改完配置文件后,一定要reload Nginx让配置生效。可以用命令sudo nginx -s reload

顺便说一句,很多人第一次配这种SPA(单页应用)路由的时候都会遇到404问题,因为默认情况下Nginx会直接去找对应的文件。通过这种方式,就能很好地支持前端路由了。

如果你还是遇到404,建议检查一下:
- 文件权限是否正确,特别是index.html是否有读取权限
- 根目录/usr/share/nginx/html下确实有index.html文件
- 配置文件语法是否正确,可以用nginx -t命令检查
点赞
2026-03-29 22:15
FSD-琳贺
老哥你那个rewrite放错位置了,用try_files才对。试试这个配置:

location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
}


搞完记得nginx -s reload。我上次也踩过这坑,熬到凌晨三点才解决...
点赞 1
2026-03-07 21:00