.htaccess chuyển hướng tất cả các trang sang tên miền mới


218

Tôi sẽ sử dụng quy tắc chuyển hướng nào để chuyển hướng tất cả các trang bên dưới olddomain.exampleđể được chuyển hướng đến newdomain.example?

Trang web có cấu trúc hoàn toàn khác nhau, vì vậy tôi muốn mọi trang dưới tên miền cũ sẽ được chuyển hướng đến trang chỉ mục tên miền mới .

Tôi nghĩ rằng điều này sẽ làm (trong thư mục cơ sở olddomain.example):

RewriteEngine On
RewriteRule ^(.*)$ http://newdomain.example/ [R=301]

Nhưng nếu tôi điều hướng đến olddomain.example/somepagetôi sẽ được chuyển hướng đến newdomain.example/somepage. Tôi đang mong đợi một chuyển hướng chỉ để newdomain.examplekhông có hậu tố trang.

Làm thế nào để tôi giữ phần cuối cùng ra?


8
Để tiết kiệm thời gian, hãy cuộn xuống câu trả lời đúng nhất đó là RewriteEngine on RewriteRule ^(.*)$ http://www.newdomain.com/$1 [R=301,L]* stackoverflow.com/a/7578810/1066234
Kai Noack

2
Thật đáng để chỉ ra rằng, đặc biệt từ góc độ SEO, việc chuyển hướng nhiều đến một chỉ mục / trang chủ nói chung là một ý tưởng tồi. Google có thể coi nó là một 404 mềm.
MrWhite

Câu trả lời:


201

Có thể như thế này:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^OLDDOMAIN\.com$ [NC]
RewriteRule ^(.*)$ http://NEWDOMAIN.com [R=301,L]

Ừm, bạn có thể thử tải lại trình duyệt của mình không? nó thậm chí còn chuyển hướng với xampp ở đây. Tôi vừa thử nghiệm.
BẠN

Thật tệ ... nó không hoạt động, dịch vụ lưu trữ của tôi có một số chuyển hướng khác trên đó là fu **** mọi thứ. Cảm ơn! :)
Yuval Adam

25
Có phải vậy RewriteCond %{HTTP_HOST} !^NEWDOMAIN\.com$ [NC]không?
Jim Geurts

1
Sau một mùa đông dài tôi đã chỉnh sửa mã để cuối cùng nó có thể hoạt động. (đúng là chuyển hướng nếu THIẾT BỊ và không KHÁC BIỆT sang tên miền, đó là vấn đề)
carla

5
@JimGeurts Chỉ khi bạn muốn chuyển hướng MỌI THỨ không phải là tên miền mới. Tuy nhiên, trong trường hợp này, chúng tôi muốn chuyển hướng CHỈ olddomain.
carla

442

Câu trả lời dưới đây có khả năng có thể gây ra vòng lặp chuyển hướng vô hạn ...

Ở đây, cái này chuyển hướng mọi thứ sau tên miền trên url thành bản sao chính xác trên url tên miền mới:

RewriteEngine on 
RewriteRule ^(.*)$ http://www.newdomain.com/$1 [R=301,L]

www.example.net/somepage.html?var=foo chuyển hướng đến www.newdomain.com/somepage.html?var=foo


21
Sẽ không chuyển hướng này MỌI yêu cầu mặc dù, ngay cả những người cho newdomain.com? Và về cơ bản gây ra hai yêu cầu trùng lặp trong những trường hợp đó?
Bill Dami

33
Câu hỏi là để chuyển hướng mọi thứ đến trang chủ
kravits88

28
Mặc dù đây không phải là câu trả lời của câu hỏi, nhưng tôi đã đến câu hỏi này từ SE để tìm kiếm chính xác câu trả lời này. cảm ơn !!!
DAV

Làm thế nào chúng ta có thể làm để chuyển hướng từ tên miền phụ sang tên miền mới?
Sukhjinder Singh

2
Ai đó có thể trả lời câu hỏi của Bill không. Không nên sử dụng RewriteCond để ngăn chặn yêu cầu trùng lặp và / hoặc viết lại không cần thiết? Tôi cho rằng nó sẽ không có bất kỳ tác động đáng chú ý nào để viết lại mỗi lần mặc dù điều đó là không cần thiết. Nhưng tại sao làm điều đó.
Andrew

