PHP代码从Apache迁移至Nginx后的URL路由配置问题
解决Nginx下
MyUrl.com/UserId这类URL的路由问题 嘿,我来帮你搞定这个头疼的问题——之前在Apache环境里,MyUrl.com/UserId这种请求能正常让根目录的index.php通过request_uri拿到UserId,但切换到Nginx后,服务器非要去找不存在的UserId文件夹,完全偏离了预期逻辑对吧?
核心修改方案
你只需要调整Nginx配置里的location /块,让非文件/非目录的请求直接转发到根目录的index.php,同时完整保留原请求的信息就行。
替换原location /配置
把你当前配置里的这段:
location / { try_files $uri $uri/ /index.php?$query_string; }
改成:
location / { try_files $uri $uri/ /index.php$is_args$args; }
为什么这样改?
原来的/index.php?$query_string只传递了查询参数,但没保留完整的请求URI(也就是/UserId这部分)。而$is_args$args的组合会:
- 当请求带查询参数时(比如
MyUrl.com/UserId?foo=bar),自动带上?foo=bar - 关键是,Nginx会把原请求的URI(
/UserId)通过REQUEST_URI环境变量传递给PHP,这样你的index.php就能像在Apache里一样,通过$_SERVER['REQUEST_URI']提取出UserId了。
可选优化(按需使用)
如果你的业务逻辑里,UserId绝对不会是真实存在的文件或目录,也可以用更直接的规则,但更推荐上面的try_files方案(Nginx原生指令,比if指令更高效可靠):
location / { if (!-e $request_filename) { rewrite ^/(.*)$ /index.php last; } try_files $uri $uri/ /index.php$is_args$args; }
生效步骤
修改完配置后,别忘重启Nginx让配置生效:
sudo systemctl restart nginx
另外要注意:那些标注FORGE CONFIG (DO NOT REMOVE!)的配置块千万别删,不然会影响Forge对站点的管理功能哦。
内容的提问来源于stack exchange,提问作者EdTheSped
相关产品推荐
相关产品推荐

