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

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

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

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

Связанный контент