如何使用php检测重定向中的所有页面?

如何使用php检测重定向中的所有页面?,php,redirect,http-headers,Php,Redirect,Http Headers,我在quora上发现了这个问题,不知道如何解决 情景-- 用户在one.php上并单击指向two.php的链接 Two.php会将头重定向到three.php 如果我们检查three.php$\服务器上的引用URL,则会显示one.php而不是two.php 我们如何发现two.php是一个中间页面,它执行了标题重定向 请注意,我无法使用one.php或two.php执行任何可以在重定向中包含表示two.php的参数的操作使用会话保存记录 可以将堆栈保存在会话变量上。只需在$\u SESSION

我在quora上发现了这个问题,不知道如何解决

情景--

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

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

如果我们检查three.php$\服务器上的引用URL,则会显示one.php而不是two.php

我们如何发现two.php是一个中间页面,它执行了标题重定向

请注意,我无法使用one.php或two.php执行任何可以在重定向中包含表示two.php的参数的操作

使用会话保存记录 可以将堆栈保存在会话变量上。只需在
$\u 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文件中 这需要添加到每个文件的顶部,或者添加到全局头模板include(如果有)。或者,如果您敢,您可以使用
auto\u prepend\u file
全局加载它:

指定在主文件之前自动分析的文件的名称。文件被包含,就好像它是用require函数调用的一样,因此使用include\u路径。-

查阅历史 您可以通过访问
$\u SESSION[“history”]
来显示整个历史记录:


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

< P>因为您不能访问ONE.PHP或Too.PHP,这里没有任何解决方案。由于two.php提供了重定向,因此浏览器会传递引用,从而屏蔽two.php。这在RFC中没有指定,但在客户端中是惯例


如果您有访问权限,您可以在查询中传递referer URL,同时仍使用301。添加散列或签名可用于验证URL。

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

因此,在two.php中:

标题('Location:three.php?source=two.php')


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

一定要先序列化。如果他不能修改那些php文件,这怎么办?@Aknosis OP说这些文件不能包含参数。并不是说他们不能触摸文件。即使考虑到限制,这项基本技术也是很有价值的。你可以在不修改脚本的情况下使用
auto_prepend_file
@JonathanSampson也许我读错了,我猜他是说他不能将位置更改为3.php?prev=1.php,对吗?quora上的问题的URL是什么?@user1125516你无法访问.php文件,或者他们共享的任何通用模板文件?我猜他不能,可能是第一页和第二页是第三方。有可能在PHP中有一种重定向历史吗?当然。如果您可以使用cookie或唯一标识符,那么使用请求URI填充数组将非常简单,请参阅@JonathanSampson了解起点。OP指定不应有任何参数指示重定向中包含two.php。
// Output history array
var_dump( $_SESSION["history"] );