在 apache2 中做或重写的更简单的方法?

More simplistic way of doing OR rewrites in apache2?

是否有比下面的示例更短的方法来获取正则表达式中的域名并在重写中转发它?

现在我捕获 "every" 域并重写到 www.domain[A|B|C].com。 我也需要在每个域中捕获“*.domain[A|B|C].com”和 "domain[A|B|C].com"。

<VirtualHost *:80>
        RewriteEngine On

        #domainA.com
        RewriteCond %{http_host} ^domainA\.com$ [OR,NC]
        RewriteCond %{http_host} ^(.+)\.domainA\.com$ [NC]
        RewriteRule ^\/?(.*)$ http://www.domainA.com/ [R=301,L]

        #domainB.com
        RewriteCond %{http_host} ^domainB\.com$ [OR,NC]
        RewriteCond %{http_host} ^(.+)\.domainB\.com$ [NC]
        RewriteRule ^\/?(.*)$ http://www.domainB.com/ [R=301,L]

        #domainC.com
        RewriteCond %{http_host} ^domainC\.com$ [OR,NC]
        RewriteCond %{http_host} ^(.+)\.domainC\.com$ [NC]
        RewriteRule ^\/?(.*)$ http://www.domainC.com/ [R=301,L]

</VirtualHost>

<VirtualHost *:80>
        Servername servername.com

        ServerAlias www.domainA.com www.domainB.com www.domainC.com

        # Server config stuffz here

</VirtualHost>

如果这很模糊,我会尝试解释更多:)

--
问候福尔克

您可以一次重写 3 条规则:

    RewriteCond %{HTTP_HOST} (?:.+\.)?(domain[ABC]\.com)$ [NC]
    RewriteRule .* http://www.%1[=10=] [R=permanent,L]
  • domainA.com或*.domainA.com可以写成(?:.+\.)?domainA\.com
    • (.+\.)? 使子域部分可选
    • 最终的子域部分未被重用,因此我们可以使用非捕获子模式 ((?: ... ))
  • domainA 或 domainB 或 domainC = domain[ABC](如果是真的,它是 foo、bar 和 doe,请改用 (?:foo|bar|doe)
  • 我们可以将上次 RewriteCond 的捕获重新注入到 Rewritule。与 RewriteRule(它的第一个参数)捕获的不同之处在于它们的前缀是 % 而不是 $。所以%1会对应domainA.com或者domainB.com或者domainC.com
  • 我也将 ^\/?(.*)$ + </code> 重写为 <code>.* + [=22=]
    • 无需转义 /,这不是元字符,Apache 正则表达式没有任何定界符(不像 PHP 中的 preg_*)
    • [=22=] 是一个特殊的捕获,它采用与整个模式匹配的子字符串(路径 - 或目录上下文中的部分路径)

编辑:是的,我的错,我忘了你不在目录上下文中:%1[=22=] 之间不需要斜线,[=22= 捕获的子字符串] 已经包含 URL.

路径的前导斜杠

@julp 回答的解决方案在我的案例中是这样结束的:

<VirtualHost *:80>
        RewriteEngine On

        RewriteCond %{HTTP_HOST} (?:.+\.)?(foo\.com|bar\.com|doe\.com)$ [NC]
        RewriteRule .* http://www.%1[=10=] [R=permanent,L]

</VirtualHost>

<VirtualHost *:80>
        Servername servername.com

        ServerAlias www.foo.com www.bar.com www.foobar.com
        # Server config stuffz here

</VirtualHost>

我唯一需要做的不同的是:

RewriteRule .* http://www.%1/[=11=] [R=permanent,L] 

更改为,没有尾部斜线:

RewriteRule .* http://www.%1[=12=] [R=permanent,L]

这里有一些讨论:https://serverfault.com/questions/24130/why-do-i-get-a-double-trailing-slash-depending-on-where-my-rewriterule-is-locate