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

PHP中if-else条件内设置header重定向出现无限循环的问题排查

解决移动端/PC端重定向循环问题

老兄,我太懂这种看着简单代码突然翻车的挫败感了!你遇到的“too many redirects”问题,核心原因其实是重定向循环,不是两个条件同时为真,咱们一步步拆解:

问题根源

你想啊:当你跳转到/mobile/login/之后,这个页面里是不是也包含了同样的$isMobile判断代码?如果是这样,移动端页面会再次检测到当前是移动设备,然后又跳回同一个移动端登录页,无限循环下去,浏览器自然就炸了。PC端同理,如果目标页面也有相同的判断逻辑,一样会触发循环。

而你之前用echo测试没问题,是因为echo之后没有跳转,不会触发循环,所以看起来判断是对的。

解决方案

1. 先确认$isMobile的检测准确性

先别着急改跳转,先把判断逻辑的准确性打个底:

  • 用var_dump($isMobile); exit;在跳转前输出变量值,确认它真的能正确区分移动设备和PC。
  • 如果是自己写的UA检测正则,很容易漏设备(比如新出的折叠屏、平板),建议用成熟的逻辑或者工具,比如通过$_SERVER['HTTP_USER_AGENT']做更全面的匹配,或者用专门的设备检测类。

2. 把判断逻辑限制在唯一入口页面

这是解决循环的关键:

  • 只在一个统一的入口页面(比如根目录的login.php)里放跳转逻辑,移动端和PC端的目标页面绝对不能再放这段跳转代码!
  • 举个正确的例子:
    // 根目录的login.php,唯一的登录入口
    // 先写你的$isMobile检测逻辑,比如:
    $userAgent = strtolower($_SERVER['HTTP_USER_AGENT']);
    $isMobile = str_contains($userAgent, 'mobile') || str_contains($userAgent, 'android') || str_contains($userAgent, 'iphone');
    
    if($isMobile){ 
        // 跳转到移动端登录页,这个页面里不要有跳转逻辑
        header('Location: http://localhost/myproject/mobile/login/'); 
        exit(); 
    } else{ 
        // 跳转到PC端登录页,同理不要加跳转逻辑
        header('Location: http://localhost/myproject/pc/login/'); 
        exit(); 
    }
    
    而/mobile/login/index.php和/pc/login/index.php只负责展示登录界面,不要再做任何设备检测和跳转。

3. 额外的避坑细节

  • 用header()之前,确保没有任何输出(包括文件开头的空格、换行,或者之前的echo内容),哪怕是一个看不见的空格,都会导致header失效。
  • 可以给重定向加上明确的状态码:临时重定向用header('Location: ...', true, 302);(默认就是302,适合设备切换场景),如果是永久适配可以用301,但一般推荐302。

内容的提问来源于stack exchange,提问作者philip

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 21:22:48