Estoy intentando lo siguiente
RewriteMap lookup "txt:D:/lookup.txt"
RewriteCond %{REQUEST_URI} ^/${lookup}
RewriteRule ^/(.*)/(.*)$ /a/$1/b/$2.html [PT,L]
Estoy tratando de comparar si la ruta de la solicitud comienza con las rutas válidas o no.
Tengo una larga lista de rutas en el archivo de búsqueda.
Por favor ayuda con esto.
Respuesta1
Descubrí que no se puede tener una variable en la RewriteCond
expresión regular, porque parece que solo se compila una vez, pero no por solicitud.
Podrías solucionar esto colocando ambos ${lookup}
y %{REQUEST_URI}
en una cadena de prueba usando un separador (digamos una coma) y luego asegurarte de que sean iguales, por ejemplo:
RewriteCond %{REQUEST_URI},/${lookup:/$1/}/$2 ^([^,]+),\1
También tenga en cuenta que, para esta URL de muestra dada http://mydomain.dom/abc/mypage.html
:
%{REQUEST_URI} = /abc/mypage.html
pero
${lookup:$1} = abc
Entonces %{REQUEST_URI}
nunca será igual a ${lookup:$1}
.
Para igualarlos cuando se soliciten, hay que:
- encerrar
${lookup:$1}
con/
para obtener/abc/
=/${lookup:$1}/
- agregar
$2
para obtener también el archivo solicitado:/abc/mypage.html
=/${lookup:$1}/$2
- Como su clave es
/abc/
(y noabc
), debe adjuntarla$1
para/
que coincida con la clave:/${lookup:/$1/}/
Entonces finalmente tendrás esto:
RewriteMap lookup "txt:/var/www/lookup.txt"
RewriteCond %{REQUEST_URI},/${lookup:/$1/}/$2 ^([^,]+),\1
RewriteRule ^/(.*)/(.*)$ /a/$1/b/$2 [R=301]
Ir a http://mydomain.dom/abc/mypage.html
me da el siguiente registro:
(1) pass through /a/abc/b/mypage.html