При изменении на WWW все URL, показывающие index.php?page=, как удалить index.php?page=?

Недавно мне удалось направить все 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]

Я попробовал код выше и он не сработал. Есть ли что-то, что я упускаю?

3
задан 7 June 2021 в 20:41
1 ответ

Ваши правила составлены в неправильном порядке. Ваше внешнее перенаправление без 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 - иначе вам нужно изменить внутренние ссылки.)

0
ответ дан 28 July 2021 в 11:58

Теги

Похожие вопросы