Nginx配置带扩展名SEO友好URL报404 重写跳转规则求助
当前配置返回404的核心原因是Nginx的location匹配优先级规则:正则匹配优先级高于普通前缀匹配,所有带.png后缀的/gallery/*请求会优先命中你配置的静态资源缓存规则,直接尝试读取服务器对应路径下的实体PNG文件,找不到就直接返回404,根本不会走到后续的通用路由重写逻辑。
按以下顺序调整nginx.conf配置即可,注意规则顺序不能乱:
优先拦截/gallery路径请求:在所有正则匹配规则(包括静态资源规则)之前,新增
/gallery路径的专属匹配规则,用^~标记提升匹配优先级,避免被静态资源规则拦截。
如果你/gallery路径下没有真实存在的静态图片资源,所有请求都要走动态脚本,直接加以下配置:# 放在所有正则location之前,优先匹配/gallery/下的所有请求 location ^~ /gallery/ { rewrite ^/gallery/(.*)$ /vendor/mindgoner/script.php?seo_path=$1 last; }如果
/gallery下有部分真实存在的静态图片需要直接返回,不想走动态脚本,就改成以下配置,兼顾静态文件和动态路由:location ^~ /gallery/ { # 先查找对应路径的真实文件,找到就直接返回,找不到再走动态重写 try_files $uri $uri/ @gallery_php; } location @gallery_php { rewrite ^/gallery/(.*)$ /vendor/mindgoner/script.php?seo_path=$1 last; }重写规则里的
$1会捕获/gallery/后面的完整路径字符串,比如访问/gallery/abc/123.png时,seo_path参数值就是abc/123.png,你在script.php里通过$_GET['seo_path']就能拿到完整路径,自行做参数拆分逻辑即可。调整原有静态资源规则:给原来的静态资源匹配规则加
try_files判断,只有文件真实存在时才走缓存逻辑,不存在就转去通用路由,避免其他路径下带静态后缀的动态路由被误拦截:location ~* \.(jpg|jpeg|png|gif|ico|css|js|swf)$ { try_files $uri @rewrite; expires 7d; }保留原有通用路由规则:你之前写的根路径匹配、@rewrite通用重写规则修正语法后直接保留即可:
location / { try_files $uri $uri/ @rewrite; } location @rewrite { rewrite ^/([a-zA-Z0-9_-]+)?\/?([a-zA-Z0-9_-]+)?\/?([a-zA-Z0-9_-]+)?\/?([a-zA-Z0-9_-]+)?\/?([a-zA-Z0-9_-]+)?\/?([a-zA-Z0-9_-]+)?$ /index.php?a=$1&b=$2&c=$3&d=$4&e=$5&f=$6 break; }
配置修改完成后,先执行nginx -t命令检查配置语法是否正确,确认没有报错后执行nginx -s reload重载配置即可生效。
请求处理逻辑说明:
- 访问
/gallery/*路径的请求会优先被专属规则捕获,重写到指定PHP脚本处理,不会去查找实体文件 - 重写后的请求是.php后缀,会自动匹配你服务器原有的PHP解析规则(一般是配置了fastcgi_pass的.php location块),正常交给PHP-FPM执行,不会出现源码泄露或403问题
- 其他路径下真实存在的静态资源依然会命中缓存规则,设置7天过期头,不影响原有静态资源加载性能
内容的提问来源于stack exchange,提问作者Bartosz Bieniek

