Как я понимаю, вы хотите избавиться от строки QUERY STRING и перенаправить (301 Permanent Redirect) на тот же URL-адрес, но без строки QUERY STRING.
Правило ниже будет перенаправлять КАЖДЫЙ запрос, содержащий строку запроса:
RewriteCond %{QUERY_STRING} !^$
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1? [R=301,L]
1. ?
сделает волшебство - удалит строку запроса
2. Вам крайне нужна эта строка: RewriteCond %{ENV:REDIRECT_STATUS} ^$
. Проблема в том, что он может не работать в вашей настройке Apache, и я не могу дать вам то, что именно вам нужно, чтобы он работал (он отлично работает на моем ванильном Apache v2.2.17 в Windows).
После того как произошло перезапись (внутреннее перенаправление), он переходит к следующей итерации, и Apache снова начинает сопоставлять все правила сверху, но для уже переписанного URL. Если мы не добавим вышеупомянутую строку, то mod_rewrite применит вышеупомянутое правило к переписанной форме URL, и вы получите все URL-адреса, которые будут переписаны в /index.php
без каких-либо параметров.
Если вышеприведенное не сработает, попробуйте следующий код:
# do not do anything for already existing files and folders
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .+ - [L]
RewriteCond %{QUERY_STRING} !^$
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1? [R=301,L]
С помощью правила # do not do anything for already existing files and folders
mod_rewrite прекратит переписывание после того, как URL будет переписан в формат /index.php?p1=...
.
В случае, если вышеперечисленное не будет работать вообще (лучше - в дополнение к вышеизложенному - я бы все равно предложил добавить это), используйте <link rel="canonical" href="FULL_PROPER_RUL"/>
на своей странице: