Apache viết lại nhiều điều kiện


9

Tôi có một trang web được di chuyển từ một tên miền cũ (ví dụ: olddomain.com) sang một tên miền mới (ví dụ: newdomain.com).

Vì lý do SEO, tôi cần viết lại tất cả lưu lượng truy cập trang web sang tên miền mới chính (ví dụ: www.newdomain.com). Thật không may, tôi không biết làm thế nào để thêm nhiều điều kiện viết lại loại OR. Dường như với tất cả các điều kiện, mã mẫu bên dưới, tôi nhận được một điều kiện 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>

Ai đó có thể giúp tôi một chút không? Mọi sự trợ giúp sẽ rất được trân trọng.

Câu trả lời:


16

Mặc dù thực tế là bạn đã tìm thấy giải pháp làm việc cho bạn, tôi vẫn sẽ đăng bài này vì bạn không phải là tối ưu.

Giải pháp # 1 : Thay thế [NC]bằng [NC,OR]2 dòng RewriteCond đầu tiên của mã gốc. Theo mặc định, một RewriteCond được liên kết với một RewriteCond khác theo logic AND. Điều này sẽ hướng dẫn Apache sử dụng ORlogic:

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]

Giải pháp # 2 : Vì bạn chỉ có tổng cộng 4 tên miền, nên việc sử dụng phương pháp ngược lại sẽ dễ dàng hơn nhiều - chuyển hướng từ BẤT K domain tên miền nào ngoại trừ một tên miền chính xác:

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

Giải pháp số 2 là giải pháp tốt hơn, mặc dù nếu bạn đã có www.newdomain.comtest.newdomain.commột cái gì đó tương tự, thì có thể tốt hơn để phù hợp !newdomain.com$miễn là tên miền cũ không kết thúc trong "newdomain.com" như "thisisanoldnewdomain.com". Thêm vào điểm số 1, tôi không thể tìm thấy [HOẶC] tài liệu ở bất cứ đâu. Điều đó thực sự làm việc?
DerfK

Tài liệu @DerfK - bạn phải cuộn khá nhiều: "'ornext | OR' (hoặc điều kiện tiếp theo) Sử dụng điều này để kết hợp các điều kiện quy tắc với OR cục bộ thay vì ẩn AND."
LazyOne

1

Chỉ cần tìm thấy trích dẫn này:

RewriteConds chỉ áp dụng cho các writeriteRule duy nhất theo sau chúng.

tại đây: http://www.webmasterworld.com/apache/3350200.htm

Đây là giải pháp làm việc cho tôi:

    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
Như một lưu ý cho bất kỳ ai khác đến đây nhiều năm sau, giải pháp được đề xuất bởi LazyOne ở trên (và được OP chấp nhận) được tối ưu hóa hơn nhiều, đặc biệt là nếu bạn có nhiều hơn hai hoặc ba điều kiện để ORcùng nhau.
Doktor J
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.