将非 www 重定向到 www.,并将所有内容重写为 /

将非 www 重定向到 www.,并将所有内容重写为 /

我想将所有到 example.com 的流量重定向到 www.example.com,然后将所有内容重写为 /。

因此,如果访客出于某种原因点击http://example.com/foo/bar我想将他们重定向到http://www.example.com/foo/bar然后将该请求重写为 /index.php

这是我目前所得到的(非 www 到 www 的重定向有效):

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

RewriteCond %{HTTP_HOST} !^www\.example\.com [NC,OR]
RewriteCond %{HTTP_HOST} ^11\.22\.33\.44
RewriteRule (.*) http://www.example.com$1 [R=301,L]

编辑:

好的,我已经可以开始处理这个了:

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

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ /index.php [NC,L]

但最奇怪的是:Apache 做了一些奇怪的事情http://www.example.com/home-- 就像 apache 对此路径有一些内部路由一样,因为它绕过了我的 vhost 配置并发送了自己的 404。而且/home我的文档根目录中没有任何内容,所以 -s/-d/-l 应该无关紧要。此外,我已经 grep:ed for home in,/etc/apache2没有任何结果。

任何人?

更新:

我在 apache 错误日志中看到这个:[Fri Mar 25 04:33:45 2011] [error] [client 123.123.123.123] File does not exist: /var/www/example/web/home

所以我猜测该请求到达了我的虚拟主机但未被我的规则捕获?

更新 2:

这很奇怪。如果我删除此行,对 的RewriteRule ^.*$ - [NC,L]请求就会/home通过。但只有对 的请求/home

相反,我最终得到了以下有效的配置:

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

<Location />
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule !\.(js|ico|gif|jpg|png|css|txt)$ /index.php
</Location>

答案1

添加

RewriteRule ^(.+)$ index.php [L,QSA]

相关内容