Как мне создать правило перезаписи, которое соответствует только запросу без строки запроса?
http://www.mysite.com/index.php
следует переназначить на:
http://www.mysite.com/
НО
http://www.mysite.com/index.php?page=some_page
Следует оставить в покое.
Я пробую это:
RewriteRule ^/index.php$ http://www.mysite.com/ [R=301,L]
... Но он соответствует всему, что начинается с /index.php, хотя я явно закончил шаблон знаком доллара.
ОБНОВИТЬ:
Единственные правила перед этим:
RewriteCond %{HTTP_HOST} ^mysite.com [NC]
RewriteRule ^/(.*) http://www.mysite.com/$1 [R=301,L]
Намерение состоит в том, чтобы перенаправить ссылки без www на версию с www.
Флаг [L] на первом наборе правил здесь:
RewriteCond %{HTTP_HOST} ^mysite.com [NC]
RewriteRule ^/(.*) http://www.mysite.com/$1 [R=301,L]
L
означает Last - Apache прекратит обработку правил для этой итерации, когда она будет достигнута.
Удалить L
флаг, и все будет в порядке.
Вот решение, которое я придумал:
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^/index.php$ / [R=301,L]
RewriteCond! % {QUERY_STRING} будет соответствовать запросам без строки запроса.
Вы также можете добавить следующее, чтобы включить ведение журнала и отладку журналов mod_rewrite RewriteLog / rewrite_log RewriteLogLevel 3
Имейте в виду, что это может замедлить работу вашего сайта и заполнить журналы, поэтому используйте его только для отладки.
Все эти перезаписи - это регулярные выражения, которые работают довольно медленно. Это должно быть немного быстрее, если вы сделаете это из index.php
:
if (!strlen($_SERVER["QUERY_STRING"])) header("Location: /");