我有一台服务器从 SSL 终止负载均衡器获取一些流量 - 在这种情况下,它以 HTTP 形式通过端口 80 进入,并且带有 a http_x_forwarded_proto
=“https”
我想要一个仅允许直接 HTTPS 流量或转发的 HTTPS 流量的 mod_rewrite 规则。
我目前有这个:
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP:http_x_forwarded_proto} != https
RewriteCond %{HTTP:http_x_forwarded_proto} != HTTPS
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
但我得到了
RewriteCond:坏标志分隔符
错误。
我需要纠正什么才能使其正常工作,这是最好的方法吗?
答案1
问题在于“!=”后面的空格:
工作版本:
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP:X-Forwarded-Proto} !https [NC]
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
棘手的……
答案2
如果您的负载均衡器在与服务器通信时始终使用 SSL,则需要省略第一个检查,因为它始终为真。(如果您在负载均衡器上卸载 SSL,则第一行始终为真,除非有人设法使用 SSL 直接访问您的服务器,在这种情况下它将为假,并且不会尝试重定向,因为X-Forwarded-Proto
会丢失。)
由于我们始终通过 SSL 在 ELB 和 Web 服务器之间进行通信,因此我使用的代码如下:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https [NC]
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]