我有以下代码作为重写规则。
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]