Ваши директивы в неправильном порядке. Ваше каноническое перенаправление должно быть до вашего внутреннего перезаписи.
Чтобы удалить параметр URL, вам нужно дополнительное перенаправление. Однако это предполагает, что все ваши внутренние URL-адреса используют канонический формат ie. /controller/methode/parameter
. (Перенаправление предназначено только для любых обратных ссылок.)
Попробуйте выполнить следующее:
RewriteEngine on
# Remove "url" parameter if requested directly
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^url=([^&])*
RewriteRule ^index\.php$ http://example.com/%1 [R=301,L]
# Canonical www to non-www redirect
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]
# Front-controller
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
Условие, которое проверяет переменную окружения REDIRECT_STATUS
, необходимо для предотвращения перезаписи l oop, поскольку мы хотим перенаправлять только прямые запросы, а не запросы, которые уже были переписаны.
Перед тестированием вам необходимо очистить кеш браузера.