我有一个可以运行HTTPS的代理下的Apache服务器。 它不发送HTTPS = on头,而是发送HTTP_X_FORWARDED_PROTO = https。
我想写一个.htaccess规则,redirect所有请求从https到http,除非URL是/ user / login。
我想到的是围绕这些线(这是一个无限循环):
RewriteCond %{HTTP:http_x_forwarded_proto} !http RewriteRule ^ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
您的redirect规则的问题可能是您复制了“http_”前缀。 这不应该是必要的。 如果您的服务器有一个反向代理(例如F5或nginx),则标题将为“X-Forwarded-Proto”或某些时间的“X-Forwarded_Proto”。 要在重写规则中引用它们,请使用%{HTTP:Name-Of-Header}(大小写不敏感)。
对于所有情况下最强大的重写,使用如下所示:
# Make sure all SSL pages for dot-com are redirected to HTTP. RewriteCond %{SERVER_PORT} 443 [OR] RewriteCond %{HTTPS} on [OR] RewriteCond %{HTTP:X-Forwarded-Proto} https [OR] RewriteCond %{HTTP:X-Forwarded_Proto} https RewriteRule (.*) http://%{HTTP_HOST}/$1 [R=301,L]
关于在RewriteCond中使用头文件的更多细节在Apache mod_rewrite文档中给出 。
我认为你的初始条件的问题是,你有!http而不是!= http。 这可以解决无限循环。
RewriteEngine On RewriteCond %{HTTP:http_x_forwarded_proto} !=http RewriteCond %{REQUEST_URI} !^/user/login.* RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
这应该采取任何不是/ user / login的https请求,并将其重写到http。 不过,我相信有一个更优雅的方式来做到这一点。 你可以去掉RewriteCond%{HTTP:http_x_forwarded_proto}!= http,例如,它可能会工作得很好,因为它应该接受任何不包含/ user / login并redirect到http的请求。