Предположим, что у меня есть URL с параметрами строки запроса как они:
/index.php?book=DesignPatterns&page=139
/index.php?book=Refactoring&page=285
Используя mod_rewrite, как я могу перенаправить их к URL SES как они?
/DesignPatterns/139
/Refactoring/285
RewriteCond %{QUERY_STRING} book=(\w+)&page=(\d+)
RewriteRule ^index.php /%1/%2? [L,R=301]
Поскольку RewriteRule рассматривает только путь (до вопросительного знака, но не включая его), используйте RewriteCond для перехвата значений в строке запроса.
Обратите внимание, что совпадения из RewriteCond
учитываются в %1
,
%2
и т.д., а не $1
, $2
и т.д.
Также обратите внимание на ?
в конце RewriteRule
. Оно указывает mod_rewrite
не добавлять исходную строку запроса к новому URL, так что в итоге вы получите
/DesignPatterns/151
вместо
/DesignPatterns/151?book=DesignPatterns&page=151
.
Флаги [L,R=301]
делают две вещи:
L
гарантирует, что никакие другие правила, которые в противном случае могли бы совпасть, не будут обработаны (другими словами, это "последнее" правило). R=301
заставляет сервер отправить ответ перенаправления.
Вместо переписывания он говорит клиенту повторить попытку с новым
URL. =301
делает это постоянным перенаправлением, чтобы, помимо прочего, поисковые системы знали, что нужно заменить старый URL на новый в своих индексах.