![当更改为 WWW 时,所有 URL 都显示 index.php?page= 如何删除 index.php?page=?](https://linux22.com/image/767269/%E5%BD%93%E6%9B%B4%E6%94%B9%E4%B8%BA%20WWW%20%E6%97%B6%EF%BC%8C%E6%89%80%E6%9C%89%20URL%20%E9%83%BD%E6%98%BE%E7%A4%BA%20index.php%3Fpage%3D%20%E5%A6%82%E4%BD%95%E5%88%A0%E9%99%A4%20index.php%3Fpage%3D%3F.png)
由于我遇到了有关重复网站的 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
- 否则您需要更改内部链接。)