Я пробую следующее
RewriteMap lookup "txt:D:/lookup.txt"
RewriteCond %{REQUEST_URI} ^/${lookup}
RewriteRule ^/(.*)/(.*)$ /a/$1/b/$2.html [PT,L]
Я пытаюсь сравнить, начинается ли путь запроса с допустимых путей или нет.
У меня длинный список путей в файле поиска.
Пожалуйста, помогите с этим.
решение1
Я обнаружил, что в регулярном выражении нельзя использовать переменную RewriteCond
, поскольку, судя по всему, она компилируется только один раз, а не для каждого запроса.
Эту проблему можно обойти, поместив оба параметра ${lookup}
и %{REQUEST_URI}
в тестовую строку, используя разделитель (например, запятую), а затем убедившись, что они равны, например:
RewriteCond %{REQUEST_URI},/${lookup:/$1/}/$2 ^([^,]+),\1
Также обратите внимание, что для данного примера URL http://mydomain.dom/abc/mypage.html
:
%{REQUEST_URI} = /abc/mypage.html
но
${lookup:$1} = abc
Поэтому %{REQUEST_URI}
никогда не будет равным ${lookup:$1}
.
Чтобы сделать их равными по запросу, вам необходимо:
- заключите
${lookup:$1}
с/
чтобы получить/abc/
=/${lookup:$1}/
- добавить
$2
, чтобы также получить запрошенный файл:/abc/mypage.html
=/${lookup:$1}/$2
- Поскольку ваш ключ есть
/abc/
(и нетabc
), вам необходимо заключить его$1
в/
соответствие с ключом:/${lookup:/$1/}/
Итак, в итоге у вас будет это:
RewriteMap lookup "txt:/var/www/lookup.txt"
RewriteCond %{REQUEST_URI},/${lookup:/$1/}/$2 ^([^,]+),\1
RewriteRule ^/(.*)/(.*)$ /a/$1/b/$2 [R=301]
Переход к http://mydomain.dom/abc/mypage.html
дает мне следующий лог:
(1) pass through /a/abc/b/mypage.html