80

Chỉ cần làm rõ, sau khi loại bỏ chuyển hướng lưu trữ theo cách này, giải pháp ban đầu của tôi cũng hoạt động:

RewriteEngine On
RewriteRule ^(.*)$ http://newdomain.com/ [R=301]

Điều này sẽ chuyển hướng đến chỉ mục mặc định, đó là những gì câu hỏi của bạn là về. Để rõ ràng, do, do sự gần gũi, câu lệnh của bạn dường như được hướng tới câu trả lời của user968421 ngay phía trên, câu trả lời của user968421 là chính xác khi ý định chuyển hướng đến một tên tệp tương ứng trên tên miền mới.
RationalRợi

19

Tôi đã sử dụng cho blog Wordpress của mình dưới dạng .htaccess. Nó chuyển đổi http: //www.blah.example/asad , http: //blah.example/asad , http: //www.blah.example2/asad , v.v., thành http: //blah.example/asad Cảm ơn tất cả câu trả lời khác tôi đã tìm ra điều này.

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} !^YOURDOMAIN\.example$ [NC]
RewriteRule ^(.*)$ https://YOURDOMAIN.example/$1 [R=301,L]

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

2
Tôi coi đây là câu trả lời toàn diện nhất trong tất cả: nó duy trì thứ hạng cho mỗi trang và là một điểm thu hút cho tất cả các tên miền không phải là tên chính! Những gì có thể tốt hơn?
nzn

1
Chìa khóa ở đây là quy tắc viết lại tên miền xuất hiện trước quy tắc viết lại chỉ mục WordPress.
MrMoxy

14
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTP_HOST} ^olddomain.com$ [OR]
  RewriteCond %{HTTP_HOST} ^www.olddomain.com$
  RewriteRule (.*)$ http://www.newdomain.com/$1 [R=301,L]
</IfModule>

Điều này làm việc cho tôi


Vâng, phương pháp này sẽ sạch sẽ và tốt đẹp!, Cũng làm việc cho tôi.
Cody

điều này sẽ chuyển hướng với tham số trong URl nếu có - index.php? aa = 9 sẽ mang tham số đến miền mới
Darksymphony

13

Có nhiều cách khác nhau để làm điều này và các chuyển hướng khác nhau, tôi đã liệt kê chúng dưới đây:

Chuyển hướng 301 (vĩnh viễn): Trỏ toàn bộ trang web tới một URL khác trên cơ sở vĩnh viễn. Đây là loại chuyển hướng phổ biến nhất và hữu ích trong hầu hết các tình huống. Trong ví dụ này, chúng tôi đang chuyển hướng đến miền "example.com":

# This allows you to redirect your entire website to any other domain
Redirect 301 / http://example.com/

Chuyển hướng 302 (Tạm thời): Trỏ toàn bộ trang web tới một URL tạm thời khác. Điều này hữu ích cho mục đích SEO khi bạn có một trang đích tạm thời và dự định chuyển trở lại trang đích chính của bạn vào một ngày sau đó:

# This allows you to redirect your entire website to any other domain
Redirect 302 / http://example.com/

Chuyển hướng index.html đến một thư mục con cụ thể:

# This allows you to redirect index.html to a specific subfolder
Redirect /index.html http://example.com/newdirectory/

Chuyển hướng một tệp cũ sang một đường dẫn tệp mới:

# Redirect old file path to new file path
Redirect /olddirectory/oldfile.html http://example.com/newdirectory/newfile.html

Chuyển hướng đến một trang chỉ mục cụ thể:

# Provide Specific Index Page (Set the default handler)
DirectoryIndex index.html

Nếu bạn thêm $ 1 vào ví dụ đầu tiên, như thế này Redirect 301 / http://example.com/$1 thì tất cả các trang của trang web gốc sẽ được chuyển hướng đến thư mục gốc của trang web mới
Yassine Mokni

@YassinMK $1Không bắt buộc ở đây, bạn đang nghĩ đến RedirectMatchchỉ thị (nhưng sau đó bạn vẫn sẽ cần xác định một nhóm bắt giữ $1để tham chiếu).
MrWhite

