You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 11:48:14