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.
Tenho uma longa lista de caminhos no arquivo de pesquisa.
Por favor, ajude nisso.
Responder1
Descobri que você não pode ter uma variável na RewriteCond
regex, porque parece que ela só é compilada uma vez, mas não por solicitação.
Você poderia contornar isso colocando ambos ${lookup}
e %{REQUEST_URI}
em uma string de teste usando um separador (digamos uma vírgula) e depois certificando-se de que eles são iguais, por exemplo:
RewriteCond %{REQUEST_URI},/${lookup:/$1/}/$2 ^([^,]+),\1
Observe também que, para este URL de amostra fornecido http://mydomain.dom/abc/mypage.html
:
%{REQUEST_URI} = /abc/mypage.html
mas
${lookup:$1} = abc
Então %{REQUEST_URI}
nunca será igual a ${lookup:$1}
.
Para torná-los iguais quando solicitado, você deve:
- coloque
${lookup:$1}
com/
para obter/abc/
=/${lookup:$1}/
- add
$2
para obter também o arquivo solicitado:/abc/mypage.html
=/${lookup:$1}/$2
- Como sua chave é
/abc/
(e nãoabc
), você precisa codificar$1
para/
corresponder à chave:/${lookup:/$1/}/
Então finalmente você terá isso:
RewriteMap lookup "txt:/var/www/lookup.txt"
RewriteCond %{REQUEST_URI},/${lookup:/$1/}/$2 ^([^,]+),\1
RewriteRule ^/(.*)/(.*)$ /a/$1/b/$2 [R=301]
Indo http://mydomain.dom/abc/mypage.html
me dá o seguinte log:
(1) pass through /a/abc/b/mypage.html