Mặc dù tất cả các Redirectchỉ thị này sẽ chuyển hướng như muốn, trong khi OP chỉ muốn chuyển hướng đến trang chủ của trang web mới (mặc dù bản thân điều đó không được khuyến nghị). Bạn có thể cần sử dụng RedirectMatchchỉ thị nếu bạn muốn chuyển hướng đến một URL cụ thể.
MrWhite

thay vì 301 bạn cũng có thể viết Chuyển hướng vĩnh viễn / h ttps: //www.example.com, bạn có thể thực hiện việc này trong tệp vhost
Yvon Huynh

Nhưng câu hỏi liên quan đến .htaccess vậy tại sao lại nhắc đến tập tin vhost?
RustyIngles

9

Nếu bạn muốn chuyển hướng từ một số vị trí sang tên miền phụ, bạn có thể sử dụng:

Redirect 301 /Old-Location/ http://subdomain.yourdomain.com


Đó là cách tốt nhất. Bởi vì nhiều Webhoster không cho phép sử dụng RewriteEngine trong .htaccess. Điều này làm việc tuyệt vời nào!
Sprinterfreak

Bạn phải sử dụng RewriteEngine để chuyển hướng. Lý do tại sao bạn gặp vấn đề là RewriteEngine đã hoạt động và bạn chỉ cần quy tắc chuyển hướng. Tôi rất vui vì đã giúp.
EmptySD

Không đúng. Nó bỏ qua tất cả điều Viết lại và khi sử dụng RewriteEngine Onném 500 Lỗi nội bộ. Đó là một không gian web rất hạn chế. Sử dụng Redirect 301 / http://foolà cách duy nhất có thể để đối phó.
Sprinterfreak

6

Nếu tên miền mới mà bạn đang chuyển hướng trang web cũ của bạn đến trên một máy chủ khác nhau, bạn chỉ cần sử dụng một tên miền Redirect

Redirect 301 / http://newdomain.com

Điều này sẽ chuyển hướng tất cả các yêu cầu từ olddomainđến newdomain.

Redirectlệnh này sẽ không hoạt động hoặc có thể gây ra Redirect loopnếu cả tên miền mới và tên miền của bạn nằm trên cùng một máy chủ, trong trường hợp đó bạn sẽ cần sử dụng mod-rewriteđể chuyển hướng dựa trên tiêu đề máy chủ được yêu cầu.

RewriteEngine on


RewriteCond %{HTTP_HOST} ^(www\.)?olddomain\.com$
RewriteRule ^ http://newdomain.com%{REQUEST_URI} [NE,L,R] 

5

Danh tiếng của tôi sẽ không cho phép tôi nhận xét về câu trả lời, nhưng tôi chỉ muốn chỉ ra rằng câu trả lời được đánh giá cao nhất ở đây có lỗi:

RewriteEngine on 
RewriteRule ^(.*)$ http://www.newdomain.com$1 [R=301,L]

nên có một dấu gạch chéo trước $ 1, vì vậy

RewriteEngine on 
RewriteRule ^(.*)$ http://www.newdomain.com/$1 [R=301,L]

3

Giải pháp của tôi là SymLinks không hoạt động trên máy chủ của tôi nên tôi đã sử dụng If trong PHP của mình.

function curPageURL() {
    $pageURL = 'http';
    if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
    $pageURL .= "://";
    if ($_SERVER["SERVER_PORT"] != "80") {
        $pageURL .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"];
    } else {
        $pageURL .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
    }
    return $pageURL;
}
$redirect = str_replace("www.", "", curPageURL());
$remove_http_root    = str_replace('http://', '', $redirect);
$split_url_array     = explode('/', $remove_http_root );


if($split_url_array[0] == "olddomain.com"){
    header("Location: http://www.newdomain.com/$split_url_array[1]");
    die();
}

2

Đây là một lỗi trong các phiên bản cũ hơn của apache (và do đó là mod_rewrite) trong đó tiền tố đường dẫn được gắn vào đường dẫn được viết lại nếu nó bị thay đổi. Xem tại đây

Tôi nghĩ rằng nó đã được sửa trong apache2 V2.2.12, có một cờ đặc biệt bạn cần sử dụng mà tôi sẽ thêm vào đây khi tôi tìm thấy nó, (tôi nghĩ đó là NP cho No Path)

