为啥是我的标头(“位置:$_SERVER['HTTP_REFERER']”); PHP函数不起作用?

Posted

技术标签:

【中文标题】为啥是我的标头(“位置:$_SERVER[\'HTTP_REFERER\']”); PHP函数不起作用?【英文标题】:why is my header("Location: $_SERVER['HTTP_REFERER']"); PHP function not working?为什么是我的标头(“位置:$_SERVER['HTTP_REFERER']”); PHP函数不起作用? 【发布时间】:2011-12-21 11:24:37 【问题描述】:

当我输入时它工作

header("Location: http://www.google.com");

但是当我有时它不起作用

header("Location: $_SERVER['HTTP_REFERER']");

我想将页面重定向到它来自的任何页面。

【问题讨论】:

并非所有浏览器都会发送referer,有些浏览器会发送虚假数据。同样,您不能在这样的双引号字符串中的数组键上使用引号。试试header("Location: $_SERVER['HTTP_REFERER']"); 你查看$_SERVER['HTTP_REFERER']的内容了吗? 这个字符串的输出是什么: echo "Location: $_SERVER['HTTP_REFERER']"; ? @MarcB 是对的。您可以通过启动 Fiddler (fiddler2.com/fiddler2) 并查看您返回的标头来验证此行为。我总是像这样连接变量而不是将它们内联,因此代码易于阅读。 【参考方案1】:

试试看::)

if (!empty($_SERVER['HTTP_REFERER']))
    header("Location: ".$_SERVER['HTTP_REFERER']);
else
   echo "No referrer.";

但是,为了确定用户来自哪个页面,我宁愿使用会话变量,它在每个页面都会重置:

session_start();
echo "Previous page:", $_SESSION['loc'];
$_SESSION['loc']=$_SERVER['php_SELF'];

ps:这仅适用于本地页面,您无法跟踪其他网站。

【讨论】:

【参考方案2】:

你可以试试:

header("Location: $_SERVER['HTTP_REFERER']");

我在使用不带大括号的字符串中包含引号的变量表达式时遇到了问题。

您还需要注意$_SERVER['HTTP_REFERER'] 根本没有设置。一些用户代理不设置它,一些私人工具将其掩盖,并且您需要处理没有引荐来源的人访问您的页面。

【讨论】:

【参考方案3】:

这是一个简单的解决方案。 检查并查看 $_server['http_referer'] 给你什么,如果它设置了,那么你可以重定向,如果没有放一个后备网址,比如:

if(isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER'] != "")
$url = $_SERVER['HTTP_REFERER'];
else
$url = "YOUR INDEX PAGE OR SOMETHING";


header("Location: ".$url);

【讨论】:

【参考方案4】:

这是一个浏览器功能,任何有礼貌的浏览器都会发送 正确的标题(尽管各种“安全”工具会覆盖这个 有一个假的推荐人)。

它是特定于浏览器的,因此并非每个浏览器/安全软件组合都会将其发送到服务器。您最好在每个页面加载时设置一个会话变量,以确定用户来自哪个页面(或类似的具有更多逻辑的页面)

【讨论】:

那么在每个页面上创建一个当前 url 的会话?【参考方案5】:
header("Location: $_SERVER[HTTP_REFERER]");

没有单引号。这是访问和连接数组值的最快方法,无需额外的连接代码。

【讨论】:

【参考方案6】:

你可以简单地使用

if(isset($_SERVER['HTTP_REFERER']))
    header("Location:".$_SERVER['HTTP_REFERER']."");

【讨论】:

【参考方案7】:

有时发生的错误之一是,NO OUTPUT 必须在 header('Location: ' ....) 之前发生

这不起作用(显示输出,但不重定向):

if (isset($_SERVER['HTTP_REFERER'])) 
    $referer = $_SERVER['HTTP_REFERER'];
    $cleaned_url = preg_replace('/[^a-z ]+/i', '', strtolower($referer));
    $pattern = '/troester/';
    $res = preg_match($pattern, $cleaned_url);
    echo $res; // <--- OUTPUT COMES HERE
    if ($res == true) header("Location: $referer");

这是有效的(重定向正确):

if (isset($_SERVER['HTTP_REFERER'])) 
    $referer = $_SERVER['HTTP_REFERER'];
    $cleaned_url = preg_replace('/[^a-z ]+/i', '', strtolower($referer));
    $pattern = '/troester/';
    $res = preg_match($pattern, $cleaned_url);
    //echo $res; // <--- NO OUTPUT COMES HERE
    if ($res == true) header("Location: $referer");

这也是可行的,但没有意义():

if (isset($_SERVER['HTTP_REFERER'])) 
    $referer = $_SERVER['HTTP_REFERER'];
    $cleaned_url = preg_replace('/[^a-z ]+/i', '', strtolower($referer));
    $pattern = '/troester/';
    $res = preg_match($pattern, $cleaned_url);
    if ($res == true) header("Location: $referer");
    echo $res; // <--- OUTPUT COMES HERE, AFTER header('Location: ' ....)

(为了更好地理解,希望这可能会有所帮助)

【讨论】:

以上是关于为啥是我的标头(“位置:$_SERVER['HTTP_REFERER']”); PHP函数不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 WCF 删除了我的回复消息中的 wsa:To 标头?

为啥我的 REST 服务 .NET 客户端会在没有身份验证标头的情况下发送每个请求,然后使用身份验证标头重试?

为啥我的服务器会忽略来自 ajax 请求的身份验证标头?

为啥我看到多个 set-cookie 标头?

为啥我的“multipart/form-data”标头不能阻止发送预检 (OPTIONS) 请求?

为啥我的文件执行此标头两次,即使在 C 中分叉时有防护措施?