PHP非根URL重定向到根目录遇循环问题求助
问题出在逻辑运算符的错误使用!
哦,这个陷阱太容易踩了!你的代码里的条件判断逻辑有问题,导致无论当前请求的URI是什么,这个条件都会成立,所以浏览器会一直被重定向到根路径,形成无限循环。
为什么会循环?
看你的判断条件:
if (($_SERVER["REQUEST_URI"] != "/") || ($_SERVER["REQUEST_URI"] != ""))
逻辑或(||)的规则是只要其中一个条件为真,整个表达式就为真。我们来拆解两种关键情况:
- 当请求URI是
/时:第一个条件!= "/"为假,但第二个条件!= ""为真(因为/不等于空字符串),所以整个条件为真,执行重定向。 - 当请求URI是空字符串时:第一个条件
!= "/"为真,第二个条件为假,整个条件还是为真,执行重定向。 - 其他任何非根路径的URI,两个条件至少一个为真,自然也会触发重定向。
这样一来,哪怕用户已经在根路径,代码还是会强制重定向到根,浏览器就陷入了循环。
修复方案
把逻辑或(||)改成逻辑与(&&),这样只有当URI既不是/也不是空字符串的时候,才执行重定向:
if ($_SERVER["REQUEST_URI"] != "/" && $_SERVER["REQUEST_URI"] != "") { header('Location: /'); die(); }
额外补充
有些服务器环境下,$_SERVER["REQUEST_URI"]可能不会是空字符串(比如Apache默认会把根请求的URI设为/),所以你甚至可以简化成只判断是否不等于/:
if ($_SERVER["REQUEST_URI"] != "/") { header('Location: /'); die(); }
不过保留空字符串的判断也没坏处,能兼容一些特殊的服务器配置。
另外,记得在header()函数里添加状态码,根据你的需求选择永久重定向(适合SEO)或临时重定向,比如:
header('Location: /', true, 301); // 永久重定向 // 或者 header('Location: /', true, 302); // 临时重定向 die();
内容的提问来源于stack exchange,提问作者user1431398
相关产品推荐
相关产品推荐