RewriteRule ^(.*)$ http://newdomain.com/ [??]

Tôi đập đầu mình trong gần một tháng
Dấu hỏi

2

Từ quan điểm khả năng sử dụng, nó sẽ tốt hơn, nếu bạn cũng gửi đường dẫn với yêu cầu (nghĩa là những gì bạn có tại thời điểm này) và để cho trang web mới của bạn giải quyết nó:

Bạn đã tìm kiếm "/ sản phẩm".

Thật không may trang này đã biến mất. Thay vào đó, bạn có muốn truy cập "/ new_products" không?

(và tốt hơn, vẫn, làm điều này tự động.)

Đây rõ ràng là rất nhiều mã hóa và phỏng đoán cho một trang web lớn hơn, nhưng theo tôi nó sẽ được đền đáp về sự hài lòng của người dùng (khi dấu trang được lưu cẩn thận của sản phẩm mơ ước của bạn chỉ dẫn bạn đến trang nhất của newdomain.com, điều này là bực bội.)


Đối với trang web cho biết điều này là khá nhiều không liên quan vì toàn bộ trang web đã thay đổi, nhưng bạn hoàn toàn chính xác. Trang web phải tương thích ngược càng tốt. +1
Yuval Adam

2

Nếu bạn muốn chuyển hướng để hoàn thành trang web (tên miền) mới khác không có tham số hoặc trang, hãy sử dụng điều này:

RewriteEngine On
RewriteRule / http://new-domain.com/$1? [R=301]

1
Điều này sẽ không hoạt động như mong đợi khi được sử dụng .htaccessvì đơn giản là nó sẽ không khớp với bất kỳ URL nào trong thư mục gốc. Nó sẽ hoạt động trong một cấu hình máy chủ hoặc bối cảnh Virtualhost.
MrWhite

2

Tôi đã thử câu trả lời của user968421 và giải pháp của OP nhưng trình duyệt xuất hiện lỗi bảo mật cho trang thanh toán. Tôi không thể cho bạn biết lý do chính xác.

Máy chủ của chúng tôi (Site Ground) cũng không thể tìm ra.

Giải pháp cuối cùng đã gần, nhưng một điều chỉnh nhỏ cho câu trả lời của user968421 (lưu ý phụ: không giống như OP, tôi đã cố gắng chuyển hướng đến trang tương ứng, không chỉ đến trang chủ để tôi duy trì tham chiếu phía sau [ $1sau tên miền] từ user968421 câu trả lời):

RewriteEngine on
RewriteRule (.*) https://newdomain.com/$1 [R=301,L]

Có tinh chỉnh từ trình tạo chuyển hướng htaccess này được đề xuất bởi một bài viết của Host Gator (thời điểm tuyệt vọng, biện pháp tuyệt vọng, đáng kinh ngạc?).


2

Đơn giản như thế này và điều này sẽ không mang theo truy vấn từ URL đến tên miền mới.

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule .* https://www.newdomain.com/? [R=301,L]

điều đó thực sự hiệu quả với tôi, cần một giải pháp để vượt qua bất kỳ con sên nào sang miền mới Cảm ơn Dsynmphony
Faisal Mehmood Awan

1

Sử dụng chuyển hướng có điều kiện với Options -FollowSymLinksAllowOverride -Options bị vô hiệu hóa bởi Hoster nếu một vài tệp cục bộ cũng được cung cấp:

Mẫu .htaccess

# Redirect everything except index.html to http://foo
<FilesMatch "(?<!index\.html)$">
    Redirect 301 / http://foo/
</FilesMatch>

Ví dụ này sẽ phục vụ index.html cục bộ và chuyển hướng tất cả các nhân viên khác sang tên miền mới.


1

Hãy thử phương pháp này để chuyển hướng tất cả sang tên miền mới trên trang chủ, Nó hoạt động với tôi:

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

0

Các câu trả lời trước không làm việc cho tôi.

Tôi đã sử dụng mã này. Nếu bạn đang sử dụng OSX, hãy đảm bảo sử dụng đúng định dạng.

Options +FollowSymLinks -MultiViews
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.)?OLDDOMAIN\.com$ [NC]
RewriteRule (.*) http://www.NEWDOMAIN.com/ [R=301,L]
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.