Apache çoklu koşulları yeniden yazar


9

Eski bir etki alanı adından (ör. Eskietkialanı.com) yeni bir etki alanı adına (örneğin, yenietkialanı.com) taşınan bir web sitem var.

SEO nedenleriyle, tüm web sitesi trafiğini birincil yeni alan adına yeniden yazmam gerekiyor (örn. Www.newdomain.com). Ne yazık ki, birden çok OR tipi yeniden yazma koşullarının nasıl ekleneceğini bilmiyorum. Öyle görünüyor ki tüm koşullar, aşağıdaki örnek kod ile bir AND koşulu olsun.

<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>

Birisi bana biraz yardım edebilir mi? Herhangi bir yardım büyük mutluluk duyacağız.

Yanıtlar:


16

Zaten sizin için bir çözüm bulmuş olmanıza rağmen, sizinkini optimal olmaktan çok uzak olduğu için bunu hala göndereceğim .

Çözüm 1. : Değiştir [NC]tarafından [NC,OR]orijinal kodunun ilk 2 RewriteCond'ın hatlarında. Varsayılan olarak bir RewriteCond başka bir RewriteCond öğesine mantıksal olarak bağlanmıştır AND. Bu Apache'ye ORmantık kullanma talimatı verecektir :

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. Çözüm : Toplamda yalnızca 4 alan adınız olduğundan, karşıt yaklaşımı kullanmak çok daha kolay olacaktır - doğru olan dışında HERHANGİ bir alandan yeniden yönlendir:

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

Elinizdeki eğer olsa 2. Çözüm, daha iyi biridir www.newdomain.comve test.newdomain.comya buna benzer bir şey, karşı maç için daha iyi olabilir !newdomain.com$"thisisanoldnewdomain.com" gibi "newdomain.com" uzun eski alan sona ermedi gibi. Daha çok # 1 ile, hiçbir yerde belgelenmiş [VEYA] bulamıyorum. Gerçekten işe yarıyor mu?
DerfK

@DerfK dokümanlar - biraz kaydırma yapmanız gerekiyor: "'ornext | OR' (veya sonraki koşul) Kural koşullarını örtük AND yerine yerel bir OR ile birleştirmek için bunu kullanın."
LazyOne

1

Bu alıntıyı yeni buldum:

rewriteConds yalnızca onları izleyen tek rewriteRule için geçerlidir.

burada: http://www.webmasterworld.com/apache/3350200.htm

İşte benim için çalışma çözümü:

    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
Yıllar sonra burada ziyaret eden herkese not olarak, yukarıda LazyOne tarafından önerilen (ve OP tarafından kabul edilen) çözüm, özellikle ORbirlikte iki veya üçten fazla koşulunuz varsa, çok daha optimize edilmiştir .
Doktor J
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.