我尝试获取请求参数“授权”的值并将其存储在请求的标题“授权”中。
第一个重写规则工作正常。在第二个重写规则中,$2 的值似乎没有存储在环境变量中。因此,请求标头“授权”为空。
任何想法 ?谢谢。
<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"
看起来你在第一条规则上有'L'(最后一个)标志。规则处理将在那里停止,不再发生重写。我认为永远不会达到第二条规则。尝试删除“L”标志。
编辑
哦,你也设置了“P”(代理)标志。这也将在此时停止重写规则处理并通过 mod_proxy 强制代理请求。
您可以在一个规则中完成所有操作,因为模式匹配是相同的。我不完全确定你在追求什么,但这可能会做到:
更新
啊哈,我想我明白你现在要做什么了。只要您在标志中指定 [P],代理请求就会在此时发生。如果我正确阅读了问题,您希望将 AUTHORIZATION var 传递给该请求,因此您需要将其放在 [P] 之前:
完全未经测试,但应该做你想做的 - 如果我正确理解这个问题。
Apache 配置更新
您是否在 httpd.conf 中为该目录设置了 AllowOverride FileInfo?如果没有,那么您将无法在 .htaccess 中使用 RequestHeader
我怀疑您要么无法覆盖
Authorization
标头,要么它在请求过程的后期被破坏。我相信您知道,Authorization:
它用于HTTP 基本身份验证,因此很有可能其他东西在欺骗它。您可以使用不同名称的标题吗?你有没有理由使用
mod_rewrite
这个而不是mod_setenvif
?http://httpd.apache.org/docs/current/mod/mod_setenvif.html#setenvif