Apache2 - mod_rewrite:RequestHeader 和环境变量

Apache2 - mod_rewrite:RequestHeader 和环境变量

我尝试获取请求参数“authorization”的值并将其存储在请求的标头“Authorization”中。

第一个重写规则运行良好。在第二个重写规则中,$2 的值似乎没有存储在环境变量中。因此,请求标头“Authorization”为空。

有什么想法吗?谢谢。

<VirtualHost *:8010>
  RewriteLog "/var/apache2/logs/rewrite.log"
  RewriteLogLevel 9
  RewriteEngine On
  RewriteRule ^/(.*)&authorization=@(.*)@(.*) http://<ip>:<port>/$1&authorization=@$2@$3 [L,P]
  RewriteRule ^/(.*)&authorization=@(.*)@(.*) - [E=AUTHORIZATION:$2,NE]
  RequestHeader add "Authorization" "%{AUTHORIZATION}e"
</VirtualHost>

我需要处理几种情况,因为有时参数在路径中,有时在查询中。这取决于用户。最后一种情况失败了。AUTHORIZATION 的标头值看起来是空的。

# if the query string includes the authorization parameter
RewriteCond %{QUERY_STRING} ^(.*)authorization=@(.*)@(.*)$
# keep the value of the parameter in the AUTHORIZATION variable and redirect
RewriteRule ^/(.*) http://<ip>:<port>/ [E=AUTHORIZATION:%2,NE,L,P]
# add the value of AUTHORIZATION  in the header
RequestHeader add "Authorization" "%{AUTHORIZATION}e"

答案1

看起来您在第一个规则上获得了“L”(最后一个)标志。规则处理将在此处停止,并且不会再发生重写。我认为永远不会到达第二个规则。尝试删除“L”标志。

编辑

哦,您还设置了“P”(代理)标志。这也将在此时停止重写规则处理,并强制通过 mod_proxy 发出代理请求。

你能用一条规则完成所有事情吗,因为模式匹配是相同的。我不太确定你想要什么,但是这个可能做吧:

RewriteRule ^/(.*)&authorization=@(.*)@(.*) http://<ip>:<port>/$1&authorization=@$2@$3 [E=AUTHORIZATION:$2,NE,L,P]

更新

啊哈,我想我明白你现在想做什么了。只要你在标志中指定 [P],代理请求就会在那时发生。如果我没有看错的话,你希望将 AUTHORIZATION 变量传递给该请求,因此你需要将其放在 [P] 之前:

# if the query string includes the authorization parameter
RewriteCond %{QUERY_STRING} ^(.*)authorization=@(.*)@(.*)$
RewriteRule ^/(.*) - [E=AUTHORIZATION:%2]
# add the value of AUTHORIZATION  in the header
RequestHeader add "Authorization" "%{AUTHORIZATION}e"
# keep the value of the parameter in the AUTHORIZATION variable and redirect
RewriteRule ^/(.*) http://<ip>:<port>/ [NE,L,P]

完全没有经过测试,但应该可以做你想做的事 - 如果我理解问题正确的话。

Apache 配置更新

您是否在 httpd.conf 中为该目录设置了 AllowOverride FileInfo?如果没有,那么您将无法在 .htaccess 中使用 RequestHeader

答案2

我怀疑您无法覆盖Authorization标头,或者标头在请求过程中被破坏了。我相信您知道,Authorization:用于HTTP 基本身份验证所以很有可能是其他东西在作怪。你能使用不同名称的标头吗?

答案3

mod_rewrite您使用这个而不使用有什么原因吗mod_setenvif

http://httpd.apache.org/docs/current/mod/mod_setenvif.html#setenvif

相关内容