Как я могу сопоставить строковые переменные запроса с mod_rewrite?

Предположим, что у меня есть URL-адреса с параметрами строки запроса, такими как:

/index.php?book=DesignPatterns&page=139
/index.php?book=Refactoring&page=285

Используя mod_rewrite, как я могу перенаправить их на URL-адреса SES, подобные этим?

/DesignPatterns/139
/Refactoring/285

Ответ 1

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 новым URL-адресом в своих индексах.