Apache RewriteRule с RewriteMap - PullRequest
       10

Apache RewriteRule с RewriteMap

2 голосов
/ 15 декабря 2009

У меня есть RewriteMap, который выглядит так:

Guide           1
Mini-Guide      2
White Paper     3

и я включаю его в Apache через

RewriteMap legacy txt:/var/www/site/var/rewrite_map.txt

Я хочу создать RewriteRule, который позволит только значениям с левой стороны указанного RewriteMap находиться в этой позиции;

RewriteRule ^/section/downloads/(${legacy})/(.*)$ /blah.php?subsection=${legacy:%1}&title=$2

Я знаю, что могу использовать ${legacy} справа, но могу ли я использовать его слева, и если да, то как?

Ответы [ 3 ]

7 голосов
/ 15 декабря 2009

В вашем файле карты левая сторона - это ключ, а правая сторона - это значение. Когда вы создаете правило для сопоставления с картой, вы вводите ключ, и он выводит значение.

Измените RewriteRule на это:

# Put these on one line
RewriteRule ^/section/downloads/([a-zA-Z-]+)/(.*)$
            /blah.php?subsection=${legacy:$1}&title=$2

Первая группа захватывает строку во входящем URL. $ 1 в замене применяет его к названной карте. Чтобы установить значение по умолчанию, измените ${legacy:$1} на ${legacy:$1|Unknown}.

Наконец, если вы хотите, чтобы правило работало только со значениями в файле карты, добавьте RewriteCond:

RewriteCond ${legacy:$1|Unknown} !Unknown
# Put these on one line
RewriteRule ^/section/downloads/([a-zA-Z-]+)/(.*)$
            /blah.php?subsection=${legacy:$1}&title=$2

Условие говорит, что если карта не возвращает значение по умолчанию (Unknown), запустите следующее правило. В противном случае пропустите правило и продолжайте.

Apache RewriteMap

2 голосов
/ 16 марта 2013

другой вариант:

# %1 will be the subpattern number1 afterwards
RewriteCond %{REQUEST_URI} ^/section/downloads/(.*)
# check if there is no mapping for %1
RewriteCond ${legacy:%1} !^$
# if there is rewrite it
RewriteRule ^/(.*) /blah.php?subsection=${legacy:%1}&title=$2 [R]
1 голос
/ 15 декабря 2009

Вы сказали, что хотите разрешить только значения, найденные на карте. Это невозможно, если вы не укажете дополнительное ограничение в регулярном выражении для группы захвата. Там нет никакого способа сделать это с самой картой. Насколько мне известно, нет синтаксиса map.keys, который вы можете применить в левой части шаблона.

НО
Вы можете указать значение по умолчанию, если захваченное значение не найдено. Таким образом:

## all on one line
RewriteRule ^/section/downloads/([a-zA-Z-]+)/(.*)$
        /blah.php?subsection=${legacy:$1|defaultValue}&title=$2

Замените "defaultValue" на что угодно. Например, 0 (ноль) или «notfound», если данный аргумент не найден на карте.

Затем вы можете либо переписать результат этого с другим правилом, либо просто пропустить его и предоставить сообщение «404» по URL-адресу со значением по умолчанию.

Если вы решите использовать другое правило, оно будет выглядеть так:

## all on one line
RewriteRule ^/section/downloads/([a-zA-Z-]+)/(.*)$
        /blah.php?subsection=${legacy:$1|notFoundMarker}&title=$2

## This rule fires if the lookupKey was not found in the map in the prior rule.
RewriteRule ^/blah.php?subsection=notFoundMarker  /404.php   [L]
...