Давайте поймем директиву RewriteRule
, которая является настоящей рабочей лошадкой для переписывания.
A RewriteRule
состоит из трех аргументов, разделенных пробелами. Аргументы:
- Шаблон: на какие входящие URL-адреса должно влиять правило;
- Подстановка: куда следует отправлять совпадающие запросы;
- [flags]: опции, влияющие на переписанный запрос.
Начнем со следующего фрагмента:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
Первая строка кода, описывающая RewriteEngine
, включена. Здесь я использую директиву RewriteCond
, которая определяет условие правила перезаписи. Используя директиву RewriteCond
, мы определили два условия здесь. Эта директива взяла переменную сервера с именем REQUEST_FILENAME
. Два приведенных выше условия указывают, что запрос не является файлом или каталогом, а затем соответствует правилу, установленному RewriteRule
. Подробнее см. по этому вопросу.
Теперь пришло время написать некоторые правила переписывания. Давайте преобразуем
www.example.com/?pr=project-abc123
// to
www.example.com/project-abc123
и переписать правило будет:
RewriteRule ^(.*)$ index.php/?pr=$1 [L]
И чтобы получить www.example.com/pr/project-abc123
, нам нужно правило, как показано ниже:
RewriteRule ^/?([a-z]+)/(.*)$ index.php/?$1=$2 [L]
// or
RewriteRule ^/?pr/(.*)$ index.php/?pr=$1 [L]
Флаг [L] указывает mod_rewrite прекратить обработку набора правил. Это означает, что если правило совпадает, дальнейшие правила обрабатываться не будут.