
本文详解如何在 Nginx 中正确配置 PHP 路由重写,将所有 API 请求统一转发至 index.php 处理,避免 404 错误,涵盖 try_files 与 rewrite 的关键区别、路径匹配陷阱及生产就绪配置要点。
本文详解如何在 nginx 中正确配置 php 路由重写,将所有 api 请求统一转发至 `index.php` 处理,避免 404 错误,涵盖 `try_files` 与 `rewrite` 的关键区别、路径匹配陷阱及生产就绪配置要点。
在你的原始配置中,404 Not Found 错误的根本原因在于 location @rewrite 块未实际触发 PHP 处理逻辑:你用 rewrite ... last 将请求重写为 /index.php?data=...,但该重写后的 URI 并未进入 location ~ \.php$ 块——因为 last 会重新发起内部请求匹配,而此时匹配的是 /index.php?data=... 这一完整 URI,而你的 location ~ \.php$ 规则仅匹配以 .php 结尾的路径(不包含查询参数),且未显式处理重写后的 index.php 请求。
更关键的是:try_files $uri $uri/ @rewrite; 中的 @rewrite 是命名 location,它只执行 rewrite 指令,不会自动交由 PHP-FPM 处理。你缺少将重写后的请求“再次路由”到 PHP 处理器的机制。
✅ 正确做法是:使用 try_files 直接兜底到 index.php,并确保该请求能被 location ~ \.php$ 捕获。以下是推荐的、经过验证的配置方案:
server {
listen 8081;
server_name name.of.server.en;
root /path/to/api;
index index.php;
# 静态文件优先尝试,不存在则交由 index.php 处理(含 query string)
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# PHP 处理块:必须显式支持 PATH_INFO(用于解析路由参数)
location ~ ^/index\.php(/|$) {
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
# 传递原始请求 URI,便于 PHP 框架(如 Slim、Laravel)解析路由
fastcgi_param REQUEST_URI $request_uri;
}
# 禁止直接访问敏感文件
location ~ \.(htaccess|htpasswd|ini|log|sh|sql|bak|git|svn) {
deny all;
}
}
? 关键说明:
-
try_files $uri $uri/ /index.php?$query_string;:这是核心。当请求/user/123/时,若无对应静态文件或目录,则内部重写为/index.php?data=user&id=123(需 PHP 代码解析$_SERVER['QUERY_STRING']或$_SERVER['REQUEST_URI']); -
location ~ ^/index\.php(/|$):精准匹配index.php及其后缀(如/index.php/user/123),配合fastcgi_split_path_info提取PATH_INFO,使框架可读取/user/123部分; -
fastcgi_param REQUEST_URI $request_uri;:保留原始请求路径,对现代 PHP 路由器(如 Symfony Router、Laravel)至关重要; - 移除冗余的
@rewrite和rewrite指令:try_files更简洁、安全、高效,且避免last引发的二次匹配歧义。
⚠️ 注意事项:
- 修改配置后务必执行
sudo nginx -t && sudo systemctl reload nginx; - 确保
index.php文件真实存在于/path/to/api/目录下; - 若使用 Laravel/Slim 等框架,请确认其
public/index.php已设为入口,并在 PHP 中正确解析$_SERVER['REQUEST_URI']; - 不要遗漏
fastcgi_param SCRIPT_FILENAME—— 错误的路径会导致File not found502 错误。
总结:Nginx 的 URL 重写应以 try_files 为首选,避免混合 rewrite + named location 带来的隐式匹配风险;PHP 处理块必须显式声明 SCRIPT_FILENAME 和 PATH_INFO,才能让应用层准确捕获路由参数。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











