Reverse Proxy - Xóa thư mục con


27

Trong tương lai gần tôi sẽ có 3 máy chủ nginx. Một là proxy ngược cho SSL cho hai cái còn lại. Vì vậy, ví dụ, tôi đi đến:

https://www.mysitename.com/site1

Hai máy chủ khác trong ví dụ này là site1 và site2. Tôi đã cài đặt chứng chỉ SSL trên proxy và tôi muốn sử dụng proxy ngược (không yêu cầu SSL vì cả 3 đều nằm trong mạng nội bộ). Mục đích thử nghiệm của tôi là tôi có nginx nghe trên 443 cho SSL / proxy ngược cổng 8081 là một ứng dụng đường ray cho trang web1 và 8082 là cho trang web2.

Tôi có cái này ...

server {
    listen                  443;
    server_name             mysitename.com;

    ssl                     on;
    ssl_certificate         ssl/mysitename.com.crt;
    ssl_certificate_key     ssl/mysitename.com.key;
    keepalive_timeout       60;

    location /site1 {
        proxy_pass http://localhost:8081;
        proxy_set_header    Host            $host;
        proxy_set_header    X-Real-IP       $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_redirect http:// https://;
    }

    location /site2 {
        proxy_pass http://localhost:8082;
        proxy_set_header    Host            $host;
        proxy_set_header    X-Real-IP       $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_redirect http:// https://;
    }
}

Vì vậy, khi tôi truy cập www.mysitename.com/site1, tôi muốn nó về cơ bản trả về những gì thường đến từ localhost: 8081 (hoặc sau đó xuống dòng IP nội bộ cho một máy chủ khác).

Có cách nào để loại bỏ "site1" khỏi cuộc gọi localhost không? Những gì nó dường như đang làm là sử dụng localhost: 8081 / site1. Các trang web site1 và site2 có bản chất "/ login / index" hoặc "/ anything / list", v.v., không có "site1".

Ngoài ra còn có các chuyển hướng trong bộ điều khiển trang web (sử dụng redirect_to) đi từ những thứ như / login / index đến / anything / list.

Tôi có phải thiết kế lại URL của trang để sử dụng trang1 không? Hoặc proxy NGINX có thể tìm ra nó?

Cảm ơn.


Đối với Socket.io, hãy thử điều này chỉ cần thêm viết lại /(.*) /socket.io/ break; serverfault.com/questions/444532/
trộm

Câu trả lời:


53

Trích dẫn http://nginx.org/r/proxy_pass :

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

location /name/ {
    proxy_pass http://127.0.0.1/remote/;
}

Đó là, bạn phải sử dụng proxy_passnhư thế này:

location /site1/ {
    proxy_pass http://localhost:8081/;
    ...
}

Lưu ý dấu vết /trong proxy_passchỉ thị - nó sẽ thay thế một phần của URI gốc khớp với vị trí, nghĩa là /site1/.


2
Tất cả chỉ là một dấu gạch chéo để khắc phục vấn đề!? Cảm ơn vì điều đó. Bây giờ để tìm hiểu làm thế nào tôi sẽ xử lý redirect_to - nhưng đó không phải là một câu hỏi máy chủ vì vậy tôi sẽ tìm ra điều đó ở nơi khác.
Chromag

lưu ý, bạn cũng cần dấu gạch chéo trên URL proxy_pass!
Đồi Daniel
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.