0

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

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{...}

在这个页面中,他们说我们应该改用这样的东西:

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

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

你有什么想法?

4

2 回答 2

2

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

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

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

他的建议背后的理由是好的,但你必须在更广泛的背景下看待:主要是,你需要多久发出一次重定向(以及上游连接有多慢)?由于它看起来像登录自动重定向,所以我的猜测不会那么频繁。人们总是习惯于重定向,因此您的重定向不太可能过分突出。所以把这个问题放在一边,直到重定向成为问题。

于 2010-06-17T02:28:01.043 回答
2

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

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

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

于 2010-06-17T02:15:59.143 回答