Tôi muốn giải quyết một câu trả lời dựa trên regex mới hơn đang được phổ biến.
location ~ ^/en(/?)(.*)$ { # OOPS!
proxy_pass http://luscious/$2$is_args$args; # OOPS!
}
Giải pháp thoạt nhìn có vẻ dễ thương hơn, nhưng nó sai vì nhiều lý do.
Regex ở trên sẽ phù hợp với yêu cầu của bạn /enjoy
, chuyển hướng nó lên /joy
thượng nguồn. Đây thực sự là dự định?
Yêu cầu /en
sẽ không dẫn đến bất kỳ chuyển hướng nào, trực tiếp phục vụ /
từ thượng nguồn (gần như là một yêu cầu /en/
được thực hiện thay thế, nhưng không hoàn toàn). Nếu bạn sử dụng các URI tương đối trong trang gốc của bạn ngược dòng (nếu không, tại sao bạn không có /en/
tiền tố ngay trong URI ngược dòng?), Ví dụ src="style.css"
(có thể tham chiếu một ngôn ngữ cụ thể theo ngôn ngữ url("menu.png")
), thì trình duyệt sẽ yêu cầu như /style.css
thay vì /en/style.css
. (Hoặc ngay cả khi bạn sử dụng URI tuyệt đối ở mọi nơi, điều gì sẽ xảy ra nếu ai đó tham chiếu tài nguyên bán tùy chọn tương đối khó hiểu?) Rất tiếc, trang web có thể không hoạt động, nhưng chỉ đôi khi hoặc trong các trường hợp cạnh.
Theo lời khuyên trước đây của tôi tại một câu hỏi khác đã được đề cập bởi câu trả lời của chính OP , việc sử dụng các biểu thức chính quy sẽ ngăn lệnh proxy_redirect
này có giá trị mặc định default
, off
thay vào đó thay thế. Điều này có nghĩa là nếu trả lời ngược dòng Location: http://127.0.0.1:8080/en/dir/
khi yêu cầu /en/dir
được đưa ra, thì đó là những gì khách hàng sẽ thấy, rõ ràng là nó sẽ không hoạt động chính xác. (Điều này đặc biệt mỉa mai cho một /en
yêu cầu nhắc nhở sử dụng regex ngay từ đầu, tuy nhiên việc triển khai cụ thể này thay vì gặp phải một vấn đề khác như đã đề cập ở trên.) Plus, nếu bạn đang sử dụngupstream
Chỉ thị, sau đó có thể trở nên xấu hơn nếu bạn chỉ cố gắng đi với một tùy chỉnh, đặc biệt là nếu bạn có thể có nhiều hơn một máy chủ ngược dòng - làm thế nào để bạn có một riêng proxy_redirect
cho từng máy chủ ? Bạn cũng có thể sử dụng các biểu thức chính quy bên trong proxy_redirect
, thậm chí có thể để khớp với bất kỳ máy chủ nào, nhưng nếu bạn quyết định đưa ra một chuyển hướng tên miền chéo trong tương lai thì sao?
Để cố gắng giải quyết một số điểm trên với một vị trí dựa trên regex duy nhất, chúng tôi có thể làm như sau (lưu ý rằng proxy_pass
chúng tôi cũng phải bỏ tham chiếu đến máy chủ từ một upstream
chỉ thị dựa trên cơ sở, để proxy_redirect
đơn giản hơn):
location ~ ^/en/?((?<=/).*)?$ {
location = /en { return 302 /en/; }
proxy_pass http://127.0.0.1:8080/$1$is_args$args;
proxy_redirect http://127.0.0.1:8080/ /en/;
}
Vì vậy, nếu bạn hỏi tôi, giải pháp ban đầu với hai vị trí cấp cao nhất của anh chị em vẫn sẽ là một ý tưởng tốt hơn là tự đào một cái hố thỏ bằng cách đi theo con đường regex thay thế.