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

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

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

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

/DesignPatterns/139
/Refactoring/285

46
задан Patrick McElhaney 5 October 2015 в 12:27
поделиться

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] делают две вещи:

  1. L гарантирует, что никакие другие правила, которые в противном случае могли бы совпасть, не будут обработаны (другими словами, это "последнее" правило).
  2. R=301 заставляет сервер отправить ответ перенаправления. Вместо переписывания он говорит клиенту повторить попытку с новым URL. =301 делает это постоянным перенаправлением, чтобы, помимо прочего, поисковые системы знали, что нужно заменить старый URL на новый в своих индексах.
103
ответ дан 26 November 2019 в 20:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: