Apache重写多个条件


9

我有一个网站已从旧域名(例如olddomain.com)迁移到新域名(例如newdomain.com)。

出于SEO的原因,我需要将所有网站访问量重写为新的主要域名(例如www.newdomain.com)。不幸的是,我不知道如何添加多个OR类型重写条件。似乎在所有条件下(下面的示例代码),我得到一个AND条件。

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName newdomain.com
        ServerAlias www.newdomain.com
        ServerAlias olddomain.com
        ServerAlias www.olddomain.com
        DocumentRoot /var/www/newdomain.com/www/
        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>

        ErrorLog /var/log/apache2/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        RewriteEngine on
        RewriteCond %{HTTP_HOST} ^olddomain.com [NC]
        RewriteCond %{HTTP_HOST} ^www.olddomain.com [NC]
        RewriteCond %{HTTP_HOST} ^newdomain.com [NC]
        RewriteRule ^/(.*)$ http://www.newdomain.com/$1 [R=301,NC]

        CustomLog /var/log/apache2/access.log combined
</VirtualHost>

有人可以帮我一点忙吗?任何帮助将不胜感激。

Answers:


16

尽管事实上您已经找到了为您工作的解决方案,但我仍然会发布此消息,因为您的解决方案远非最佳。

溶液#1:替换[NC]通过[NC,OR]在原始代码中的第一个2个的RewriteCond行。默认情况下,一个RewriteCond通过逻辑链接到另一个RewriteCond AND。这将指示Apache使用OR逻辑:

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

解决方案2:由于您总共只有4个域名,因此使用相反的方法会容易得多-从任何域重定向,除了正确的域名之外:

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

解决方案2是更好的解决方案,尽管如果您拥有www.newdomain.comtest.newdomain.com或类似的东西,!newdomain.com$只要老域名没有以“ thisisanoldnewdomain.com”结尾的“ newdomain.com”结尾,最好进行匹配。更重要的是,我在任何地方都找不到[OR]文档。这真的有用吗?
DerfK,2011年

@DerfK 文档 -您必须滚动很多点:“'ornext | OR'(或下一个条件),使用它可以将规则条件与局部OR而不是隐式AND组合在一起。”
LazyOne

1

刚发现此报价:

rewriteConds仅适用于其后的单个rewriteRule。

此处:http : //www.webmasterworld.com/apache/3350200.htm

这是我的工作解决方案:

    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^olddomain.com [NC]
    RewriteRule ^/(.*)$ http://www.newdomain.com/$1 [R=301,NC]

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

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

1
作为多年后访问这里的任何人的注意,上述LazyOne提出的解决方案(并为OP所接受)的优化程度要高得多,尤其是当您同时拥有两个或三个以上的条件OR时。
Doktor J
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.