使用htaccess文件将所有流量重定向到index.php,并将非www重定向到www



我看了其他问题,似乎没有一个能解决我想做的事情。目前,我在.htaccess文件中有以下内容,可以将所有非www流量重定向到www:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]

这很好用。无论文件是否存在,如果有人试图访问example.com或example.com/page-not-found,它都会永久重定向到www.example.com或www.example.com/page-n ot-found.

我想改变网站的运行方式,让所有请求都通过一个特定的文件(例如主目录中的index.php)进行路由。应该发生的是,如果有人转到www.example.com/any-page,它仍然会显示www.example.com/any-page,但我将在www.example.com/index.php中处理它,这样我就可以在一个文件中处理所有流量。我可以用以下方法做到这一点:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?path=$1 [NC,L,QSA]

但是,这只会在请求的文件夹不存在的情况下重定向(而且不会将example.org/any-folder更改为www.example.org/any-folder

简而言之,有没有一种方法可以通过一个文件路由所有请求,即使请求的文件存在,并对所有非www流量进行301重定向到www?

是的,有。首先保持原始规则不变(稍作修改,见下文):

RewriteEngine On
RewriteCond %{HTTP_HOST} !=www.example.com
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]

之后,添加:

RewriteCond %{HTTP_HOST} =www.example.com
RewriteRule ^(.*)$ index.php?path=$1 [QSA]

与你已经拥有的非常相似,除了:

  • 删除最后一条规则上不需要的标志
  • 在第二条规则上添加对主机的检查
  • 删除第二条规则中替换时的斜杠,该规则不是.htaccess文件中匹配项的一部分
  • 稍微更改"重写密码"检查,包括重定向任何不是www.example.com的内容,而不仅仅是example.com。我建议指向ww.example.com和类似的网站,这样拼写错误就会被重定向(就我个人而言,大多数情况下我只会将*.example.com指向我的网站)

有任何问题请告诉我。

最新更新