Я использую 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
значение дается как третий аргумент.
Итак, ваш паттерн фактически рассматривается как ценность. Вместо этого вам следует сделать
<If>
директива, чтобы узнать, предназначен ли ваш запрос для p12?url=
SetEnvIf
директива внутри <if>
предложение для динамической установки некоторой настраиваемой переменной среды на желаемое значение в конце (предположим, что это: 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>