【问题标题】:htaccess rewriteCond using custom http headerhtaccess rewriteCond 使用自定义 http 标头
【发布时间】: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


【解决方案1】:

当同时监听 http 和 https 端口的 nginx 将流量转发到本地 apache 实例时,我遇到了类似的问题。

在我添加的nginx配置中:

proxy_set_header X-Request-Protocol $scheme; #http or https

在 .htaccess 文件中我添加了这个:

RewriteEngine On
RewriteCond %{HTTP:X-Request-Protocol} ^http$
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L]

【讨论】:

  • 请注意,这不会使用查询字符串进行重定向
  • 您可以在最后一行的 L 之后附加 QSA。
【解决方案2】:

您设置“IS-HTTPS”并检查“IS_HTTPS”?

【讨论】:

    猜你喜欢
    • 2011-04-27
    • 2012-02-24
    • 2012-01-17
    • 2012-09-22
    • 2010-10-09
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多