Điểm:1

Làm cách nào để ủy quyền toàn bộ url tại cấu hình nginx?

lá cờ ve

Tôi cần các địa điểm proxy /v1/api/ sang một url khác như:

vị trí /api/v1/ {
        proxy_pass http://frontend-api.preprod.my-app.com/api/v1/;
    }

tuy nhiên, ở dòng chính, chỉ nhận được slug:

"NHẬN /api/v1/ HTTP/1.1" 404 209 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, như Gecko) Chrome/96.0.4664.110 Safari/537.36"

vì ngược dòng được cấu hình cho miền cụ thể frontend-api.preprod.my-app.com:

người phục vụ {
    nghe 80;
    server_name frontend-api.preprod.my-app.com;

   địa điểm / {
      gốc /var/www/frontend_api/current/public;

      # Bật hành khách
      hành_khách bật;
      hành khách_ruby /home/deploy/.rvm/gems/ruby-2.7.2/wrappers/ruby;
    }

}

kết quả cuối cùng là 404, Làm cách nào để định cấu hình proxy_pass tại máy chủ proxy để gửi máy chủ, để máy chủ nhận nhận được toàn bộ url thay vì chỉ /api/v1/ ?

Điểm:2
lá cờ us

tài liệu nginx giải thích hành vi:

Nếu lệnh proxy_pass được chỉ định bằng URI, thì khi yêu cầu được chuyển đến máy chủ, phần của URI yêu cầu được chuẩn hóa khớp với vị trí sẽ được thay thế bằng URI được chỉ định trong lệnh:

Trong trường hợp của bạn, điều đó có nghĩa là URI yêu cầu được thay thế bằng /api/v1/ URI được chỉ định trong proxy_pass chỉ thị.

Nếu bạn muốn URI được chuyển nguyên trạng, thì bạn cần thực hiện:

vị trí /api/v1/ {
    proxy_pass http://frontend-api.preprod.example.com;
}

Trong trường hợp này, nginx sử dụng URI từ yêu cầu ban đầu với proxy_pass điểm đến, như được mô tả bởi:

Nếu proxy_pass được chỉ định mà không có URI, thì URI yêu cầu sẽ được chuyển đến máy chủ ở dạng giống như được gửi bởi ứng dụng khách khi yêu cầu ban đầu được xử lý hoặc URI yêu cầu chuẩn hóa đầy đủ được chuyển khi xử lý URI đã thay đổi:

Nếu bạn muốn thay thế một phần của URI yêu cầu bằng một phần khác, bạn cần sử dụng tính năng chụp biểu thức chính quy:

vị trí ~ ^/nguồn/đường dẫn/(.*) {
    proxy_pass http://example.com/destination/path/$1;
}

Chỉnh sửa:

Để có được tên miền của yêu cầu ban đầu được chuyển đến thượng nguồn, người ta cần đặt Chủ nhà Tiêu đề HTTP cho yêu cầu ngược dòng:

proxy_set_header Máy chủ lưu trữ $host;

Việc chuyển địa chỉ IP của khách truy cập qua tiêu đề thường rất hữu ích:

proxy_set_header X-Forwarded-For $remote_addr;
simo avatar
lá cờ ve
Tôi đã thử `proxy_pass http://frontend-api.preprod.example.com;` nhưng ở phía bên kia, tôi vẫn nhận được kết quả tương tự. Tôi không gặp vấn đề gì với việc chuyển slug, vấn đề là url cơ sở không được chuyển, chỉ `/api/v1/` được nhìn thấy ở máy chủ nhận chứ không phải `http://frontend-api.preprod. example.com/api/v1/`
lá cờ us
Bạn không thể chuyển URL đầy đủ dưới dạng URI tới yêu cầu tới chương trình phụ trợ. Để lấy tên máy chủ, bạn cần sử dụng các tiêu đề HTTP. Tôi đã thêm một ví dụ vào câu trả lời.
simo avatar
lá cờ ve
Cảm ơn, tôi đã thử đặt tiêu đề Máy chủ thành $host, tuy nhiên, sau đó, tôi không thể thấy nhật ký trong access.log của nginx người nhận!
lá cờ us
Sau đó, cài đặt tên máy chủ ảo của bạn trong bộ thu nginx là không chính xác.
simo avatar
lá cờ ve
Cảm ơn bạn, đã có một vấn đề ..

Đă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.