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