Apache DirectorySlash 将 HTTPS 请求重定向回 HTTP

Apache DirectorySlash 将 HTTPS 请求重定向回 HTTP

用户请求: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将按预期进行。

相关内容