结合两个mod_rewrite规则

时间:2010-11-22 21:56:27

标签: apache .htaccess mod-rewrite url-rewriting

我糟透了重写规则,所以..同情我> _>

我想让这两个规则一起工作..基本上我想在每次使用时删除www,然后将所有请求发送到带有GET变量的index.php,如果域后面的东西..

例如:www.example.com和www.example.com/foo将分别转到example.com和example.com/foo。

下面我要合并的内容:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^www.example.com$ [NC]
    RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]
    RewriteCond     %{REQUEST_FILENAME}     !-d
    RewriteCond     %{REQUEST_FILENAME}     !-f
    RewriteRule     (.*) index.php?token=$1 [QSA,L]
</IfModule>

我没有对此进行过测试,所以我不知道......但我非常怀疑我是否正确。

编辑:只是为了澄清,我不是说需要成为一条规则,但是它们会按预期一起工作吗?

2 个答案:

答案 0 :(得分:3)

这应该没问题,因为您的第一条规则标记为[L] Last和[R] Redirect - 因此两条规则不必同时处理。第一个将处理,重定向,清除第一个,然后第二个处理。

您可以使用[C]将条件链接在一起 - 这意味着如果第一个条件通过,则尝试下一个条件,但如果第一个条件失败则会跳过所有链接的子条件。我不认为这就是你想要的。如果有的话,你需要一个[OR]指令。

你的重写看起来不错,除了可能是最后一个,如果你将它用于CodeIgniter网站 - 通常看起来像:

RewriteRule ^(.*)$ index.php?/$1 [L]

作为最佳做法,您应该在test-subdomain.example.com上设置一个重复的网站,这样您就可以在尽可能接近实际环境的情况下摆弄这样的事情。

发表评论:如果你想通配域名,只需:

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

答案 1 :(得分:0)

通常情况下,复杂网站可以在.htaccess文件中包含数百个规则,每个规则都有自己的RewriteCond集。没有必要将它们合并为一些无所不包的规则。