我尝试获取请求参数“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