Nginx chuyển hướng proxy ngược


13

Tôi đang sử dụng nginxnhư một proxy ngược và khi tôi đăng nhập vào giao diện web của mình, tôi được chuyển hướng đến URL được ủy quyền. Tôi muốn tránh nó và luôn giữ "server_name" làm URL. Có thể không?

Đây là của tôi /etc/nginx/conf.d/my_app.conf:

server { 
    listen 443 ssl; 
    server_name my-app.net; 
    ssl_certificate /etc/pki/tls/certs/my-app.cer; 
    ssl_certificate_key /etc/pki/tls/private/my-app.key; 
    ssl_protocols TLSv1.1 TLSv1.2; 
    access_log /var/log/nginx/my-app.access.log main; 

    location / { 
        proxy_pass http://ip_of_the_app:7180/; 
        proxy_redirect off; 
    } 
} 

Tôi kết nối http://my-app.net, nhập thông tin đăng nhập, sau đó tôi được chuyển hướng đến http://ip_of_the_app:7180cùng một trang đăng nhập và tôi phải đăng nhập lại. Có thể tránh đăng nhập kép này?


tonio94, vấn đề của bạn đã được giải quyết chưa? nếu có, xin vui lòng chấp nhận câu trả lời. nếu không, xin vui lòng làm rõ những gì còn thiếu.
cnst

2
Tôi mới kiểm tra nó ngày hôm qua, nó hoạt động, proxy_redirect cần phải được gỡ bỏ. Cảm ơn đã giúp đỡ.
tonio94

Câu trả lời:


25

Đừng đặt proxy_redirectra off, đó là không làm những gì bạn nghĩ nó đang làm. proxy_redirectthực hiện một cái gì đó tương tự như viết lại URL, ví dụ:

location /sales/ { 
    proxy_pass http://ip_of_the_app:7180/; 
    proxy_redirect http://ip_of_the_app:7180/ http://$host/sales/; 
}

Điều này cho phép bạn lưu trữ /sales/đường dẫn ở một nơi khác. Nhưng ngay cả sau đó, các tham số mặc định để proxy_redirectlàm chính xác điều đó cho bạn miễn phí. Mặc định là chuyển hướng vị trí vào bất cứ thứ gì có trong proxy_pass(và các tham số mặc định được sử dụng khi bạn hoàn toàn không đặt proxy_redirecthoặc sử dụng proxy_redirect default;).

Bạn không cần phải thiết lập proxy_redirect.


Những gì bạn đang thiếu là các tiêu đề cần được gửi đến ứng dụng. Điều quan trọng nhất trong số đó là HOST. Điều này sẽ thực hiện ủy quyền như mong muốn và sẽ giữ đúng URL trong trình duyệt.

location / { 
    proxy_pass http://ip_of_the_app:7180/; 
    proxy_set_header HOST $host;
}

Lưu ý rằng ứng dụng lúc http://ip_of_the_app:7180/này sẽ nhận được yêu cầu với Host: my-app.nettiêu đề.


Bạn cũng nên xem xét sử dụng một vài tiêu đề:

proxy_set_header Referer $http_referer;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;

Điều này sẽ cho phép đăng nhập tốt hơn trong ứng dụng tại http://ip_of_the_app:7180/. X-Forwarded-Forcung cấp IP của máy khách thực tế (trái ngược với nginxIP s) và X-Forwarded-Protođể kiểm tra xem máy khách có được kết nối với nginxHTTP hoặc HTTPS hay không.


Cảm ơn bạn đã giúp đỡ. proxy_redirect không cần thiết nhưng proxy_set_header Tham chiếu ip_of_the_app : 7180 phải được đặt để hoạt động chính xác.
tonio94

@ tonio94 - Cảm ơn, tôi đã cập nhật câu trả lời. Lưu ý rằng việc sử dụng bình thường Refererchỉ đơn giản là $http_referersao chép nó từ yêu cầu. Điều đó không hoạt động nếu yêu cầu không có tiêu đề Người giới thiệu, do đó, mã hóa cứng là một giải pháp trong một số trường hợp.
hóa dầu

@JonathanKomar - Cảm ơn bạn vì điều đó, bạn đã đúng, hiện đã được chỉnh sửa. Xin lỗi nó đã cho tôi một thời gian để nhận thấy bình luận của bạn.
hóa dầu
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.