用户请求:https://www.example.com/test
HTTPS requests --> AWS ELB HTTPS Listener --> Apache HTTP
Apache 获取http://www.example.com/test
http://www.example.com/test/
由于 DirectorySlash,Apache 将其重定向到在默认情况下。
用户最终收到一个 HTTP 请求:http://www.example.com/test/
AWS 提供了 HEAD 来检测原始请求协议:%{HTTP:X-Forwarded-Proto}
,但是我如何告诉 Apache mod_dir DirectorySlash 使用该 Header?
请提供针对这种情况的解决方案或解决方法。
答案1
由于重写将在 DirectorySlash 之前启动,因此最终结果如下,并且有效:
# Redirect to HTTPS before Apache mod_dir DirectorySlash redirect to HTTP
RewriteCond %{HTTP:X-Forwarded-Proto} =https
RewriteCond %{LA-U:REQUEST_FILENAME} -d
RewriteRule ^/(.*[^/])$ https://%{HTTP_HOST}/$1/ [R=301,L,QSA]
答案2
尝试使用此规则,该规则将在 DirecorySlash 生效之前生效
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [NE,R=301,L]
答案3
正如相关DirectorySlash 错误报告ServerName
,另一个选择是将该计划纳入https://httpd.apache.org/docs/2.4/mod/core.html#servername
有时,服务器会在处理 SSL 的设备(例如反向代理、负载平衡器或 SSL 卸载设备)后面运行。在这种情况下,请在 ServerName 指令中指定 https:// 方案和客户端连接的端口号,以确保服务器生成正确的自引用 URL。
因此,不要:
<VirtualHost *:80>
ServerName example.com
切换到:
<VirtualHost *:80>
ServerName https://example.com
一切,包括都DirectorySlash
将按预期进行。