我有一个 BigIp,它有两个入口点 HTTP 和 HTTPS,两个入口点都通过 HTTP 协议与我的 apache 服务器进行通信。
HTTPS 证书在BigIP上,并进行SSL Offloading。
问题是在我的 apache 服务器上我有一条如下的重写规则:
RewriteRule ^(/?)$ /fr.html [R=301,L]
如果我使用 https 访问我的网站,该网站会重定向到 http(这并不好)。
我可以在 apache 上强制 https 重定向,但我想通过 http 和 https 访问我的网站。
答案1
据我所知,大致有三种可行的方法。
不要在 Apache 级别进行任何 URL 重新映射,将所有此类逻辑放在 F5 上。F5 知道原始协议并将生成正确的 HTTP(S) URL。
由于您正在执行 SSL 卸载,因此您的实际 Web 服务器不知道原始请求是通过 HTTPS 还是纯 HTTP 发出的。您可以通过在
X-Forwarded-Proto
F5 上注入标头来让 Apache(以及您的所有其他应用程序)知道客户端使用的原始协议。
然后您可以进行协议感知重定向:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} https [NC]
RewriteRule ^(/?)$ https://%{HTTP_HOST}%/fr.html [R=301,L]
RewriteCond %{HTTP:X-Forwarded-Proto} !https [NC]
RewriteRule ^(/?)$ /fr.html [R=301,L]
- 利用 HTTPS 虚拟服务器的 iRule 将任何出现的绝对 URL 重写
http://www.example.com
为https://www.example.com
。
这还有一个额外的好处,当您的网站和网络应用程序包含对http://www.example.com
样式表、图像、链接和其他内容的其他绝对引用时,还可以防止出现“不安全内容”警告。
STREAM::expression { @http://<www.example.com>@https://<www.example.com>@ }
编辑:第四个选项当然是不向客户端发送 HTTP 重定向,而是简单地在 Apache 内部替换 URL,换句话说,放弃R
旗帜...
答案2
由于您正在卸载 SSL,因此通常更容易“卸载”重定向中的修复,正如@HBruijn 所说,您可以使用 iRule,但您也可以简单地使用与您的 https 虚拟服务器关联的 HTTP 配置文件上的“重定向重写”选项。
这里详细介绍了这两个选项: https://devcentral.f5.com/articles/rewriting-redirects
基本上,在您的个人资料中将“重定向重写”设置为“全部”应该可以工作