Apache重写规则转Nginx配置失效,求修复方案
Apache重写规则转Nginx配置失效,求修复方案
我先帮你梳理下原Apache规则的核心逻辑,这样才能精准转换成符合预期的Nginx配置:
- 第一步:如果请求的是已存在的文件或目录,保持原请求路径继续处理(Apache里的
[N]是循环重写,本质是优先保障真实存在的资源能被直接访问) - 第二步:如果请求URI带有文件扩展名(比如
.html、.css这类),把请求转发到public/目录下的对应路径 - 第三步:如果请求的既不是存在的文件也不是目录,就把请求交给
server.php处理
再看看你当前Nginx配置的问题:
你写的location ~* \.\w+$会优先匹配所有带扩展名的请求,但这里有两个关键问题:
- 没有先检查原路径的文件/目录是否存在,直接重写到
public/,和原Apache的执行顺序完全相反 - 如果
public/下对应的文件不存在,这个location不会继续往后处理,直接返回404,而不是交给server.php兜底
下面是修复后的完整Nginx配置,完全对齐原Apache的逻辑:
server { listen 80; server_name example.com; root /path/to/your/document/root; # 优先处理真实存在的文件/目录,不存在则跳转到自定义规则块 location / { try_files $uri $uri/ @rewrite_handler; } # 自定义重写规则块,对应原Apache的后两条规则 location @rewrite_handler { # 匹配带扩展名的请求,转发到public目录 rewrite ^(.*\.\w+)$ /public$1 last; # 其他无扩展名或public下文件也不存在的请求,交给server.php处理 rewrite ^ /server.php last; } # 务必配置PHP解析规则(根据你的PHP版本调整) location ~ \.php$ { fastcgi_pass unix:/run/php/php8.2-fpm.sock; # 替换为你的PHP-FPM路径 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
配置逻辑说明:
location /作为默认匹配,先用try_files检查原路径的文件/目录,存在就直接返回,不存在才进入自定义规则块- 在
@rewrite_handler里,先处理带扩展名的请求,last标志会让Nginx重新发起请求匹配,这时候会去检查public/下的文件是否存在;如果还是不存在,会再次触发location /的try_files,最终回到规则块执行第二条重写,把请求交给server.php - PHP解析规则是必须的,否则
server.php无法被正确执行,记得根据你的实际PHP版本调整fastcgi_pass的路径
最后别忘了用nginx -t测试配置是否合法,没问题后重启Nginx生效。
备注:内容来源于stack exchange,提问作者Shivam Ahuja
相关产品推荐
相关产品推荐

