如何在htaccess中结合RewriteCond

时间:2012-10-26 12:44:14

标签: .htaccess

我正在寻找If, else类型的代码,它可以根据主机/域名组合我的重写规则。因此,如果域名是“domainA”,则将a重定向到b,c重定向到d,如果域名是“domainB”,则将x重定向到y,将z重定向到p。基本上我不想一次又一次地写条件,如下所示:

我为htaccess编写了以下代码

    RewriteCond %{HTTP_HOST} ^domain\.com$ [OR]
    RewriteCond %{HTTP_HOST} ^www\.domain\.com$
    RewriteRule ^home /? [L,R=301]

    RewriteCond %{HTTP_HOST} ^domain\.com$ [OR]
    RewriteCond %{HTTP_HOST} ^www\.domain\.com$
    RewriteRule ^home-old /? [L,R=301]

在上面我使用主机,因为我有多个域指向相同的主机空间,所以htaccess在所有之间是通用的。

我可以将域的上述多个条件合并为一个,而不是一次又一次地为特定域的某些重定向编写domai名称吗?

请指教,谢谢!

1 个答案:

答案 0 :(得分:1)

在mod_rewrite中确实没有这样的if-then-else结构。你必须要聪明地遵守你的规则(这有时会使它们变得不可读或无法修改)或只是明确一切。

对于您的具体示例,您可以使用正则表达式来组合它们:

^domain\.com$^www\.domain\.com$变为^(www\.)?domain\.com$

^home^home-old仅为^home,因为第一个仅匹配URI home开头,home-old确实以home开头(没有$符号表示字符串的结尾)。所以你在看:

RewriteCond %{HTTP_HOST} ^(www\.)?domain\.com$ [NC]
RewriteRule ^home /? [L,R=301]

如果您需要使用$进行具体说明,则只需将正则表达式更改为:

RewriteRule ^home(-old)?$ /? [L,R=301]

编辑:

  

如果我有其他网址而不是家庭网站,那么我需要每次都写RewriteCond吗?我想每次只是确认一下我必须写下来

是的,你必须每次重复这个条件,或者,你可以在规则的最开始做一个直通:

RewriteCond %{HTTP_HOST} !^(www\.)?domain\.com$ [NC]
RewriteRule ^ - [L]

这意味着:任何不是主机请求的内容: www.domain.com domain.com ,然后在不重写的情况下通过。然后,您可以在此之后制定规则,因为只有具有上述以外主机的请求才能达到这些规则。

这是我之前提到的“聪明”一点。这可能会使您更改规则或稍后修改它们变得棘手,因为您在顶部设置了严格的条件。