【发布时间】:2014-07-10 08:07:33
【问题描述】:
这方面有一千个线程,但我一定错过了一些东西,因为我无法让它工作。
我的 nginx 负载平衡器解密 SSL 流量并将其(通过 Varnish)代理到内容服务器。它为代理请求添加了一个自定义标头:
proxy_set_header "IS-HTTPS" "1";
我可以从内容服务器看到这个 HTTP 标头:
<?php
var_dump($_SERVER["HTTP_IS_HTTPS"]);
?>
这将在 HTTPS 连接上输出 string(1) "1",在 HTTP 连接上输出 NULL。
所以,我的 .htaccess 规则:
RewriteCond %{HTTP:IS_HTTPS} !="1"
RewriteRule ^(securebit.*)$ https:// %{HTTP_HOST}/$1 [R=301,L]
不起作用。只是进入重定向循环。
(注意:“// %”中的空格不存在。StackOverflow 验证在上面失败了。)
也不行:
RewriteCond %{HTTP:IS_HTTPS} !=1
RewriteCond %{HTTP:IS_HTTPS} !1
RewriteCond %{HTTP:HTTP_IS_HTTPS} !="1"
RewriteCond %{HTTP:HTTP_IS_HTTPS} !=1
RewriteCond %{HTTP:HTTP_IS_HTTPS} !1
我犯了什么简单、明显和令人沮丧的错误?
【问题讨论】:
-
首先,此
!=在RewriteCond中无效,请改用否定模式。同样%{HTTP:header}表示真正的HTTP 标头,例如主机%{HTTP:Host}。 -
感谢您的回复。澄清一下:首先,我指的是wiki.apache.org/httpd/RewriteCond 的文档,这似乎表明
!=是一个有效的条件运算符。其次,proxy_set_header 确实设置了一个真正的 HTTP 标头。 -
啊。官方文档不错。那么,“不等于 1”因此会写成
RewriteCond %{HTTP:TCW_HTTPS} !^1$吗?因为这似乎也不起作用。 -
通过将所有变量作为脚本参数传递来检查所有变量是否正确定义。
标签: apache .htaccess mod-rewrite redirect