由于我遇到了有关重复网站的 SEO 错误,我最近设法将所有 URL 从非 www 指向 www。
一旦我应用了 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]
我试过上面的代码,但没有成功。我是不是漏掉了什么?
答案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
如果您稍后添加其他规则,则应在重写中包含该标志。
(注意:我假设您链接到的是表单的 URL /this-is-my-page
,而不是/index.php?page=this-is-my-page
- 否则您需要更改内部链接。)