请求实现URL重定向:非.php后缀URL跳转至指定格式
正确的Nginx重定向配置方案
需求回顾
将不含.php字符串的URL重定向到指定格式(如https://example.com/abc/ → https://example.com/cat/abc),但带.php的URL(如https://example.com/abc.php)不做跳转。
原规则的错误点
你提供的规则rewrite ^(.*)\/(?!.*php)(.*)$ $1/cat/$3 redirect;报错的核心原因:
- 捕获组不匹配:正则仅定义了2个捕获组,却引用了不存在的
$3,导致Nginx解析失败 - 负向预查位置错误:
(?!.*php)仅匹配第二个斜杠后的内容,无法排除整个URL中含.php的情况 - 冗余的开头捕获:
^(.*)\/针对Nginx的URI匹配逻辑完全多余,会导致匹配范围混乱
正确配置方案
根据需求提供两种常用规则:
1. 仅处理末尾带斜杠的URL(匹配示例场景)
rewrite ^/(?!.*\.php)(.*)/$ /cat/$1 permanent;
- 正则解析:
^/(?!.*\.php):匹配以/开头,且**整个URI中不包含.php**的请求(负向预查直接排除目标URL)(.*)/$:捕获斜杠后的内容,仅匹配末尾带斜杠的路径(如/abc/中的abc)/cat/$1:重定向到目标路径,$1为捕获的内容permanent:发送301永久重定向(若需临时跳转,替换为redirect)
2. 处理所有不含.php的URL(兼容末尾无斜杠的情况)
如果需要支持末尾无斜杠的路径(如/abc → /cat/abc),使用:
rewrite ^/(?!.*\.php|$)(.*)/?$ /cat/$1 permanent;
- 新增
|$:排除根目录/的跳转(若需要根目录也跳转,去掉|$即可) /?$:允许末尾有或无斜杠
注意事项
- 将规则放在Nginx配置的
server块内,确保优先级高于其他rewrite规则 - 若需排除实际存在的静态文件(如
/abc.html),可添加条件判断:if (!-f $request_filename) { rewrite ^/(?!.*\.php|$)(.*)/?$ /cat/$1 permanent; } - 测试配置有效性:执行
nginx -t检查语法,无误后重启Nginx生效
内容的提问来源于stack exchange,提问作者fitra68
相关产品推荐
相关产品推荐

