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


How can I detect all the pages in a redirect with php?

我在 Quora 上找到了这个问题,但不知道如何解决它

场景--

用户在 1 上.php并单击指向 2 的链接.php

二.php标头重定向到三.php

如果我们检查三个上的引用 URL.php$_SERVER 会显示一个.php而不是两个.php

我们如何发现两个.php是一个执行标题重定向的中间页面?

请注意,我不能对一个.php或两个做任何事情.php这可以包括任何说两个的参数.php包含在重定向中

使用会话保存记录

您可以将堆栈保存在会话变量上。只需将值保持不变$_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"] );

因为您无权访问一个.php或两个.php,所以这里没有解决方法。由于 two.php 提供了重定向,因此浏览器会传递引用器,屏蔽 two.php。这在 RFC 中未指定,但这是客户端中的约定。

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

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

您可以在从

二.php重定向到三.php的重定向中使用GET参数。

所以分为两.php:

header('Location: three.php?source=two.php');

然后在三个中.php您检查 $_GET["来源"];