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