迁移服务器后$_SERVER['DOCUMENT_URI']失效,如何无需修改大量代码解决?
解决迁移服务器后$_SERVER['DOCUMENT_URI']为空的问题
刚迁移服务器就碰上这种变量失效的糟心事,太懂你不想挨个改代码的痛苦了!
问题根源
$_SERVER['DOCUMENT_URI']是Apache HTTP Server专属的环境变量,如果你新服务器换成了Nginx,或者Apache的配置(比如mod_rewrite模块未启用、虚拟主机AllowOverride设置不对)没跟上,这个变量就不会被自动填充。
最优解决方案:统一在入口文件补全变量
不用修改大量业务代码,只需要在项目的入口文件(比如根目录的index.php)最顶部添加一段兼容代码,就能让所有原有$_SERVER['DOCUMENT_URI']的调用正常工作:
// 兼容服务器未提供DOCUMENT_URI的情况 if (!isset($_SERVER['DOCUMENT_URI'])) { // 从REQUEST_URI中剥离查询参数,和你临时方案逻辑一致 $uri_parts = explode('?', $_SERVER['REQUEST_URI'], 2); $_SERVER['DOCUMENT_URI'] = $uri_parts[0] ?? $_SERVER['REQUEST_URI']; }
补充说明
- 为什么选入口文件:所有请求都会经过入口文件,在这里统一设置一次,整个项目的代码无需任何改动,直接复用原有逻辑。
- 如果是Apache环境的问题:可以检查是否启用了
mod_rewrite模块,或者虚拟主机配置中是否设置了AllowOverride All(若依赖.htaccess),不过相比折腾服务器配置,代码兼容的方式更快捷,尤其是你不想调整环境的情况下。 - 更稳妥的低版本兼容写法:上面的代码用了PHP7+的空合并运算符
??,如果你的服务器PHP版本较低,可以换成判断写法:
if (!isset($_SERVER['DOCUMENT_URI'])) { $uri_parts = explode('?', $_SERVER['REQUEST_URI'], 2); $_SERVER['DOCUMENT_URI'] = isset($uri_parts[0]) ? $uri_parts[0] : $_SERVER['REQUEST_URI']; }
这样就能完美解决问题,不用再操心逐个修改代码啦!
内容的提问来源于stack exchange,提问作者n00b
相关产品推荐
相关产品推荐

