当 HTTP 到 HTTPS 的重写规则位于同一个 .htaccess 文件中,且在负载均衡器上执行 SSL 终止时,重写规则工作不正常

当 HTTP 到 HTTPS 的重写规则位于同一个 .htaccess 文件中,且在负载均衡器上执行 SSL 终止时,重写规则工作不正常

我在负载均衡器后面有两台 Apache 服务器。两台服务器完全相同,它们用作多个客户网站的主机。他们要求我为所有网站启用 https 访问,并将 http 请求无条件重定向到 https(因此当有人选择搜索引擎、书签等返回的 http 链接时,会获取其 https 版本)。

由于有多个域,我需要一个多域 SSL 证书。我知道旧版浏览器上的 SNI 可能会出现问题,因此我决定在负载均衡器上安装证书并让它执行终止。鉴于 SSL 终止是在负载均衡器上执行的,因此负载均衡器和服务器之间的所有流量都是未加密的。

因此,对于任何网站(例如 www.example.com)的 http 和 https 流量,我只有一个虚拟主机,因为所有流量都通过端口 80 进行:

<VirtualHost *:80>
    DocumentRoot "/var/www/html/website001"
    ServerName www.example.com
</VirtualHost>

www.example.com 网站的内容物理位于 /var/www/html/website001 文件夹中:

Folder1
Folder2
file1.html
file2.html
index.html
.htaccess
...

/var/www/html/website001/.htaccess 的内容为:

RewriteEngine on

#First block of rules
RequestHeader set X-Forwarded-Proto "http"
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

#Second block of rules
RewriteRule ^First-file$ /file1.html
RewriteRule ^Second-file$ /file2.html

第一组规则应该对每个页面进行从 http 到 https 的无条件重定向,而第二组规则应该为 file1.html 和 file2.html 提供用户友好的 URL。因此,请求

http://www.example.com/First-file 

应重写为

https://www.example.com/First-file

并且 file1.html 应该在浏览器中打开。不幸的是,第二条规则只起到了部分作用:它打开了 file1.html,但它不会重写显示的 URL,如下所示

https://www.example.com/file1.html 

当第一块规则被删除或注释掉时,第二块规则可以正常工作。

有人知道如何解决这个问题吗?

答案1

我实际上已经解决了这个问题。正如 MrWhite 间接建议的那样,我删除了

RequestHeader set X-Forwarded-Proto "http"

来自 .htaccess 文件。然而,它没有起作用,但根据我在网上读到的一篇很棒的短文(https://bharatikunal.wordpress.com/2010/12/03/howto-forcing-traffic-to-https/), 我放

RequestHeader set X-Forwarded-Proto "https"

在 /etc/httpd/conf.d/ssl.conf 文件的默认 VirtualHost 中,一切都开始按预期工作。

相关内容