单个目录的SSL自动检测(使用X-Forwarded-Proto)无法正常工作

时间:2015-12-14 22:35:17

标签: apache mod-rewrite ssl rewrite

我确定这是愚蠢的事情,我一直在看这个太久了。

我正在运行Apache 2.4.10

我想要一个目录强制用户进入HTTPS。在该目录之外,我希望用户被退回到标准HTTP(除非他们正在加载HTTPS页面的支持文件,例如.image,css)

这是负载均衡器的后面,负载均衡器正在处理HTTPS,所以我依赖于X-Forwarded-Proto报头,因为所有请求都以相同的协议和端口进入节点。我已经进行了双重检查,并且标题IS由LB填充,用于HTTP和HTTPS事务。

这就是我配置中的内容:

RewriteCond %{HTTP:X-Forwarded-Proto} http [NC]
RewriteCond %{REQUEST_URI} ^/secureDir/(.*) [NC]
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
RewriteCond %{HTTP:X-Forwarded-Proto} https [NC]
RewriteCond %{REQUEST_URI} !^/secureDir/(.*) [NC]
RewriteCond %{REQUEST_URI} !^.*\.(gif|jpg|png|swf|css|js) [NC]
RewriteRule .* http://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

这就是我想要的,以及我认为应该发生的事情。 如果请求是通过HTTP传入的,则请求是针对" / secureDir /"中的资源。 - 请求将被退回到HTTPS(在相同的REQUEST_URI)。 如果请求是通过HTTPS传入的,请求不在" / secureDir /"它会被反弹到HTTP(除非它只是gif | jpg |等的请求)。

如果用户进出secureDir目录,这应该可以在HTTPS和HTTP之间无缝地移动用户......但它不是。

如果我点击secureDir目录,它不会自动将我置于HTTPS中。如果我手动请求为HTTPS,它将通过请求。如果我离开secureDir目录,它会自动将我带回HTTP。因此,似乎第二组重写条件正在捕捉,但不是第一组。

我也试过交替条件来寻找逆(!http,!https - 但我似乎只得到一个捕获)

有关我忽略的内容的任何见解?

1 个答案:

答案 0 :(得分:0)

发现错误。之前有几行无法重写,所以它将这些条件附加到该组的第一组条件中。

对于其他可能尝试做类似事情的人 - 我改变的唯一另一件事就是将X-Forwarded-Proto的“http”匹配更改为“^ http $”以确保它不贪婪(因为我得到了一些'无限重定向'条件,如果我没有)