2011-06-29 16 views
8

Tôi biết rằng có rất nhiều ví dụ về Stackoverflow nhưng tôi vẫn nhớ điều gì đó.htaccess: chuyển hướng miền cũ và tất cả các trang đến tên miền mới

Tôi đang cố gắng để chuyển hướng http://old.domain.com/fr/-http://brand.new-domain.com/fr/ với các quy tắc sau đây, nhưng điều đó không làm việc:

# Enable Rewrite Engine 
RewriteEngine On 
RewriteBase/

# Add a trailing slash to paths without an extension 
RewriteCond %{REQUEST_METHOD} !=POST 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$ 
RewriteRule ^(.*)$ $1/ [L,R=301] 

# Redirect domain 
Options +FollowSymLinks 
RewriteCond %{HTTP_HOST} ^old.domain.com [OR] 
RewriteCond %{HTTP_HOST} ^other-old.domain.com [NC] 
RewriteRule ^(.*)$ http://brand.new-domain.com/$1 [r=301,L] 

# Remove index.php 
# Uses the "exclude method" 
# http://expressionengine.com/wiki/Remove_index.php_From_URLs/#Exclude_List_Method 
# This method seems to work best for us, you might also use the include method. 
# http://expressionengine.com/wiki/Remove_index.php_From_URLs/#Include_List_Method 
# Exclude root files 
RewriteCond $1 !^(index\.php) [NC] 
# Exclude EE folders 
RewriteCond $1 !^(assets|ee-admin|images|templates|themes|fr|nl)/ [NC] 
# Exclude user created folders 
RewriteCond $1 !^(assets|css|img|js|swf|uploads)/ [NC] 
# Exlude favico, robots, ipad icon 
RewriteCond $1 !^(favicon\.ico|robots\.txt|pple-touch-icon\.png) [NC] 
# Remove index.php 
RewriteCond %{QUERY_STRING} !^(ACT=.*)$ [NC] 
RewriteCond %{QUERY_STRING} !^(URL=.*)$ [NC] 
RewriteRule ^(.*)$ /index.php?/$1 [L] 

Nó chuyển hướng một cách chính xác khi tôi gọi URL gốc, nhưng không phải khi tôi gọi một trang. Tôi đang làm gì sai?

Cảm ơn trước!

Pv

Trả lời

9

Khi viết các quy tắc mod_rewrite, các quy tắc được áp dụng theo thứ tự chúng xuất hiện.

Để chuyển hướng một miền cũ sang một tên miền mới, bạn sẽ muốn quy tắc đó để là người đầu tiên tại của bạn tập tin .htaccess hoặc httpd.conf — tất cả các quy tắc khác sẽ xuất hiện sau khi nó.

Nếu bạn chỉ muốn chuyển hướng một thư mục nào đó, các quy tắc sau đây sẽ làm như vậy, trong khi cho phép các phần còn lại của trang web để hoạt động bình thường:

<IfModule mod_rewrite.c> 
    RewriteEngine On 

    # Redirect Only Matching Directories 
    RewriteCond %{REQUEST_URI} ^/(fr|fr/.*)$ 
    RewriteRule ^(.*)$ http://brand.new-domain.com/fr/$1 [R=301,L] 
</IfModule> 

Nếu bạn muốn chuyển hướng toàn bộ trang web, các quy tắc sau đây sẽ làm như vậy:

<IfModule mod_rewrite.c> 
    RewriteEngine On 

    # Redirect Entire Site to New Domain 
    RewriteCond %{HTTP_HOST} ^old.domain.com$ [OR] 
    RewriteCond %{HTTP_HOST} ^other-old.domain.com$ [NC] 
    RewriteRule ^(.*)$ http://brand.new-domain.com/$1 [R=301,L] 
</IfModule> 

Nếu bạn quan tâm để cho crawlers biết nội dung của bạn đã chuyển và muốn thực hiện quá trình chuyển đổi liền mạch càng tốt, hãy chắc chắn để giữ cho tôi 301 Redirect cờ n RewriteRule.

Điều này sẽ đảm bảo rằng người dùng và công cụ tìm kiếm được chuyển hướng đến đúng trang.


Trong khi chúng tôi về đề tài này, như một phần của việc phát hành EE 2.2, Ellislab bây giờ "chính thức" cung cấp hỗ trợ kỹ thuật hạn chế cho removing index.php from ExpressionEngine URLs.

Đơn giản chỉ cần thêm hoặc cập nhật mã của bạn để sau, đảm bảo xem xét bất kỳ quy tắc bạn có thể đã có tại chỗ:

<IfModule mod_rewrite.c> 
    RewriteEngine On 

    # Removes index.php 
    RewriteCond $1 !\.(gif|jpe?g|png)$ [NC] 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^(.*)$ /index.php/$1 [L] 

    # If 404s, "No Input File" or every URL returns the same thing 
    # make it /index.php?/$1 above (add the question mark) 
</IfModule> 
3

Cố gắng sử dụng ruke sau như một trong những đầu tiên:

# Redirect domain 
Options +FollowSymLinks 
RewriteCond %{HTTP_HOST} ^old.domain.com [OR] 
RewriteCond %{HTTP_HOST} ^other-old.domain.com [NC] 
RewriteRule ^(.*)$ http://brand.new-domain.com/$1 [R=301,L] 

Cũng nhớ những chữ hoa R với là hình thức viết tắt của các chữ thường redirect.

1

Bạn đã cố gắng sử dụng mod_alias hướng dẫn chuyển hướng đơn giản (một module cốt lõi mà bạn có) , trước khi thử điều hacky-mod-rewrite?

tôi sẽ làm một VirtualHost với ServerName old.domain.com và VH này tôi sẽ thêm quy tắc này:

Redirect /fr http://brand.new-domain.com/fr 

từ doc:

Sau đó, bất kỳ yêu cầu bắt đầu với URL-Path sẽ trả về một yêu cầu chuyển hướng cho khách hàng tại vị trí của URL mục tiêu. Thông tin đường dẫn bổ sung ngoài đường dẫn URL phù hợp sẽ được nối vào URL mục tiêu.

Vì vậy, hãy có một VirtualHost riêng biệt cho brand.new-domain.com (với ServerName brand.new-domain.com) và trong trường hợp này không đặt Quy tắc chuyển hướng.

Nếu bạn vẫn muốn xử lý 2 tên miền trong cùng một VirtualHost thì bạn sẽ phải sử dụng mod-viết lại vì thậm chí RedirectMatch không thể kiểm tra miền yêu cầu trên truy vấn.