我有这样的事情:(如果此页面需要用户登录)
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();
这对我不起作用,会话变量现在包含包含的页面,而不是当前页面。
你怎么看?
答案 0 :(得分:2)
我个人建议不要这样做。原因是内容到url映射。如果您允许在任何网址上包含登录页面,那么搜索引擎应该如何索引内容(或者您如何管理内容,因为如果您递交了网址,则会为不同的状态获得不同的输出。)
URL代表统一资源定位器。这意味着允许访问资源。这就是为什么(个人而言)我宁愿总是在内容和URL之间建立1:1的映射(因此根据非URL / POST数据,页面不会显示不同的内容)......
但那只是我的0.02美元......
答案 1 :(得分:2)
他省略了一条重要的信息:重置执行上下文。
当您进行重定向时,新页面会加载并可以假定它是请求的页面。大多数页面都是这样写的,大多数PHP程序员都会编写这样的页面。这也意味着您可以通过重定向更好地控制上下文。
如果您想支持include()
技巧,那么所包含的页面必须以完全不同的方式编写。它必须理解它现在继承执行上下文,其中可能包含来自调用文件的垃圾。这也意味着用户在浏览器中看到的URL每次都不会相同。设置POST目标(例如)时,包含的页面/文件必须说明这一点,否则您将收到非常奇怪的错误。
他推荐的理由很好,但你必须在更广泛的背景下看待:主要是,你需要多长时间才能发出重定向(但上游连接的速度有多慢)?由于它看起来像登录自动重定向,我的猜测并非通常。人们习惯于一直重定向,所以你的人不可能过分突出。因此,请关闭此问题,直到重定向成为问题。