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

时间:2017-02-01 00:39:36

标签: php apache .htaccess redirect mod-rewrite

我看过其他问题,但似乎都没有解决我想做的事情。目前,我的.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-not-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?

1 个答案:

答案 0 :(得分:2)

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

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文件中的匹配项
  • 稍微改变RewriteCond检查,包括重定向任何不是www.example.com而不仅仅是example.com的内容。我建议指向ww.example.com并且类似于您的网站,因此拼写错误会被重定向(在大多数情况下,我只是将* .example.com指向我的网站)。

让我知道任何问题。