2015-03-13 2 views

ответ

1

Решение:

RewriteCond %{REQUEST_URI} !page.php$ 
RewriteRule ^(.+)$ /page.php?name=$1 [L] 

Пояснение:

mod_rewrite RewriteRule имеет 3 параметра:

  1. Pattern
  2. Замена
  3. Флаги

Реализован как таковой:

RewriteRule pattern substitution [flags] 

Начиная с корня сервера, введите требуемый URL-путь в параметре RewriteRule «шаблон», и желаемый путь в параметре «замещения». В этом случае:

RewriteRule ^(.+)$ /page.php?name=$1 [L] 

Если URL меняется, и вы не хотите (или не может) написать правило для каждой ситуации затем использовать регулярное выражение ^(.+)$ захватить динамическое значение и ввести его в свой замещенный путь с использованием переменной захвата RE $1. Первый набор скобок - $1, второй набор - $2 и т. Д. И скобки могут быть вложенными.

^(.+)$ Это регулярное выражение может быть прочитана как: ^ в начале строки, $ весь путь до конца строки, искать . любой символ, + один или раз и () захват, что значение в переменной.


Проблема:

Даже если у нас есть флаг [L] (последнее правило оценивается), то mod_rewrite двигатель (за кадром) Посылает недавно построенный запрос /page.php?name=somevalue назад через mod_rewrite двигатель, пока без правил выполняются или, по-видимому, изменений в запросе нет. К счастью, существует дополнительная директива по расширению условной мощности, обеспечиваемой RewriteRule, которая называется RewriteCond.

mod_rewrite RewriteCond относится к следующему происходит RewriteRule, а также имеет 3 параметра:

  1. Тест строковых
  2. Условный шаблон
  3. Флаги (факультативно)

Тест Строка может быть полученных из нескольких источников. Часто переменная сервера, относящаяся к текущему запросу, используется здесь как субъект этого условия.

Условный шаблон, опять же, текст или регулярное выражение, но имеет некоторые дополнительные специальные условия, которые могут быть оценены. Прочтите Apache online mod_rewrite documentation для подробного объяснения.

В этом случае: RewriteRule ^(.+)$ /page.php?name=$1 [L], наш недавно замещенный запрос отправляется обратно через mod_rewrite, как /page.php?name=somevalue и соответствует нашим «поймать-все» правила, поэтому наша оригинальная «SomeValue» отмирает и заменяется с нашим новым запрошенным ресурсом page.php. Чтобы наши «catch all» не смогли поймать наши запросы «page.php», давайте исключим его из правила, используя RewriteCond.

RewriteCond %{REQUEST_URI} !page.php$ 
RewriteRule ^(.+)$ /page.php?name=$1 [L] 

Этот RewriteCond можно прочитать как: %{REQUEST_URI} получить запрошенный ресурс и делает это ! НЕ $ конец с page.php. Если это условие истинно, переходите к следующему условию или правилу. Если это условие неверно, пропустите это правило и перейдите к следующему набору правил.

Смежные вопросы