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

Динамически установить узел RequestHeader в обновлении мода Apache

Я использую Apache mod_rewrite и хочу динамически установить Host заголовок с RequestHeader на основе домена из QUERY_STRING. Как бы мне динамически установить Host?

Учитывая следующий URL-адрес запроса:

https://example.com/p12?url=http://nonssldomain.com/331551/1041505584.jpg?dt=032620151151

Что я пробовал:

 RewriteCond %{QUERY_STRING} ^url=(.*)$ [NC]   

 #some regex to parse domain from Query_String (Doesn't work)
 RequestHeader set Host ^(?:https?:\/\/)?(?:[^@\n]+@)?(?:www\.)?([^:\/\n]+)
 RewriteRule ^.*/p12$ %1? [P,NC,L]

Нужно ли мне сначала динамически устанавливать переменную?

Решение было следующим

Это регулярное выражение позволяет нам получить всю строку запроса, а также только домен для хоста. % 1 получает нам весь параметр запроса, а% 2 получает нам только домен. Пример регулярного выражения можно найти здесь https://regex101.com/r/dC0xZ4/2

 RewriteCond %{QUERY_STRING} url=((?:https?://)?(?:[^@\n]+@)?(?:www\.)?([^:/\n]+).*) [NC]

Когда мы видим p12, мы проксируем% 1, если условие перезаписи истинно, и устанавливаем нашу новую переменную env хоста.

  RewriteRule ^.*/p12$ %1 [P,NC,L,E=new_host:%2]

Вам нужно проверить, существует ли переменная env new_host, иначе вы установите для своего хоста значение null.

  <If "-T reqenv('new_host')">
    //Set host with new_host variable
    RequestHeader set Host %{new_host}e
  </If>

У вас есть следующее заявление:

RequestHeader set Host ^(?:https?:\/\/)?(?:[^@\n]+@)?(?:www\.)?([^:\/\n]+)

Если вы посмотрите на RequestHeader директива, в ней говорится:

Для set, append, merge и add значение дается как третий аргумент.

Итак, ваш паттерн фактически рассматривается как ценность. Вместо этого вам следует сделать

  1. Используйте <If> директива, чтобы узнать, предназначен ли ваш запрос для p12?url=
  2. Использовать SetEnvIf директива внутри <if> предложение для динамической установки некоторой настраиваемой переменной среды на желаемое значение в конце (предположим, что это: my_new_host)
  3. Добавить RequestHeader заявление с %{my_new_host}e в качестве третьего аргумента.

Попробуйте следующее:

<If "%{QUERY_STRING} =~ m#(?:https?://)?(?:[^@\n]+@)?(?:www\.)?(?<NEW_HOST>[^:/\n]+)#">
    RequestHeader set Host %{MATCH_NEW_HOST}e
</If>