4

我在知乎上发现了这个问题,不知道怎么解决

设想 -

用户在 one.php 上并单击指向 two.php 的链接

Two.php 将标头重定向到 three.php

如果我们检查 three.php 上的引用 URL,$_SERVER 显示 one.php 而不是 two.php

我们如何发现 two.php 是一个进行标头重定向的中间页面?

请注意,我不能对 one.php 或 two.php 做任何可以包含任何参数的事情,比如重定向中包含的 two.php

4

4 回答 4

3

使用会话保存记录

您可以将堆栈保存在会话变量中。只需保持不移动值到$_SESSION["history"],当集合增长到一定大小时,从数组末尾删除项目。

例如:

// Need to do this if we wish to store data
session_start();

// Set the history array if it doesn't exist
isset( $_SESSION["history"] ) || $_SESSION["history"] = array();

// Push current URI onto history
array_unshift( $_SESSION["history"], $_SERVER["REQUEST_URI"] );

// Prevent history from exceeding 5 values
array_splice( $_SESSION["history"], 5 );

将其加载到所有 PHP 文件中

这需要添加到每个文件的顶部,或者添加到全局标题模板包含(如果有的话)。或者,如果你敢,你可以使用全局加载它auto_prepend_file

指定在主文件之前自动解析的文件的名称。该文件被包含,就好像它是用 require 函数调用的一样,因此使用了 include_path。-文档

检查历史

您可以通过访问显示整个历史记录$_SESSION["history"]

// Output history array
var_dump( $_SESSION["history"] );
于 2012-05-31T19:17:34.600 回答
1

因为您无权访问 one.php 或 two.php,所以这里没有变通方法。由于 two.php 提供了重定向,因此浏览器会传递引荐来源网址,屏蔽 two.php。这在 RFC 中没有指定,但它是客户端的约定。

如果您确实有访问权限,则可以在查询中传递引荐来源网址,同时仍使用 301。添加哈希或签名可用于验证 URL。

于 2012-05-31T19:31:10.657 回答
0

您可以使用会话或 cookie。您可能希望用时间标记条目,并且只考虑时间戳非常接近的条目。

于 2012-05-31T19:19:20.280 回答
-1

您可以在从 two.php 到 three.php 的重定向中使用 GET 参数。

所以在两个.php中:

header('位置:三个.php?source=two.php');

然后在three.php中检查 $_GET['source'];

于 2012-06-04T02:30:40.833 回答