【问题标题】:Missing HTTP Referrer info on IE/FF (works well on Chrome/Safari)在 IE/FF 上缺少 HTTP Referrer 信息(在 Chrome/Safari 上运行良好)
【发布时间】:2014-11-25 23:26:00
【问题描述】:

我有page1.php这个代码:

<form action="/redirect.php" method="POST" target="_blank">
<input name="destination" type="hidden" value="a"/>
<input type="submit" value="Click here"></form>

这是redirect.php:

<?php

$url = "http://www.default.com"; 

if(isset($_POST['destination'])){

    switch ($_POST['destination']) {

    case "a":
        $url = "http://www.domain1.com";
        break;

    case "b":
        $url = "http://www.domain2.com";
        break;

    default:
        $url = "http://www.default.com";
    }
}

header( "refresh:1;url=$url" );

?>  
<!doctype html>
<html>
<head>
</head>
<body>
<div>Redirecting, Please wait</div>
</body>
</html>

我以这种方式创建了重定向页面,因为对我来说重要的是它会加载并显示某些内容,而不是立即重定向(因此,它会生成 200 代码,而不是 302 代码)。

但是,仅在 Chrome 和 Safari 上,重定向的标头包含有关引用 url 的信息,即 redirect.php,因此,例如,domain1.com 的所有者将知道访问者来自 @987654328 @。

但在 IE 和 FF 上,标头中的引用者为空。是什么导致了这种不同的行为,我该如何解决它以让它们也携带相同的推荐人信息?

【问题讨论】:

  • 在这种情况下,我认为autosubmitted forms 将是您的最佳选择。我还没有测试过,但我不是浏览器不发送referer的原因。
  • @machineaddict 您建议将自动提交表单放在哪里?在redirect.phppage1.php 上?我真的不明白这如何解决问题......而且我不希望 URL 地址出现在任何页面的正文中。

标签: php http firefox redirect http-headers


【解决方案1】:

你可以试试:

header("Location: ".$url."");

【讨论】:

  • 使用 location 会将页面变成 302 重定向,因此会阻止加载其内容,这对我来说至关重要。
  • 也许在这里你可以找到一些有用的东西stackoverflow.com/questions/14660818/…
  • 嗨,这可能很好地解决了问题......但如果你能编辑你的答案并提供一些关于它的工作原理和原因的解释会很好:)不要忘记 - 那里在 Stack Overflow 上是一堆新手,他们可以从你的专业知识中学到一两件事——对你来说显而易见的事情对他们来说可能不是。
  • @gfcodix 我不拥有访问者被重定向到的域,所以只有该帖子中的“作弊”选项可能是相关的,但是我并没有真正理解这个答案,因为例如,它没有说明 detect_referal.php 应该包含什么。还有那个问题是关于 302 重定向(使用 Location),而我的是用 200 代码刷新,所以不确定它是否能正常工作。
【解决方案2】:

工作示例(在 FF 27.0.1 上试用):

文件page1.php

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Starting page</title>
</head>
<body>
<form action="redirect.php" method="post">
    <input type="hidden" name="destination" value="a">
    <input type="submit" value="Click here">
</form>
</body>
</html>

文件redirect.php

<?php

$url = "http://www.default.com"; 

if(isset($_POST['destination'])){

    switch ($_POST['destination']) {

    case "a":
        $url = "http://www.domain.com";
        break;

    case "b":
        $url = "http://www.examples.com";
        break;

    default:
        $url = "http://www.example.com";
    }
}

?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Landing page</title>
</head>
<body>
<div>Redirecting, Please wait</div>
<script>
window.onload = function() {
    setTimeout(function(){
        window.location = '<?php echo $url;?>';
    }, 4000);
};
</script>
</body>
</html>

工作原理:点击page1.php上的按钮Click here后,发送帖子数据并选择域http://www.domain.com。使用 javascript,在窗口加载 4 秒后,浏览器会将用户重定向到 http://www.domain.com。我看过Firebug 中的referer 标头,它们已被发送。

【讨论】:

  • 谢谢,我没有在原始问题中提到它,但我更喜欢目标 URL 只出现在 HTTP 请求中的方式(就像现在发生的那样,随着元刷新)和不在文档正文中(例如在使用 javascript 重定向的情况下)
  • 如果你喜欢的东西不起作用,你就反过来做。生活中的许多事情并没有按照你喜欢的方式运作,但你仍然必须这样做;)
【解决方案3】:

困惑。重定向和页面刷新并不相同。还有更多 - 并非所有浏览器都支持刷新标头。

【讨论】:

  • 您的回复应该是评论,而不是答案。
  • 此重定向不适用于所有浏览器。流行,不流行。重要吗?
  • @gfcodix 为什么我的回答没有回答?
  • @deep 因为问题是关于如何让 FF/IE 发送相同的推荐人信息。这与此重定向方法是否是最佳做法无关。
  • @deep 因为它更像是一条评论。您认为这样的答案会被选为正确答案吗?顺便说一句,我做出这个解释是为了不损害您的 stackoverflow 配置文件,欢迎您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
相关资源
最近更新 更多