nginx proxy vượt qua chuyển hướng bỏ qua cổng


34

Vì vậy, tôi đang thiết lập một đường dẫn ảo khi trỏ vào ứng dụng node.js trong conf nginx của tôi. phần có liên quan trông như vậy:

location /app {
  rewrite /app/(.*) /$1 break;
  proxy_pass http://localhost:3000;
  proxy_redirect off;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Hoạt động rất tốt, ngoại trừ khi ứng dụng node.js của tôi (một ứng dụng cấp tốc) gọi chuyển hướng.

Ví dụ, hộp dev đang chạy nginx trên cổng 8080 và do đó, url của thư mục gốc của ứng dụng nút trông giống như:

http: // localhost: 8080 / ứng dụng

Khi tôi gọi chuyển hướng đến '/ app' từ nút, chuyển hướng thực tế sẽ đến:

http: // localhost / ứng dụng


Dưới đây là một số câu trả lời đề nghị sử dụng: proxy_set_header Host $ http_host; Nhưng không ai nói rằng nó có thể gây ra lỗ hổng (tấn công tiêu đề máy chủ). Ví dụ tấn công ở đây Và thêm thông tin ở đây

Câu trả lời:


14

Vấn đề là ứng dụng Node.js không đưa ra chuyển hướng chính xác. Bạn có thể sử dụng proxy_redirectđể sửa lỗi này trong nginx:

proxy_redirect http://localhost/ http://localhost:8080/;

47

Tôi chỉ phải giải quyết vấn đề tương tự với Jenkins chạy đằng sau nginx. Điều đã làm cho tôi là đưa cổng máy chủ vào Hosttiêu đề được gửi tới Jenkins:

proxy_set_header Host $host:$server_port;

Mong rằng sẽ giúp.


3
Chơi lô tô. như @mgorven nói, nút đang thiết lập chuyển hướng không tốt, bởi vì nginx đang chuyển tiếp máy chủ rất tệ
Eric

5

Tôi đã thử các giải pháp trên, nhưng tất cả đều thất bại bất cứ khi nào ứng dụng nút đưa ra một URL đủ điều kiện trong tiêu đề vị trí, chẳng hạn như " http: // nod Ứng dụng.com: 8080 / new / lay "

Vì vậy, tôi sử dụng $ http_host để vượt qua máy chủ và cổng. Và sử dụng một trận đấu ~ ^ để viết lại các url hoàn toàn.

  proxy_pass http://10.0.0.3:8080;

  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header Host $http_host;

  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  proxy_redirect default;
  proxy_redirect ~^(https?://[^:]+):\d+(?<relpath>/.+)$ http://10.0.0.3:8000$relpath;

Trong trường hợp của chúng tôi, máy chủ Node đang chạy trên 8080 và proxy nginx của chúng tôi đang chạy trên 8000. Điều này có nghĩa là mọi URL đủ điều kiện trong tiêu đề vị trí cần phải được viết lại. Hy vọng điều này sẽ giúp được ai đó !!


4

Theo cuộc hội thoại về câu hỏi này , độ phân giải phù hợp là điều chỉnh Hostchỉ thị tiêu đề của proxy .

Thay đổi điều này:

proxy_set_header Host $host;

Về điều này:

proxy_set_header Host $http_host;

$http_hostgiữ giá trị như được chỉ định trong tiêu đề HTTP HOST, bao gồm cổng. Chuyển hướng nên chọn cổng tùy chỉnh mà không cần tùy chỉnh thêm cho thiết lập của OP.

Những câu trả lời (cùng một vé) giải thích thêm:

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.