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


9

我有一台服务器从SSL终止负载均衡器获取一些流量-在这种情况下,它以HTTP的形式通过端口80传入,并带有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:错误的标志分隔符

错误。

我需要纠正什么才能使它正常工作,这是最好的方法吗?

Answers:


16

问题是“!=”之后的空格:

工作版本:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP:X-Forwarded-Proto} !https [NC]
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

棘手的...


我不确定如果卸载了SSL,是否会设置HTTPS变量。无论如何,在没有第一次测试的情况下,这仍然可以正常工作。
wurtel

1

如果您的负载均衡器在与服务器进行通信时始终使用SSL,则由于它始终为真,因此需要省略第一项检查。(如果要在负载均衡器上卸载SSL,则第一行始终为true,除非有人设法使用SSL直接命中您的服务器,在这种情况下,它将为false,并且由于X-Forwarded-Proto丢失而不会尝试重定向。)

我使用的代码是因为我们始终在ELB和Web服务器之间通过SSL进行通信:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https [NC]
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.