我在知乎上发现了这个问题,不知道怎么解决
设想 -
用户在 one.php 上并单击指向 two.php 的链接
Two.php 将标头重定向到 three.php
如果我们检查 three.php 上的引用 URL,$_SERVER 显示 one.php 而不是 two.php
我们如何发现 two.php 是一个进行标头重定向的中间页面?
请注意,我不能对 one.php 或 two.php 做任何可以包含任何参数的事情,比如重定向中包含的 two.php
我在知乎上发现了这个问题,不知道怎么解决
设想 -
用户在 one.php 上并单击指向 two.php 的链接
Two.php 将标头重定向到 three.php
如果我们检查 three.php 上的引用 URL,$_SERVER 显示 one.php 而不是 two.php
我们如何发现 two.php 是一个进行标头重定向的中间页面?
请注意,我不能对 one.php 或 two.php 做任何可以包含任何参数的事情,比如重定向中包含的 two.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 );
这需要添加到每个文件的顶部,或者添加到全局标题模板包含(如果有的话)。或者,如果你敢,你可以使用全局加载它auto_prepend_file
:
指定在主文件之前自动解析的文件的名称。该文件被包含,就好像它是用 require 函数调用的一样,因此使用了 include_path。-文档
您可以通过访问显示整个历史记录$_SESSION["history"]
:
// Output history array
var_dump( $_SESSION["history"] );
因为您无权访问 one.php 或 two.php,所以这里没有变通方法。由于 two.php 提供了重定向,因此浏览器会传递引荐来源网址,屏蔽 two.php。这在 RFC 中没有指定,但它是客户端的约定。
如果您确实有访问权限,则可以在查询中传递引荐来源网址,同时仍使用 301。添加哈希或签名可用于验证 URL。
您可以使用会话或 cookie。您可能希望用时间标记条目,并且只考虑时间戳非常接近的条目。
您可以在从 two.php 到 three.php 的重定向中使用 GET 参数。
所以在两个.php中:
header('位置:三个.php?source=two.php');
然后在three.php中检查 $_GET['source'];