nginx 通过 try_files 实现无扩展名 url 访问,优先匹配 $uri、$uri/、$uri.html、$uri.php,确保 clean url(如 /about)自动映射到对应真实文件;rewrite 仅限必要场景,需防循环重定向与 404。

Linux 下用 Nginx 的 rewrite 隐藏 URL 扩展名,本质不是真正“删除”后缀,而是让不带后缀的请求能被正确映射到带后缀的真实文件上——用户看到的是 clean URL(比如 /about),Nginx 内部自动补全为 /about.php 或 /index.html 并返回。关键靠 try_files 指令,它比纯 rewrite 更安全、更高效。
用 try_files 实现无扩展名访问(推荐)
这是最常用也最稳妥的方式,适用于 PHP、HTML 等静态或动态页面:
- 在
server或location /块中添加:
location / {
try_files $uri $uri/ $uri.html $uri.php$is_args$args;
}
-
$uri:先尝试匹配真实存在的同名文件(如/contact→/contact) -
$uri/:再尝试作为目录(如/blog/) -
$uri.html和$uri.php:最后分别补上常见后缀,$is_args$args保证查询参数不丢失 - 用户访问
/about,Nginx 自动找about.php;访问/help?lang=zh,实际执行help.php?lang=zh
用 rewrite 显式重写(需谨慎)
仅当必须强制跳转或做路径标准化时才用 rewrite,注意避免循环重定向:
- 隐藏 .php 后缀并内部重写(不跳转):
location ~ \.php$ {
return 404;
}
location / {
rewrite ^/(.+)$ /$1.php last;
}
- 第一段禁止直接访问
.php文件,防源码泄露 - 第二段把所有非 PHP 请求(如
/user)重写为/user.php,last表示内部重发,浏览器地址栏不变 - ⚠️ 必须确保每个请求都有对应
.php文件,否则会 404;建议搭配try_files更健壮
隐藏静态资源后缀(如 .js、.css)
这类通常不建议隐藏,因为构建工具已用哈希命名(main.a1b2c3.js),但若需统一处理可这样配置:
- 让
/static/js/app自动命中/static/js/app.js:
location ^~ /static/js/ {
try_files $uri.js $uri;
expires 1y;
add_header Cache-Control "public, immutable";
}
- 优先找
.js版本,找不到再找无后缀文件 - 配合
immutable缓存策略,避免因 URL 变化导致重复下载
注意事项与避坑点
- 规则顺序很重要:
location ~ \.php$必须放在location /之前,否则会被覆盖 - 不要对整个站点盲目启用重写,先限定路径前缀(如
location ^~ /api/) - 修改后务必运行
sudo nginx -t测试语法,再sudo systemctl reload nginx - 浏览器可能缓存 301 跳转,测试时用
curl -I或无痕窗口验证真实响应











