Làm cách nào để tôi có được nginx để chuyển tiếp các yêu cầu POST HTTP thông qua viết lại?


19

Ứng dụng iOS của tôi hiện đang truy cập tên miền A qua http POST nhưng tôi muốn chuyển tiếp tất cả các yêu cầu đến miền B.

Nếu tôi sử dụng thông thường rewrite ^/(.*)$ http://mydomain/$1 permanent;, dữ liệu POST dường như bị mất.

Làm cách nào tôi có thể truyền dữ liệu POST HTTP sang một tên miền khác bằng NginX?

Câu trả lời:


32

Thay vào đó, hãy thử sử dụng hỗ trợ proxy ngược . Một locationphần ví dụ sẽ là:

location / {
  proxy_pass      http://localhost:8080;
  proxy_redirect  http://localhost:8080/ /;
  proxy_read_timeout 60s;

  # May not need or want to set Host. Should default to the above hostname.
  proxy_set_header          Host            $host;
  proxy_set_header          X-Real-IP       $remote_addr;
  proxy_set_header          X-Forwarded-For $proxy_add_x_forwarded_for;
}

Ví dụ này sẽ chuyển qua tất cả các yêu cầu đến serverkhối này đến máy chủ thứ hai đang chạy localhost:8080. Điều này bảo tồn POSTvà cũng nên bảo tồn các loại yêu cầu khác nếu nó trở thành một vấn đề.

Vấn đề là các chuyển hướng bên ngoài sẽ không bao giờ gửi lại POSTdữ liệu. Điều này được ghi vào thông số HTTP (kiểm tra phần 3xx). Bất kỳ khách hàng nào làm điều này là vi phạm thông số kỹ thuật.

Nếu mã trạng thái 301/302 được nhận để đáp ứng yêu cầu không phải là GET hoặc HEAD, tác nhân người dùng KHÔNG được tự động chuyển hướng yêu cầu trừ khi người dùng có thể xác nhận, vì điều này có thể thay đổi các điều kiện theo đó yêu cầu được đưa ra .

Tôi khá chắc chắn rằng hầu hết các trình duyệt thực hiện điều này bằng cách đơn giản buộc yêu cầu được chuyển hướng là một GETyêu cầu. Về mặt lý thuyết, thông số kỹ thuật cho phép một trình duyệt sẽ hỏi người dùng có chuyển hướng POSTdữ liệu hay không, nhưng tôi không biết bất kỳ điều gì hiện đang làm.


khủng khiếp hoạt động như một bùa mê
Jiho Kang

một chút bối rối từ bình luận. Tôi thường muốn đặt các proxy_set_headergiá trị? Nếu không, tôi đoán rằng địa chỉ từ xa trở thành địa chỉ từ xa của máy chủ proxy nhưng điều tôi thường muốn là địa chỉ từ xa của máy khách, đúng không?
Georgios Pligoropoulos

Cảm ơn câu trả lời đã cứu tôi! Có cách nào để thiết lập nginx để nó chuyển các yêu cầu bài đăng chính xác trở lại uwsgi nhưng với các socket thay vì chạy uwsgi trong chế độ http?
Greg Jennings

@GregJennings Một chút muộn để trả lời, nhưng người ta sẽ sử dụng chỉ thị 'uwsgi_pass' thay vì 'proxy_pass'. Chỉ trong trường hợp người khác đi lang thang bằng cách tìm kiếm ...
Kamgroup

1
@ Sẽ proxy_redirectcó hai đối số. Xem các tài liệu: nginx.org/en/docs/http/ từ
Matthew Scharley
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.