Dynamically set RequestHeader host within Apache mod rewrite

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?

2
задан 9 September 2016 в 15:17
2 ответа

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

Это регулярное выражение позволяет нам получить всю строку запроса, а также только домен для хоста. % 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>
1
ответ дан 3 December 2019 в 11:31

У вас есть следующий оператор:

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

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

Для set , ] добавить , объединить и добавить значение задается как третье аргумент.

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

  1. использовать директиву , чтобы узнать, предназначен ли ваш запрос для p12? Url =
  2. Используйте директиву SetEnvIf внутри предложение для динамической установки некоторой настраиваемой переменной среды на значение, которое вы хотите в конце (допустим, это: 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>
1
ответ дан 3 December 2019 в 11:31

Теги

Похожие вопросы