0

我正在寻找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 在所有域之间是通用的。

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

请指教,谢谢!

4

1 回答 1

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]

编辑:

如果我有一些其他 url 而不是 home、botique 和 hairtips,那么我每次都需要写 RewriteCond 吗?我想我每次都必须写,只是向你确认

是的,您必须每次都重复该条件,或者,您可以在规则的一开始就进行传递:

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

这意味着:任何不是主机请求的东西:www.domain.comdomain.com,然后通过而不重写。然后您可以在此之后制定规则,因为只有与上述以外的主机的请求才会达到这些规则。

这就是我之前提到的“聪明”位。由于您在顶部设置了严格的条件,这可能会使您以后更改或修改规则变得很棘手。

于 2012-10-26T19:18:45.500 回答