伪静态去除后缀的核心是Nginx内部重写而非重定向,通过location匹配无后缀路径并rewrite补.php后缀,配合存在性判断或统一入口确保安全,同时保留查询参数并验证200响应。

伪静态去除后缀,比如把 /about.php 变成 /about,核心是让 Nginx 在用户访问无后缀路径时,内部转发到对应 PHP 文件,同时保持浏览器地址栏不变。这不是重定向(不跳转),而是内部重写。
用 location + rewrite 实现干净路径
推荐在 location / 或更精确的匹配块中配置,避免误伤静态资源:
- 先用
location锁定以字母/数字结尾、无扩展名的请求,例如location ~ ^/[\w-]+$(匹配/contact、/user-profile) - 再用
rewrite补上.php后缀,并加last触发重新匹配,交由 PHP 处理器执行 - 务必确保已有处理
.php的 location(如location ~ \.php$),否则会 404
示例配置:
```nginxlocation ~ ^/[\w-]+$ {
rewrite ^/(.*)$ /$1.php last;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
}
```
更安全的做法:只对真实存在的 PHP 文件生效
直接重写所有无后缀路径风险高(可能把 /images 也转成 /images.php)。建议加一层存在性判断:
- 用
if (!-f $request_filename)判断当前请求路径不是真实文件 - 再用
if (-f $document_root$1.php)确认同名 PHP 文件存在(需配合正则捕获) - 或统一入口方式:所有请求先落到
index.php,由 PHP 路由分发(如 Laravel、WordPress 常用)
简化版存在检查(放在 location / 内):
location / {
if (!-f $request_filename) {
rewrite ^/(.*)$ /$1.php last;
}
}
```
处理根路径和带参数的请求
用户访问 / 或 /search?q=nginx 时,也要能正确映射:
-
rewrite ^/$ /index.php last;单独处理首页 - 通用规则中使用
QSA(Query String Append)标志保留原始参数:rewrite ^/(.*)$ /$1.php? last;→ 改为rewrite ^/(.*)$ /$1.php? last;不够,应写成:rewrite ^/(.*)$ /$1.php?$args last;或更稳妥地用rewrite ^/(.*)$ /$1.php last;并依赖fastcgi_param QUERY_STRING $args;
验证与调试要点
配置后必须验证是否真正“内部转发”,而非 301/302 跳转:
- 执行
nginx -t检查语法 - 用
curl -I http://localhost/about查看响应头,确认状态码是 200,且无Location字段 - 开启
rewrite_log on;(需编译时含 debug 日志)观察重写过程 - 注意:正则中的
.要转义为\.,否则会误匹配任意字符


















