Я хочу mod_rewrite этот URL:URL мод переписывания
Перед:
website.altervista.org/page.php?name=value
После:
website.altervista.org/value
Я хочу mod_rewrite этот URL:URL мод переписывания
Перед:
website.altervista.org/page.php?name=value
После:
website.altervista.org/value
Решение:
RewriteCond %{REQUEST_URI} !page.php$
RewriteRule ^(.+)$ /page.php?name=$1 [L]
Пояснение:
mod_rewrite RewriteRule
имеет 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 параметра:
Тест Строка может быть полученных из нескольких источников. Часто переменная сервера, относящаяся к текущему запросу, используется здесь как субъект этого условия.
Условный шаблон, опять же, текст или регулярное выражение, но имеет некоторые дополнительные специальные условия, которые могут быть оценены. Прочтите 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
. Если это условие истинно, переходите к следующему условию или правилу. Если это условие неверно, пропустите это правило и перейдите к следующему набору правил.