Làm cách nào để chuyển hướng đến một tên miền khác bằng NGINX?


136

Làm cách nào tôi có thể chuyển hướng mydomain.comvà bất kỳ tên miền phụ nào *.mydomain.comđể www.adifferentdomain.comsử dụng NGINX?

Câu trả lời:


276

server_name hỗ trợ kết hợp hậu tố bằng cú pháp .mydomain.com:

server {
  server_name .mydomain.com;
  rewrite ^ http://www.adifferentdomain.com$request_uri? permanent;
}

hoặc trên mọi phiên bản 0.9.1 trở lên:

server {
  server_name .mydomain.com;
  return 301 http://www.adifferentdomain.com$request_uri;
}

1
Tôi không cần phải đưa vào một cổng để lắng nghe? ví dụ: nghe 80. Tôi có nhiều tên miền mà tôi cần chuyển hướng đến một tên miền chính, nhưng máy chủ của tôi cũng có nhiều máy chủ ảo cho nhiều tên miền khác.
Ryan

1
@Ryan Lệnh listenmặc định cho cổng 80 khi không được chỉ định. Nó thực sự phức tạp hơn một chút so với nói chung; xem tài liệu cấu hình nginx để biết thêm chi tiết.
Yitz

2
Những gì ?đạt được ở cuối?
Dan Dascalescu

5
Sự khác biệt giữa rewritevà là return 301 $scheme://www.adifferentdomain.com$request_uri;gì?
Dan Dascalescu

6
Các ? ở phần cuối của một bản viết lại cho nginx không nối thêm chuỗi truy vấn ban đầu. Vì $request_uriđã có chuỗi truy vấn, nên không cần nối lại nó. Các return 301cú pháp là mới hơn, và không nên có sự khác biệt trong hành vi giữa hai phương pháp, nhưng khi tôi ban đầu đã trả lời câu hỏi này, nhiều bản phân phối không có phiên bản cần thiết, vì vậy tôi đã đi với cú pháp an toàn hơn.
kolbyjack


15

Tại sao sử dụng mô-đun viết lại nếu bạn có thể làm return? Về mặt kỹ thuật, returnlà một phần của mô-đun viết lại như bạn có thể đọc ở đây nhưng đoạn mã này dễ đọc imho hơn.

server {
    server_name  .domain.com;

    return 302 $scheme://forwarded-domain.com;
}

Bạn cũng có thể cung cấp cho nó một chuyển hướng 301.


1
Điều này sẽ giữ đường dẫn và truy vấn params là tốt?
mở

3
Không có ví dụ này không làm điều đó @Mark. Nhưng tôi cho rằng bạn có thể trộn lẫn các câu trả lời trước đó để đưa ra một câu như thế này:return 302 $scheme://forwarded-domain.com$request_uri;
Robin van Baalen

Mặt khác, trong nhiều trường hợp, có lẽ bạn chỉ nên chuyển hướng đến https thay vì duy trì lược đồ (nghĩa là sử dụng https thay vì $ lược đồ). Điều này cũng vì lý do tương tự các liên kết liên quan đến giao thức hiện bị coi là không dùng nữa - paulirish.com/2010/the-protatio-relative-url
mahemoff

@mahemoff Điều đó không hoàn toàn đúng. Hãy xem xét trường hợp có máy chủ web đằng sau một bộ cân bằng tải đang xả ssl.
Sebastian Neira

11

Điều đó sẽ hoạt động thông qua HTTPRewriteModule .

Ví dụ viết lại từ www.example.com đến example.com:

server {    
    server_name www.example.com;    
    rewrite ^ http://example.com$request_uri? permanent; 
}

đó chỉ là chuyển hướng www.example.com sang example.com. Tôi muốn chuyển hướng cả hai đến một tên miền khác. Tôi có thể làm điều đó trong một quy tắc?
deb

Tôi không biết chắc chắn, nhưng tôi nghĩ rằng server_name mydomain.com; viết lại www.adifferentdomain.com vĩnh viễn; } Hãy làm nó? Điều đó sẽ mất tất cả mọi thứ * .mydomain.com?
Udo

@deb bạn sẽ chỉ có server_name example.com www.example.com;.
citruspi

Câu hỏi đặc biệt yêu cầu bất kỳ tên miền phụ nào chuyển hướng đến một tên miền khác . Câu trả lời này không trả lời một trong hai (rõ ràng).
Kissaki

Điều này là thiếu 301 quan trọng!
Sliq

9

Nếu bạn muốn chuyển hướng yêu cầu "domain1.com" sang "domain2.com", bạn có thể tạo một khối máy chủ trông như thế này:

server {
    listen 80;
    server_name domain1.com;
    return 301 $scheme://domain2.com$request_uri;
}

Ai đó có thể cần phải chuyển hướng https: // yêu cầu. listen 443;
Rafik Farhad

0

Chuyển hướng tạm thời

rewrite ^ http://www.RedirectToThisDomain.com$request_uri? redirect;

Chuyển hướng vĩnh viễn

rewrite ^ http://www.RedirectToThisDomain.com$request_uri? permanent;

Trong tập tin cấu hình nginx cho trang web cụ thể:

server {    
    server_name www.example.com;
    rewrite ^ http://www.RedictToThisDomain.com$request_uri? redirect;

}

0

Bạn chỉ có thể viết một điều kiện if bên trong khối máy chủ {}:

server { 

    if ($host = mydomain.com) {
        return 301 http://www.adifferentdomain.com;
    } 
}

Bạn cần cẩn thận khi sử dụng các câu lệnh 'if' trên Nginx ( nginx.com/resource/wiki/start/topics/depth/ifisevil ). Trong trường hợp này, bạn chỉ có thể sử dụng 'server_name mydomain.com'.
Marty

nếu là xấu khi được sử dụng trong bối cảnh vị trí, nó an toàn khi được sử dụng để chỉ định máy chủ chuyển hướng
cryptoKTM
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.