Điểm:0

proxy ngược nginx với đường dẫn con

lá cờ in

Tôi đã tạo một ứng dụng web sẽ lắng nghe trên một cổng và xử lý các yêu cầu HTTP. Ví dụ: nếu tôi chạy nó cục bộ tại 127.0.0.1:3000. Tôi có thể truy cập nó với http://127.0.0.1:3000/path/within/app trên trình duyệt của tôi. Tôi muốn triển khai nó trên một trong các máy chủ của mình, được định cấu hình với nginx để xử lý tất cả các yêu cầu đến (và TLS) và chuyển tiếp chúng đến các ứng dụng khác nhau (nghe tại http://127.0.0.1:xxx). Thông thường, tôi sẽ cung cấp cho mỗi ứng dụng một tên miền phụ khác nhau (ví dụ: truy cập ứng dụng1 với app1.example.comứng dụng2 với app2.example.com), nhưng sẽ thuận tiện hơn nếu tôi có thể sử dụng đường dẫn phụ (ví dụ: truy cập ứng dụng1 với ví dụ.com/app1ứng dụng2 với ví dụ.com/app2). Nhưng tôi không chắc làm thế nào để cấu hình nó.

Tệp cấu hình hiện tại của tôi giống như sau. Giả sử ứng dụng của tôi đang lắng nghe tại 127.0.0.1:3000.

vị trí ^~ /app1 {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Máy chủ $http_host;
    proxy_redirect tắt;
    proxy_pass http://127.0.0.1:3000/;
}

Tôi muốn đạt được những điều sau đây.

  1. Khi tôi truy cập https://example.com/app1, nó sẽ tương đương với việc truy cập http://127.0.0.1:3000.
  2. Khi tôi truy cập https://example.com/app1/path/within/app, nó sẽ tương đương với truy cập http://127.0.0.1:3000/path/within/app.

Tuy nhiên, với tệp cấu hình được đề cập ở trên, chỉ có phần đầu tiên hoạt động. Nếu tôi truy cập https://example.com/app1/path, ứng dụng của tôi phàn nàn rằng đó là http://127.0.0.1:3000//đường dẫn mà thực sự được truy cập, và nó không biết làm thế nào để xử lý //con đường.

Tôi không muốn sửa đổi bất kỳ phần nào trong ứng dụng của mình để nó có thể chạy độc lập nếu tôi quyết định cung cấp cho nó một tên miền phụ trong tương lai và mong đợi một bản sửa lỗi chỉ sửa đổi tệp cấu hình nginx nếu có thể. Ngoài ra, tôi biết vấn đề là bất kỳ liên kết có thể nhấp nào do ứng dụng tạo ra cũng sẽ cần xử lý đường dẫn phụ, nhưng ứng dụng này đủ đơn giản nên đó không phải là vấn đề.

Cảm ơn.

Ivan Shatsky avatar
lá cờ gr
Thay đổi vị trí của bạn thành `location ^~ /app1/ { ... }` (lưu ý dấu gạch chéo ở cuối). Nếu bạn muốn URI `/app1` cũng có thể hoạt động được, hãy thêm `location = /app1 { return 301 /app1/; }` vào cấu hình của bạn.
lewisxy avatar
lá cờ in
Cảm ơn, có cách nào để `/app1` hoạt động mà không cần gửi 301 không?
Ivan Shatsky avatar
lá cờ gr
Bạn có thể thử `location = /app1 { viết lại ^ /app1/ lần cuối; }`. Tuy nhiên, trong một số trường hợp, nó có thể khiến ứng dụng của bạn không thể tải nội dung của ứng dụng (xem phần giải thích trong [this](https://stackoverflow.com/a/70778444/7121513) answer) và tôi khuyên bạn không nên làm điều đó.
Điểm:0
lá cờ us

Hãy thử cấu hình sau

vị trí /app1/ {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Máy chủ $http_host;
    proxy_redirect tắt;
    proxy_pass http://127.0.0.1:3000/;
}

vị trí /ứng dụng1 {
    trả về 301 /app1/;
}
lewisxy avatar
lá cờ in
Cảm ơn, nó hoạt động. Tuy nhiên, có cách nào để định cấu hình nó để tôi không cần gửi 301 khi máy khách truy cập `/app1` không? Nói cách khác, tôi muốn chuyển hướng ở phía máy chủ hơn là phía máy khách, nếu có thể.
lá cờ us
Bạn có chắc chắn đó là những gì bạn muốn? Sau đó, bạn sẽ có nội dung trùng lặp tại các URL `http://example.com/app1` và `http://example.com/app1/`, đây là một vấn đề đối với SEO.
lewisxy avatar
lá cờ in
Ứng dụng hiện tại tôi đang làm việc chỉ cung cấp API JSON, vì vậy không có trang HTML. Tuy nhiên, tôi không có đủ kinh nghiệm về chủ đề này.Quy ước là gì nếu ứng dụng của tôi là một trang web thực tế? Chúng ta thường thích cái có dấu gạch chéo hay không? Ngoài ra, lựa chọn này ảnh hưởng như thế nào đến các tham số truy vấn (những tham số sau `?`), nếu có?
lá cờ us
Đối số truy vấn độc lập với thành phần đường dẫn của URL, do đó, điều đó không thành vấn đề. Trong các dự án của riêng tôi, tôi thực hiện chuyển hướng 301 từ `/app1` sang `/app1/`, vì chuyển hướng có dấu gạch chéo ở cuối sẽ dễ xử lý hơn ở những vị trí khác nhau.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.