Я пробую следующее
RewriteMap lookup "txt:D:/lookup.txt"
RewriteCond %{REQUEST_URI} ^/${lookup}
RewriteRule ^/(.*)/(.*)$ /a/$1/b/$2.html [PT,L]
Я пытаюсь выдержать сравнение, если путь запроса запускается с допустимых путей или нет.
У меня есть длинный список путей в файле поиска.
Помогите на этом.
Я обнаружил, что у вас не может быть переменной в регулярном выражении RewriteCond
, потому что кажется, что она компилируется только один раз, но не для каждого -request.
Вы можете обойти эту проблему, поместив $ {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