开发者社区 问答 正文

定义Location标头参数后,如何保留请求标头?

我的服务器中有一个PHP脚本,该脚本使用Location: $url标头中的条目重定向页面。

但是,请求标头未发送到$url。

我看到了用User-Agent,Connection等定义的最小标头。

假设我自定义了一些标题参数。我想在重定向后发送它们。

可能吗?我不想为此使用CURL。

展开
收起
社区秘书 2019-12-04 13:39:35 624 分享 版权
阿里云 AI 助理回答

问题描述

您在服务器上的PHP脚本利用Location: $url标头实现页面重定向,但遇到请求头信息未随重定向一起发送到新的URL $url 的问题。您希望在不使用cURL的情况下,能够携带自定义的HTTP头部信息进行重定向。

解决方案

在PHP中直接通过Location标头进行HTTP重定向时,确实无法直接携带自定义的HTTP请求头。这是因为HTTP规范中的重定向(如301、302状态码)仅告知客户端新的资源位置,并不会传递或保留原始请求的额外头部信息,除非这些信息是浏览器自动管理的(如Cookie)。

替代方案

虽然不能直接在简单的重定向中附加自定义头部,但您可以采用一种间接策略来达到目的:

  1. 临时存储机制
    • 在发起重定向前,将需要传递的自定义头部信息存储起来,可以是服务器端的会话(Session)、数据库、缓存(如Redis)或者URL参数编码。
    • 重定向用户至一个中间页面(我们称其为intermediate.php),该页面的任务是从之前存储的地方读取这些自定义头部信息。
    • intermediate.php页面再执行实际的请求到目标URL($url),并附加上从存储中恢复的自定义头部信息。这可以通过PHP的stream_context_createfile_get_contents函数实现,模拟一个带自定义头部的请求,然后输出响应内容给用户,营造出连续浏览的体验。
// intermediate.php 示例代码
session_start();
$url = $_SESSION['redirect_url']; // 假设之前已存储重定向URL
$headers = $_SESSION['custom_headers']; // 获取之前存储的自定义头部信息
unset($_SESSION['redirect_url']); // 清理会话数据
unset($_SESSION['custom_headers']);

$opts = [
    'http' => [
        'method'  => 'GET',
        'header'  => implode("\r\n", $headers), // 拼接自定义头部
    ],
];

$context = stream_context_create($opts);
$content = file_get_contents($url, false, $context);

header('Content-Type: ' . $contentType); // 根据实际情况设置响应类型
echo $content; // 输出获取的内容给用户
exit;

注意事项

  • 安全性考量:如果通过URL参数传递敏感信息,请确保对这些信息进行适当的编码和验证,以防止注入攻击。
  • 用户体验:此方法增加了额外的请求步骤,可能影响用户体验,尤其是在处理大型文件下载或高延迟场景时。
  • 资源消耗:服务器需承担额外的处理负担,特别是在大量用户同时进行重定向操作时。

结论

尽管直接在标准HTTP重定向中携带自定义头部信息不可行,但通过上述间接方法可以在一定程度上满足您的需求。请根据实际应用场景权衡利弊后选择合适的解决方案。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
PHP
问答地址: