我们应该使用require_once而不是标头位置吗?

时间:2010-06-17 02:09:46

标签: php validation header require-once

我有这样的事情:(如果此页面需要用户登录)

if(!isset($_SESSION['usr_id'])){          //if not a logged user
    $_SESSION['redir']=curPageURL();//Saving the current page for the redirection
    header('Location: ../Session/loginFrm.php'); 
}

在loginFrm.php中,我们执行:

{...after validation}    
if(isset($_SESSION['redir'])){
        header('Location: '.$_SESSION['redir']);
    }else{...}

在这个page中,他们说我们应该使用这样的东西:

 ...
    require_once '../Session/loginFrm.php';
    exit();

这对我不起作用,会话变量现在包含包含的页面,而不是当前页面。

你怎么看?

2 个答案:

答案 0 :(得分:2)

我个人建议不要这样做。原因是内容到url映射。如果您允许在任何网址上包含登录页面,那么搜索引擎应该如何索引内容(或者您如何管理内容,因为如果您递交了网址,则会为不同的状态获得不同的输出。)

URL代表统一资源定位器。这意味着允许访问资源。这就是为什么(个人而言)我宁愿总是在内容和URL之间建立1:1的映射(因此根据非URL / POST数据,页面不会显示不同的内容)......

但那只是我的0.02美元......

答案 1 :(得分:2)

他省略了一条重要的信息:重置执行上下文。

当您进行重定向时,新页面会加载并可以假定它是请求的页面。大多数页面都是这样写的,大多数PHP程序员都会编写这样的页面。这也意味着您可以通过重定向更好地控制上下文。

如果您想支持include()技巧,那么所包含的页面必须以完全不同的方式编写。它必须理解它现在继承执行上下文,其中可能包含来自调用文件的垃圾。这也意味着用户在浏览器中看到的URL每次都不会相同。设置POST目标(例如)时,包含的页面/文件必须说明这一点,否则您将收到非常奇怪的错误。

他推荐的理由很好,但你必须在更广泛的背景下看待:主要是,你需要多长时间才能发出重定向(但上游连接的速度有多慢)?由于它看起来像登录自动重定向,我的猜测并非通常。人们习惯于一直重定向,所以你的人不可能过分突出。因此,请关闭此问题,直到重定向成为问题。