Usando pesquisas RewriteMap em um RewriteCond. Possível?

5

Estou tentando o seguinte

RewriteMap lookup "txt:D:/lookup.txt"
RewriteCond %{REQUEST_URI} ^/${lookup}
RewriteRule ^/(.*)/(.*)$ /a/$1/b/$2.html [PT,L]

Estou tentando comparar se o caminho da solicitação está começando com os caminhos válidos ou não.

Eu tenho uma longa lista de caminhos no arquivo de pesquisa.

Por favor, ajude nisso.

    
por serverliving.com 18.05.2015 / 15:30

1 resposta

6

Descobri que você não pode ter uma variável no RewriteCond regex, porque parece que ela é compilada apenas uma vez, mas não por solicitação.

Você pode resolver isso colocando ${lookup} e %{REQUEST_URI} em uma string de teste usando um separador (digamos, uma vírgula) e, em seguida, verificando se são iguais, por exemplo:

RewriteCond %{REQUEST_URI},/${lookup:/$1/}/$2 ^([^,]+),

Observe também que, para esse URL de exemplo fornecido, http://mydomain.dom/abc/mypage.html :

%{REQUEST_URI} = /abc/mypage.html

mas

${lookup:$1} = abc

Portanto, %{REQUEST_URI} nunca será igual a ${lookup:$1} .

Para torná-los iguais quando solicitados, você precisa:

  • coloque ${lookup:$1} com / para obter /abc/ = /${lookup:$1}/
  • adicione $2 para obter também o arquivo solicitado: /abc/mypage.html = %código%
  • Como sua chave é /${lookup:$1}/$2 (e não /abc/ ), você precisa anexar abc com $1 para corresponder ao Código chave%

Então, finalmente você terá isso:

RewriteMap lookup "txt:/var/www/lookup.txt"
RewriteCond %{REQUEST_URI},/${lookup:/$1/}/$2 ^([^,]+),
RewriteRule ^/(.*)/(.*)$ /a/$1/b/$2 [R=301]

Ir para / me fornece o seguinte log:

(1) pass through /a/abc/b/mypage.html
    
por 19.05.2015 / 19:06