Configure dinamicamente o host RequestHeader dentro da reconfiguração do mod do Apache

2

Estou usando o mod_rewrite do Apache e estou tentando definir dinamicamente o Host header com RequestHeader com base no domínio de QUERY_STRING. Como eu configuraria dinamicamente o Host ?

Dado o seguinte URL de solicitação:

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

O que eu tentei:

 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]

Eu precisaria definir dinamicamente uma variável primeiro?

    
por George 09.09.2016 / 08:06

2 respostas

1

A solução foi a seguinte

Esse regex nos permite obter toda a string de consulta, bem como apenas o domínio do host. % 1 nos recebe o parâmetro de consulta inteiro e% 2 nos leva apenas ao domínio. Exemplo de regex pode ser encontrado aqui link

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

Quando vemos p12, procuramos% 1 se a condição de reescrita for verdadeira e definimos nossa nova variável env do host.

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

Você precisa verificar se a variável new_host env existe, caso contrário você configurará seu host como nulo.

  <If "-T reqenv('new_host')">
    //Set host with new_host variable
    RequestHeader set Host %{new_host}e
  </If>
    
por 11.09.2016 / 01:29
1

Você tem a seguinte declaração:

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

Se você olhar a diretiva RequestHeader , ele diz:

For set, append, merge and add a value is given as the third argument.

Então, seu padrão está sendo considerado como o valor. Em vez disso, o que você deve fazer é

  1. Use uma diretiva <If> para ver se sua solicitação é para p12?url=
  2. Use uma diretiva SetEnvIf dentro da cláusula <if> para definir dinamicamente uma variável de ambiente personalizada para o valor que você deseja no final (suponhamos que seja: my_new_host )
  3. Adicione a instrução RequestHeader com o %{my_new_host}e como seu terceiro argumento.

Tente o seguinte:

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