Переменная в htaccess, вопрос RewriteRule - PullRequest
2 голосов
/ 08 июля 2010

Как я могу использовать RewriteRule для доступа к переменной?

Если у меня есть:

SetEnv MY_VAR (a|b|c)

RewriteRule ^%{ENV:MY_VAR}$ index.php?s=$1 [L,QSA]

RewriteRule ^%{ENV:MY_VAR}-some-one$ index.php?s=$1 [L,QSA]

У меня есть эти примеры, но они не работают.

Позднее редактировать

Хорошо, Тим, спасибо за ответ. Допустим, у меня есть:

RewriteRule ^(skoda|bmw|mercedes)-([0-9]+)-([0-9]+)-some-think$ index.php?a=$1 [L,QSA]

RewriteRule ^some-one-(skoda|bmw|mercedes)/pag-([0-9]+)$ index.php?a=$1 [L,QSA]

RewriteRule ^a-z-(skoda|bmw|mercedes)$ index.php?a=$1 [L,QSA]

(забудьте вторую часть RewriteRule) .. Я не хочу помещать этот список везде (skoda | bmw | mercedes) Быстрее сделать переменную, чем использовать ее в правиле ...

Ответы [ 2 ]

0 голосов
/ 12 июля 2010

Я получил еще один ответ на форуме mod_rewrite от jdMorgan:

Mod_rewrite не может использовать переменную в шаблоне регулярных выражений. Директивы .htaccess не являются языком сценариев ...

Я бы порекомендовал:

RewriteCond $1<>$3 ^<>-([0-9]+)-([0-9]+)-some-think$ [OR]
RewriteCond $1<>$3 ^some-one-<>/pag-([0-9]+)$ [OR]
RewriteCond $1<>$3 ^a-z+-<>$
RewriteRule ^([^\-/]+[\-/])*(skoda|bmw|mercedes)([\-/].+)?$ index.php?a=$2 [QSA,L]

Здесь сначала оценивается шаблон RewriteRule (см. Документацию Apache mod_rewrite «Обработка правил»).

Если шаблон соответствует, то все, что предшествует "(skoda | bmw | mercedes)" в запрошенном URL-пути, помещается в локальную переменную "$ 1".

Все, что следует за "(skoda | bmw | mercedes)", помещается в локальную переменную $ 3.

Значение запрашиваемого соответствия URL-пути "(skoda | bmw | mercedes)" помещается в $ 2.

Затем каждый из RewriteConds обрабатывается для проверки того, что формат запрошенного URL-адреса без части "(skoda | bmw | mercedes)" является одним из форматов, которые должны быть приняты.

Обратите внимание, что символы <> используются только в качестве разделителя, чтобы помочь правильному и однозначному синтаксическому анализу, и не имеют специального значения, как здесь. Они просто «заменяют» строку-переменную, которую вы не хотите включать в каждую строку. Вы можете использовать любой символ или символы, которые, как вы уверены, никогда не появятся в одном из ваших URL, без предварительной кодировки URL. Я предпочитаю использовать любой из> или <или ~ себя. </p>

Обратите также внимание, что RewriteRule предполагает, что подстрока "(skoda | bmw | mercedes)" всегда будет разделяться дефисом или косой чертой, если любая другая подстрока предшествует или следует за ней. Я имею в виду два подэлемента RewriteRule, содержащие «[^ - /]» («НЕ дефис или косая черта») и «[- /]» («Совпадение с дефисом или косой чертой»). Это значительно повышает эффективность сопоставления с образцом регулярных выражений, поэтому используйте этот метод, если это возможно, вместо использования неоднозначного и неэффективного подшаблона, например ". *" (Совпадение с чем угодно, всем или ничем ").

0 голосов
/ 08 июля 2010

Вы не можете сделать это, потому что mod_rewrite не раскрывает переменные в предложениях регулярных выражений.

Вы можете использовать переменные только во входном аргументе для RewriteCond, и как результатаргумент в RewriteRule.Компиляция регулярных выражений сопряжена с дополнительными затратами (особенно если вы вынуждены делать это по запросу, как с файлами .htaccess), поэтому, если вы разрешите в них переменное содержимое, их придется перекомпилировать для каждого сравнения, чтобы обеспечить точностьза счет производительности.Поэтому кажется, что решение состояло в том, чтобы не позволить вам сделать это.

Для чего вообще вы хотели это сделать?

...