Недавно мне удалось направить все URL с неwww на www, так как у меня была SEO-ошибка, связанная с дублированием сайтов.
Как только я применил правила www, все мои URL начали показывать index.php?page=
, что выглядит не очень красиво.
Вот мои текущие .htaccess
правила:
RewriteEngine On
RewriteBase /
RewriteRule ^([-a-zA-Z0-9]+)$ index.php?page=$1
RewriteCond %{HTTP_HOST} !^www.example.com$
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
RewriteEngine On
RewriteBase /
# Removes index.php?page=$1
RewriteCond %{THE_REQUEST} ^.*/index.php?page=$1
RewriteRule ^(.*)index.php?page=$1$ https://www.example.com/$1 [R=301,L]
RewriteRule ^(.*)index$ https://www.example.com/$1 [R=301,L]
Я попробовал код выше и он не сработал. Есть ли что-то, что я упускаю?
Ваши правила составлены в неправильном порядке. Ваше внешнее перенаправление без www на www должно происходить до внутренней перезаписи, сразу после первой директивы RewriteBase
.
Как правило, «перенаправления» всегда должны выполняться до «перезаписи».
ОБНОВЛЕНИЕ: Вам нужно будет убедиться, что вы очистили кеш браузера (и все промежуточные кеши), поскольку ошибочное (постоянное) перенаправление 301 обязательно было кэшировано браузером.
В итоге ваши правила должны выглядеть так:
RewriteEngine On
RewriteBase /
# Redirect non-www to www
RewriteCond %{HTTP_HOST} !^www\.example\.com$
RewriteRule (.*) https://www.example.com/$1 [R=301,L]
# Internal rewrite for pages
RewriteRule ^([-a-zA-Z0-9]+)$ index.php?page=$1 [L]
Любые буквальные точки в регулярном выражении должны быть экранированы обратной косой чертой. И вы должны включить флаг L
при перезаписи, если вы добавите дополнительные правила позже.
(NB: я предполагаю, что вы ссылаетесь на URL-адреса формы / this-is-my-page
, а не /index.php?page=this-is-my-page
- иначе вам нужно изменить внутренние ссылки.)