I'm using Apache mod_rewrite and I'm looking to dynamically set the Host
header with RequestHeader
based on the domain from the QUERY_STRING. How would I dynamically set the Host
?
Given the following request URL:
https://example.com/p12?url=http://nonssldomain.com/331551/1041505584.jpg?dt=032620151151
What I've tried:
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]
Would I need to dynamically set a variable first?
Решение было следующим
Это регулярное выражение позволяет нам получить всю строку запроса, а также только домен для хоста. % 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
,] добавить
,объединить
идобавить
значение задается как третье аргумент.
Итак, ваш шаблон фактически рассматривается как значение. Вместо этого вам следует
, чтобы узнать, предназначен ли ваш запрос для p12? Url =
SetEnvIf
внутри предложение
для динамической установки некоторой настраиваемой переменной среды на значение, которое вы хотите в конце (допустим, это: my_new_host
) RequestHeader
с % {my_new_host} e
в качестве третьего аргумента. Попробуйте следующее:
<If "%{QUERY_STRING} =~ m#(?:https?://)?(?:[^@\n]+@)?(?:www\.)?(?<NEW_HOST>[^:/\n]+)#">
RequestHeader set Host %{MATCH_NEW_HOST}e
</If>