Apache 上的重定向(维护 POST 参数)
Posted
技术标签:
【中文标题】Apache 上的重定向(维护 POST 参数)【英文标题】:Redirection on Apache (Maintain POST params) 【发布时间】:2013-06-22 02:49:01 【问题描述】:我的服务器上安装了 Apache,我需要从 http 重定向到 https。原因是我们的负载均衡器解决方案无法处理 https,因此请求通过 http 进入,然后我们使用 httpd.conf 文件中的以下行将它们传输到 https。
<VirtualHost 10.1.2.91:80>
Redirect 302 /GladQE/link https://glad-test.com/GladQE/link.do
</VirtualHost>
这适用于 GET 请求,但 POST 请求将丢失通过 URL 传递的参数。执行此重定向和维护 POST 参数的最简单方法是什么?
我需要从http://glad-test.com/GladQE/link.do 到这里https://glad-test.com/GladQE/link.do 维护 POST 参数
谢谢
汤姆
【问题讨论】:
如果你的 http -> https 重定向适用于 POST 请求,请确保不要在初始的、不安全的 (http) 帖子中发送任何敏感数据!这会使用户(可能还有开发人员)陷入一种虚假的安全感,而所有数据最初都是以明文形式传输的! 【参考方案1】:您的面向公众的网站必须使用 SSL 来保护机密性,或者没有敏感数据通过它,并且您的网站不可能被用作 sslstripping 的启动板(Google 提供服务是有充分理由的通过 HTTPS 搜索结果)。
如果您没有加密浏览器和您的网站之间的流量,那么您为什么要尝试在您的负载平衡器和您的网络服务器之间加密它们呢?如果您碰巧在负载平衡器之外有 SSL 终止(一种非常愚蠢的方法),那么在负载平衡器和 Web 服务器之间使用 HTTPS 远非有效。该问题还暗示了许多其他安全问题,例如会话固定/嗅探和 SSLStripping 漏洞。
【讨论】:
【参考方案2】:标准 Apache 重定向将无法处理 POST 数据,因为它们在 URL 级别上工作。 POST 数据在请求正文中传递,如果您执行标准重定向,该正文将被丢弃。
您可以选择使用 php 脚本透明地转发 POST 请求,或者使用 Apache 的 Rewrite (mod_rewrite
) 和代理 (mod_proxy
) 模块的组合,如下所示:
RewriteEngine On
RewriteRule /proxy/(.*)$ http://www.example.com/$1 [P,L]
P
标志将请求传递给代理模块,因此任何以/proxy/
开头的 URL 路径进入您的站点(通过 GET 或 POST 无关紧要)的内容都将透明地作为代理重定向处理到http://www.example.com/
。
供参考:
http://httpd.apache.org/docs/current/mod/mod_rewrite.html http://httpd.apache.org/docs/current/mod/mod_proxy.html【讨论】:
完美,对我有用 - 为 https 执行此操作时,您需要在配置中添加 SSLProxyEngine 【参考方案3】:您可以尝试使用 HTTP 状态代码 307,RFC 兼容浏览器应该重复发布请求。 参考:http://en.wikipedia.org/wiki/List_of_HTTP_status_codes
与历史上 302 的实现方式相比,请求 重发原件时不允许更改方法 要求。例如,应该使用另一个重复 POST 请求 POST 请求。
要从 302 更改为 307,请执行以下操作:
<VirtualHost 10.1.2.91:80>
Redirect 307 /GladQE/link https://glad-test.com/GladQE/link.do
</VirtualHost>
【讨论】:
实际上,这里应该应用 HTTP Redirect 308,因为 OP 希望将后续请求发布到 HTTPS URI。 并且当前所有浏览器都不支持 HTTP 308 状态码。因此,请改用 307。来源:greenbytes.de/tech/tc/httpredirects/#t308methods @parasietje 除了并非所有浏览器都支持 308 之外,OP 目前使用的是 HTTP 302,这意味着“临时移动”,因此 308 会做一些不同的事情。 307为“临时重定向”,与302相同,但保留请求方式。 @parasietje 那个测试页现在已经过时或者一开始就错了。 MSIE11 和 Edge 14 确实支持状态 308,可以在该页面上的实时测试中看到。 @ygoe 如果您需要支持旧版浏览器,这仍然是个问题……我无法找到有关哪些版本添加了支持的信息。以上是关于Apache 上的重定向(维护 POST 参数)的主要内容,如果未能解决你的问题,请参考以下文章