21

我的服务器上安装了 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 参数

谢谢

汤姆

4

3 回答 3

32

您可以尝试使用 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>
于 2014-02-11T16:50:18.490 回答
20

标准 Apache 重定向将无法处理 POST 数据,因为它们在 URL 级别上工作。POST 数据在请求正文中传递,如果您执行标准重定向,该正文将被丢弃。

您可以选择使用 PHP 脚本透明地转发 POST 请求,或者使用 Apache 的 Rewrite ( mod_rewrite) 和 Proxy ( mod_proxy) 模块的组合,如下所示:

RewriteEngine On
RewriteRule /proxy/(.*)$ http://www.example.com/$1 [P,L]

Pflag 将请求传递给 Proxy 模块,因此任何以 a 开头的 URL 路径到达您的站点(通过 GET 或 POST 无关紧要)的内容/proxy/都将透明地作为代理重定向到http://www.example.com/.

供参考:

于 2014-02-18T16:26:38.377 回答
0

您的面向公众的网站必须使用 SSL 来保护机密性,或者没有敏感数据通过它,并且您的网站不可能被用作 sslstrip 的启动板(Google 提供搜索结果的理由非常充分) HTTPS)。

如果您不加密浏览器和站点之间的流量,那么为什么要尝试在负载均衡器和网络服务器之间加密它们?如果您碰巧在负载均衡器之外有 SSL 终止(一种非常愚蠢的方法),那么在负载均衡器和 Web 服务器之间使用 HTTPS 远非有效。该问题还暗示了许多其他安全问题,例如会话固定/嗅探和 SSLStripping 漏洞。

于 2014-02-18T16:47:49.910 回答