Apache2 - mod_rewrite: RequestHeader и переменные среды
Я пытаюсь получить значение параметра запроса "авторизация" и сохранить его в заголовке "Авторизация" запроса.
Первое правило перезаписи работает нормально. Во втором правиле перезаписи значение $2, похоже, не сохраняется в переменной environement. Как следствие, заголовок запроса "Авторизация" пуст.
Любая идея? Благодарю.
<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"
3 ответа
Похоже, у вас есть флаг '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 Config
У вас есть AllowOverride FileInfo для этого каталога в httpd.conf? Если нет, то вы не сможете использовать RequestHeader в.htaccess
Я подозреваю, что вы либо не можете отменить Authorization
заголовок или что он искажен позже в процессе запроса. Как я уверен, вы знаете, Authorization:
используется для базовой аутентификации HTTP, поэтому есть большая вероятность, что что-то еще мешает. Можете ли вы использовать заголовок с другим именем?
Есть ли причина, по которой вы используете mod_rewrite
для этого и нет mod_setenvif
?