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?

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

Другие вопросы по тегам