Apache เขียนหลายเงื่อนไข


9

ฉันมีเว็บไซต์ที่ย้ายจากชื่อโดเมนเก่า (เช่น olddomain.com) ไปยังชื่อโดเมนใหม่ (เช่น newdomain.com)

ด้วยเหตุผล SEO ฉันต้องเขียนการเข้าชมเว็บไซต์ทั้งหมดใหม่ให้กับชื่อโดเมนหลักใหม่ (เช่น www.newdomain.com) น่าเสียดายที่ฉันไม่ทราบวิธีการเพิ่มเงื่อนไขการเขียนหรือพิมพ์ซ้ำหลายครั้ง ดูเหมือนว่าด้วยเงื่อนไขทั้งหมดโค้ดตัวอย่างด้านล่างฉันได้รับและเงื่อนไข

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

ใครช่วยฉันหน่อยได้ไหม ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมอย่างมาก.

คำตอบ:


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.comและtest.newdomain.comหรือสิ่งที่ต้องการนั้นมันอาจจะดีกว่าเพื่อให้ตรงกับ!newdomain.com$ตราบเท่าที่โดเมนเดิมไม่ได้จบใน "newdomain.com" ชอบ "thisisanoldnewdomain.com" จนถึงจุดที่ # 1 ฉันไม่พบเอกสาร [OR] ที่ใดก็ได้ มันใช้งานได้จริงเหรอ?
DerfK

@DerfK เอกสาร - คุณต้องเลื่อนค่อนข้าง: "'ornext | หรือ' (หรือเงื่อนไขถัดไป) ใช้สิ่งนี้เพื่อรวมเงื่อนไขของกฎเข้ากับท้องถิ่นหรือแทนที่จะเป็นนัยและ"
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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.