Назад | Перейти на главную страницу

Использование поиска RewriteMap в RewriteCond. Возможно?

Я пробую следующее

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