强制使用负载均衡器和不使用负载均衡器的 HTTPS(.htaccess 重写)

强制使用负载均衡器和不使用负载均衡器的 HTTPS(.htaccess 重写)

我有以下代码作为重写规则。

RewriteEngine On 
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

无论有没有 SSL 终止负载均衡器,这似乎都运行良好。我的问题是:

是 2 个重写条件“ORed”和“Anded”。如果我删除它,RewriteCond %{HTTPS} off则在直接访问 Web 服务器时会出现无限重定向。(我需要它在 DNS 传播时工作)

我只是对规则感到困惑

答案1

rewritecond 应该进行或运算,因为通常一次只有一个条件为真。然而,这需要 OR 指令形式的附加语法:可以将 htaccess 中针对 301 的多个 RewriteConds 中的 rewriteRule 减少为一条规则吗?

第一个 rewritecond 检查连接使用的协议是否不是 https。如果解析为真,则将重定向到 https 发送给客户端。

第二个 rewritecond 检查 ssl 是否已终止(例如在负载均衡器中),此时 x-forwarded-proto http 标头将被注入 https 的值。如果标头值不是 https,则将重定向到 https 发送到客户端。

直接连接到服务器时删除第一个条件将导致重定向循环。

通过负载均衡器(或任何执行终止的外部节点)连接时删除第二个条件也会导致重定向循环。

我会尝试(由于我是用 iPhone,所以未经测试):

RewriteEngine On 
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

相关内容