Как я могу сопоставить строковые переменные запроса с mod_rewrite? - PullRequest
45 голосов
/ 12 февраля 2010

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

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

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

/DesignPatterns/139
/Refactoring/285

1 Ответ

100 голосов
/ 12 февраля 2010
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 на новый URL в своих индексах.
...