【问题标题】:Should we use require_once instead header location?我们应该使用 require_once 代替标头位置吗?
【发布时间】:2011-03-04 18:17:36
【问题描述】:

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

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();

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

你怎么看?

【问题讨论】:

  • 对不起,这只是一个获取当前URL的函数。

标签: php validation header require-once


【解决方案1】:

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

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

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

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

【讨论】:

  • 是的,你是对的,当我尝试使用包含技巧时,页面会发生变化,并显示 404 消息。
【解决方案2】:

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

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

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

【讨论】:

  • 是的,我认为在我的情况下,我会继续使用标头位置,直到重定向成为@staticsan 建议的问题。
猜你喜欢
  • 2015-04-08
  • 1970-01-01
  • 2016-10-10
  • 1970-01-01
  • 2011-06-05
  • 2017-06-13
  • 2021-10-24
  • 2016-08-15
  • 2016-07-26
相关资源
最近更新 更多