Nginx chuyển hướng một con đường đến một con đường khác


51

Tôi chắc chắn rằng điều này đã được hỏi trước đây, nhưng tôi không thể tìm ra giải pháp hiệu quả.

Một trang web đã chuyển dịch vụ CMS, nhưng có cùng tên miền, làm cách nào để thiết lập viết lại nginx cho một trang?

Ví dụ

Trang cũ

http://sitedomain.co.uk/content/unique-page-name

Trang mới

http://sitedomain.co.uk/new-name/unique-page-name

Xin lưu ý , tôi không muốn mọi thứ trong trang nội dung được chuyển hướng, nhưng theo nghĩa đen chỉ là url được đề cập ở trên. Tôi có khoảng 9 chuyển hướng để thiết lập, không phải trong số đó phù hợp với một mô hình.

Cảm ơn!

Chỉnh sửa: Tôi tìm thấy giải pháp này, dường như đang hoạt động, ngoại trừ thực tế là nó chuyển hướng mà không có dấu gạch chéo:

if ( $request_filename ~ content/unique-page-name/ ) {
   rewrite ^ http://sitedomain.co.uk/new-name/unique-page-name/? permanent;
}

Nhưng điều này chuyển hướng đến:

http://sitedomain.co.uknew-name/unique-page-name/

Câu trả lời:


87

Trích dẫn trực tiếp từ những cạm bẫy và những sai lầm thường gặp: Đánh thuế lại :

Bằng cách sử dụng lệnh quay trở lại, chúng ta hoàn toàn có thể tránh đánh giá biểu thức chính quy.

Vui lòng sử dụng returnthay vì rewritecho chuyển hướng vĩnh viễn. Đây là cách tiếp cận của tôi đối với trường hợp sử dụng này ...

location = /content/unique-page-name {
  return 301 /new-name/unique-page-name;
}

1
Nó chắc chắn dễ đọc hơn. Điều này cũng sẽ giữ lại bất kỳ truy vấn nào trên URL gốc?
SteveEdson

1
Không. Nó sẽ không. Nếu bạn thực sự muốn giữ lại bất kỳ truy vấn nào khi chuyển hướng vĩnh viễn, hãy xem mẹo nhỏ này ... gist.github.com/pothi/7152399
Pothi Kalimuthu

1
Tôi có đúng khi nghĩ rằng sử dụng các iftuyên bố trong nginx là xấu? Điều này vẫn sẽ được thực hành tốt hơn so với sử dụng phương pháp viết lại?
SteveEdson

1
Sử dụng ifcùng với chỉ thị trở lại là hoàn toàn tốt. Xem wiki.nginx.org/ IfIsEvil . Vâng, IMO, tốt hơn là sử dụng viết lại.
Pothi Kalimuthu

13

Lý tưởng nhất là bạn không nên sử dụng nếu báo cáo nếu bạn có thể tránh nó. Một cái gì đó như thế này có thể làm việc (chưa được kiểm tra).

location ~ /content/(.*)$ {
    rewrite ^ /new-name/$1?$args permanent;
} 

1
Điều đó có bắt được mọi thứ trong thư mục nội dung không? Tôi chỉ muốn chuyển hướng các mục cá nhân. Ví dụ: tôi có một mục khác trong thư mục nội dung, nhưng tôi cần nó chuyển hướng đến ... /
Another

1
Tôi đã giải quyết nó. Hóa ra nó chuyển hướng chính xác, nhưng tập lệnh đang nhấn đã xáo trộn URL sau đó.
SteveEdson

1
Ah, tôi đã hiểu nhầm câu hỏi. Tôi nghĩ bạn chỉ muốn phần nội dung thay đổi. Nguyên tắc vẫn như cũ. Tôi rất vui vì nó làm việc cho bạn.
Gevious

1
Không có vấn đề gì, cảm ơn vì sự giúp đỡ, tôi chắc chắn sẽ cần sử dụng nó trong tương lai.
SteveEdson

12

Tôi đã sử dụng giải pháp sau đây:

rewrite ^(/content/unique-page-name)(.*)$   http://sitedomain.co.uk/new-name/unique-page-name/$2 permanent;

Làm việc một điều trị.


8

Đối với tôi nó hoạt động mà không có dấu bằng như thế này:

location /old-url {
  return 301 /new-url;
}

2
Bạn không cần khối vị trí nào cả. Chỉ cần sử dụng rewrite. Xem câu trả lời của @ SteveEdison.
PKHunter
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.