使用 mod_rewrite 强制使用 HTTPS,包括代理 SSL

使用 mod_rewrite 强制使用 HTTPS,包括代理 SSL

我有一台服务器从 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]

相关内容