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

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

RewriteMap lookup "txt:D:/lookup.txt"
RewriteCond %{REQUEST_URI} ^/${lookup}
RewriteRule ^/(.*)/(.*)$ /a/$1/b/$2.html [PT,L]

Я пытаюсь выдержать сравнение, если путь запроса запускается с допустимых путей или нет.

У меня есть длинный список путей в файле поиска.

Помогите на этом.

5
задан 18 May 2015 в 16:30
1 ответ

Я обнаружил, что у вас не может быть переменной в регулярном выражении 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
6
ответ дан 3 December 2019 в 01:31

Теги

Похожие вопросы