nginx proxy_pass viết lại vị trí tiêu đề phản hồi


11

Mục đích của trường hợp nginx này là để GitLab và OpenWRT Luci chuyển hướng thông qua một proxy ngược. Nó đã hoạt động cho một số trang web khác, tất cả đều có url cơ sở dường như chống lại vấn đề này.

  • GitLab trong ví dụ này là trên máy chủ cục bộ tại cổng 9000.
  • Trang web nginx nằm trên cổng 8080.
  • OpenWRT có cùng một vấn đề, nhưng với / cgi-bin / luci /

Cấu hình nginx có liên quan cho vị trí ví dụ là;

location /gitlab/ {
    proxy_pass http://127.0.0.1:9000/;
    proxy_redirect default;
}
  • Lưu ý rằng các kết quả là giống nhau và không có dấu gạch chéo.

Có một số tùy chọn cấu hình proxy tiêu đề đang được áp dụng cho vị trí này.

# Timeout if the real server is dead
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;

# Basic Proxy Config
proxy_set_header    Host $host:$server_port;
proxy_set_header    Origin $scheme://$host:$server_port;    
proxy_set_header    Connection $http_connection;
proxy_set_header    Cookie $http_cookie;
proxy_set_header    Upgrade $http_upgrade;
proxy_set_header    X-Forwarded-Protocol $scheme;
proxy_set_header    X-Scheme $scheme;
proxy_set_header    X-Real-IP $remote_addr;
proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header    X-Forwarded-Ssl on;
proxy_set_header    X-Frame-Options SAMEORIGIN;

# Advanced Proxy Config
send_timeout            5m;
proxy_read_timeout      300;
proxy_send_timeout      300;
proxy_connect_timeout   300;

proxy_buffers 32 4k;
proxy_buffer_size           4k;
proxy_busy_buffers_size     64k;
proxy_temp_file_write_size  64k;

proxy_http_version 1.1;
proxy_cache_bypass $cookie_session;
proxy_no_cache $cookie_session;]
  • Nhận xét #proxy_set_header Host thay vì chuyển hướng trình duyệt đến https://127.0.0.1:9000/users/sign_in

Khi duyệt đến https://website.com:8080/gitlab/;

GET /gitlab/ HTTP/1.1
Host: website.com:8080

Phản hồi không chính xác quay trở lại /users/sign_inthay vì/gitlab/users/sign_in

HTTP/1.1 302 Found
Cache-Control: no-cache
Connection: keep-alive
Content-Type: text/html; charset=utf-8
Location: https://website.com:8080/users/sign_in

Duyệt thủ công tới https: // website: 8080 / gitlab / users / sign_in tải trang, nhưng không có tài sản nào khi chúng rơi cho đến cùng một vấn đề như trên.

Thất bại tài sản GitLab

Đọc tài liệu nginx , nó gợi ý rằng hành vi proxy mặc định sẽ xử lý tình huống này, mặc dù nó dường như thất bại.

Các bản ghi dường như không hiển thị nhiều.

Những bước bổ sung nào cần được thực hiện để giúp chẩn đoán tại sao điều này có thể xảy ra?

Câu trả lời:


3

Thêm một dấu gạch chéo vào proxy_passmục tiêu của bạn .

Cập nhật: OP không chính xác vhost đã chấp nhận https. Vì lược đồ được chuyển tiếp đến máy chủ phụ trợ với các tiêu đề bổ sung, nên một vấn đề xảy ra do proxy_redirect default;các lệnh nginx mong đợi lược đồ http theo mặc định khi viết lại Locationcác tiêu đề trong trả lời ngược dòng, thay vì https.

Vì vậy, điều này đã được thay đổi rõ ràng thành một hình thức chung hơn (dấu gạch chéo vẫn là cần thiết):

location /gitlab/ {
    proxy_pass http://127.0.0.1:9000/;
    proxy_redirect $scheme://$host:$server_port/ /gitlab/;
}

Xin chào Xavier, cảm ơn bạn đã trả lời. Không có may mắn ở đó. Đó là một trong những điều tôi đã thử (khớp với tài liệu proxy_pass) nhưng không thay đổi :(
Jake Edwards

Tôi đã thêm thông tin về proxy_set_header trong một conf khác. Xóa dòng máy chủ sẽ thay đổi mọi thứ - chuyển hướng đến 127.0.0.1:9000/users/sign_in
Jake Edwards

Ok, vấn đề là scheme(https) với proxy_redirect default hành vi mong đợi http. Hãy để cấu hình như trước khi bình luận tiêu đề Máy chủ và thay đổi proxy_redirectnội dung thành $scheme://$host:$server_port/ /gitlab/;. Đảm bảo bạn không nhấn các tiêu đề được lưu trong bộ nhớ cache của trình duyệt (sử dụng các công cụ cli hoặc điều hướng riêng tư) khi kiểm tra.
Xavier Lucas

Được rồi, tuyệt, vì vậy bây giờ nó đi đến đúng URL (ít nhất là GitLab, OpenWRT vẫn chuyển đến / cgi-bin / luci - mỗi lần một cái). Không có bất kỳ tài sản / images / etc tuy nhiên -: 8080 / tài sản / ứng dụng 5ec1aeb4604cbfbeff836f956308b0ed.js thay vì: 8080 / gitlab / tài sản / ứng dụng 5ec1aeb4604cbfbeff836f956308b0ed.js
Jake Edwards

1
@ShadowXVII Liên kết tài sản được tạo bởi ứng dụng của bạn, bạn phải thay đổi nó ở đó. Nginx sẽ chỉ viết lại các chuyển hướng được phát hành bởi ứng dụng của bạn, không phải nội dung trang.
Xavier Lucas

0

Những gì @XavierLucas nói là chính xác, nên hỗ trợ các liên kết. Tài liệu gitlab có một hướng dẫn dưới tiêu đề Cài đặt GitLab theo một URL tương đối . Tôi đã gặp vấn đề này gần đây trong khi thiết lập một máy chủ linux arch với gitlab và nginx được cài đặt và điều này đã giải quyết vấn đề của tôi bằng cách biên dịch lại tất cả các tài sản để có đường dẫn tương đối chính xác.

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.