重定向到页面并发送自定义 HTTP 标头

Posted

技术标签:

【中文标题】重定向到页面并发送自定义 HTTP 标头【英文标题】:Redirect to page and send custom HTTP headers 【发布时间】:2011-11-26 20:40:59 【问题描述】:

我使用以下代码重定向到 php 中的页面。我需要设置一个自定义 HTTP 标头以与重定向一起传递。

header("Location: http://...");

我该如何存档?

【问题讨论】:

多个header调用。 我尝试在重定向前后添加它,然后我在 Firefox 上使用 HttpFox,但发现 HTTP 标头没有被发送。 您是否尝试通过重定向发送数据?为什么不使用 php 会话? 【参考方案1】:

恐怕所有的答案都是错误和误导的!

无论您使用什么语言或框架,都无法重定向到设置了自定义标题的页面。换句话说,没有办法触发 HTTP 重定向并导致客户端(浏览器)添加自定义标头。

您可能认为使用多个header() 调用应该可以正常工作。但它不会。您正在为指示浏览器重定向的响应设置自定义标头,而不是为重定向本身。

网站指示浏览器发出带有自定义标头的 HTTP 请求的唯一方法是使用 javascriptXMLHttpRequest 对象。并且它需要在目标服务器上实现 CORS 以允许此类 ajax 请求。

请注意,页面不能设置 HTTP 请求标头,除非它使用 XMLHttpRequest 发出异步请求。这意味着您也不能在客户端使用自定义标头进行此类重定向。

【讨论】:

【参考方案2】:

只需在此之后或之前添加额外的header() 调用。

header("Location: http://...");
header("Content-Type: text/plain");

【讨论】:

header("Location: http://..."); 将在第二行运行之前重定向。 不可能 @genesis 不见了?在哪里??一切都好吗?【参考方案3】:

这个问题需要以不同的方式回答,因为取决于你在哪里寻找答案是不同的:

重定向响应 (PHP)

就您所关心的重定向响应(而不是可能由重定向响应触发的请求)而言

多个headerDocs 调用:

header("Location: ....");
header("Header2: ....");
header("Header3: ....");
...

由重定向响应(浏览器、HTTP 客户端)触发的新请求

如果您正在寻找由重定向响应触发的新请求,请查阅您的 HTTP 客户端技术文档以了解您的选择。

通常 HTTP 客户端不提供任何此类选项,大多数 HTTP 客户端不会将响应标头转换为请求标头,以防响应标头之一是 Location: 标头。

这无论如何都没有任何意义,因为这样的做法是不安全的。

尤其是在交互式 HTTP 客户端(如浏览器)级别上,无需用户批准即可自动执行重定向。


延伸阅读:https://ec.haxx.se/http/http-redirects

【讨论】:

什么对你不起作用?请发布您的代码。我猜不出你做错了什么。 header("VIA: maga"); header("X_MSISDN: +27000000000"); header("X_UP_CALLING_LINE_ID: +27000000000"); header("位置:url"); 您需要在 Firefox 中禁用自动重定向才能实际查看发送了哪些响应标头。如果您不这样做,Firefox 将对 Location 标头中给出的 URI 进行第二次请求,这是另一回事。您可以通过注释掉 Location 标头来暂时禁用自动重定向,或者您可以通过安装一个小插件来禁用它:NoRedirect 1.2.4 Toolpress Strict Edition (Firefox Add-On) 它不起作用,因为您无法为重定向设置自定义 HTTP 标头。从来没有! @hakre:我不知道我当时说了什么以及这些事情是如何运作的 ? 但我相信你说得有道理。

以上是关于重定向到页面并发送自定义 HTTP 标头的主要内容,如果未能解决你的问题,请参考以下文章

无法在发送 HTTP 标头之后进行重定向

使用自定义标头重定向到外部站点 - AngularJS/OAuth

Tomcat 未重定向到 400 bad request 自定义错误页面

Spring Security:如果身份验证失败,则重定向到登录页面

获取 API、自定义请求标头、CORS 和跨域重定向

如何从 C# 控制器重定向到 URL(带有自定义标头)