Назад | Перейти на главную страницу

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>

Мне нужно обработать несколько случаев, потому что иногда параметры находятся в пути, а иногда - в запросе. В зависимости от пользователя. Последний случай терпит неудачу. Значение заголовка для АВТОРИЗАЦИИ выглядит пустым.

# 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.

Можете ли вы сделать все в одном правиле, так как совпадение с образцом одинаковое. Я не совсем уверен, что вам нужно, но это мощь сделай это:

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

У вас установлен AllowOverride FileInfo для этого каталога в httpd.conf? Если нет, то вы не сможете использовать RequestHeader в .htaccess.

Есть ли причина, по которой вы используете mod_rewrite для этого, а не mod_setenvif?

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

Я подозреваю, что вы тоже не можете отменить Authorization заголовок или что он был искажен позже в процессе запроса. Как я уверен, вы знаете, Authorization: используется для Базовая аутентификация HTTP так что есть хороший шанс, что что-то еще поправляет его. Можете ли вы использовать заголовок с другим именем?