来自PHP header()的奇怪行为

时间:2011-03-04 05:56:55

标签: php header

我正在尝试编写支票,根据用户在网站注册过程中的进度来重定向用户。我有这个:

if($user = VRComponent::getLogin()) {
    if(VR::exists('vr_user','Signup',"userID={$user->ID}")) {
        $step = VR::select('vr_user','Signup',"userID={$user->ID}");
        $step = intval($step[0]['step']);
        if(!isset($_GET['step']) || $step != intval($_GET['step'])) {
            switch($step) {
                case 1: header("Location: /signup/one"); exit; break;
                case 2: header("Location: /signup/two"); exit; break;
                case 3: header("Location: /signup/three"); exit; break;
                case 4: header("Location: /signup/four"); exit; break;
            }
        }
    } else {
        header("Location: /account");
        exit;
    }
} else {
    header("Location: /");
    exit;
}



exists和select函数基本上只是mysql函数的别名。

本质上,这将检查用户是否已登录。如果是,则检查他们是否已完成注册过程。如果没有,它会检查“页面”获取var是否实际上是它们所在的最后一页。如果没有,它会将它们重定向到正确的页面。

逻辑工作,但页面引用的所有外部js和css文件都不会加载。奇怪的是他们不会抛出404,而是文件的唯一内容是:

Failed to load source for: https://domain.com/path/to/file/style.css

另一个奇怪的事情是,即使if语句的条件为false,文件也不会加载。注释掉switch语句(即使if条件为false)也允许加载文件,但当然逻辑也不正确。

我认为它几乎必须是简单的,但我只是没有看到它。我正准备将拳头放在我的显示器上,因为这种行为对我来说毫无意义。

提前致谢了-D

2 个答案:

答案 0 :(得分:3)

我想你正在使用mod-rewrite来处理signup/*?如果是这样,您可能需要在HTML的<base href="APPROPRIATE BASE" />中声明<head>,以便浏览器不会在假定的注册文件夹中查找css / js =)

答案 1 :(得分:0)

更新:我睡着了,当我醒来的时候,我发现了实际的问题(很清楚头脑可以做到这一点很神奇)。原来PHP正在完成我告诉它要做的事情。因为我从来没有对任何第三方PHP框架感到满意,所以我决定在不久前建立自己的PHP框架。它所做的一件事就是自动剔除任何给定页面中使用的所有css和js文件到单个文件中,以减少http请求的数量。它还反映了那些css / js文件中主页的要求,我设置了apache,因此它将执行内联PHP。因此,js / css文件需要问题代码,然后重定向到其中一个注册页面,因为$ _get ['step']未定义。不过,这种东西让我很高兴我使用自己的框架。当然,有时它会让我想要像一个在某些僵尸身上斧头的男人一样去中世纪,但是它提供的自由以及随着我远远超过愤怒而进化的能力。不仅如此,它使得一切都比我使用的任何其他框架更容易(当我实际编码时)。也许有一天,当我觉得它准备好迎接黄金时段时,我会把它发布给公众。

旧------------------------------------
经过几个小时的研究,我修好了!

问题是各种各样的重定向循环。由于我不知道的原因,外部文件正在通过我的OP中的块从p​​hp文件运行,然后将该位置更改为其中一个重定向。

为了修复它,我检查了'。 php_self中的css'和'.js',如果找到则禁止重定向。这是修改后的代码:

if($user = VRComponent::getLogin()) {
    if(VR::exists('vr_user','Signup',"userID={$user->ID}")) {
        $step = VR::select('vr_user','Signup',"userID={$user->ID}");
        $step = intval($step[0]['step']);
        $css = stripos($_SERVER['PHP_SELF'],'.css');
        $js = stripos($_SERVER['PHP_SELF'],'.js');
        if(!$css && !$js && (!isset($_GET['step']) || $step != intval($_GET['step']))) {
            switch($step) {
                case 1: header('Location: /signup/one');
                    break;
                case 2: header('Location: /signup/two');
                    break;
                case 3: header('Location: /signup/three');
                    break;
                case 4: header('Location: /signup/four'); 
                    break;
            }
        }
    } else
        header("Location: /account");
} else
    header("Location: /");

是的,这很粗糙,我迟早会设计一个更优雅的解决方案,但现在这个必须要做。

谢谢大家的帮助。