Viết lại 302 Máy chủ ứng dụng URL chuyển hướng lại với Proxy Apache ở giữa


8

Tôi có một thiết lập kỳ lạ. Nó trông như thế này:

Browser ----------> HTTPs Proxy ------> Apache HTTP -----> Tomcat AJP
           HTTPS                 HTTP                AJP

Trên proxy HTTPS (một proxy rất ngu ngốc), một URL xuất hiện trông giống như https: //proxy.domain.com/app. Sau đó, nó được chuyển sang Apache bằng cách sử dụng HTTP như http: //apache.domain.com/app (truyền vào máy chủ proxy.domain.com). Sau đó, Apache sẽ yêu cầu cục bộ sử dụng giao thức AJP thành ajp: // localhost: 8009 / app /.

Đôi khi máy chủ ứng dụng muốn chuyển hướng đường dẫn được yêu cầu. Ví dụ: chuyển hướng / ứng dụng / đến / ứng dụng / webapp. Vì vậy, nó sẽ gửi 302 trở lại cho apache chuyển hướng đường dẫn - có thể là một cái gì đó như ajp: // localhost: 8009 / app / webapp. Sau đó, Apache viết lại URL chuyển hướng thành http: //proxy.domain.com/app/webapp. Proxy HTTPS bị câm, do đó, nó không phân tích chuyển hướng và thay đổi http thành https.

Vì vậy, tôi muốn tìm hiểu xem tôi có thể định cấu hình Apache để viết lại URL chuyển hướng 302 để gửi người dùng tới https không.

Đây là cấu hình tôi có cho đến nay trong https.conf của Apache:

ProxyPreserveHost       on
RewriteEngine           on
RewriteRule ^/app$ /app/ [PT]
ProxyPass /app ajp://localhost:8009/app

Tôi đã thử sử dụng ProxyPassReverse , nhưng không thể tìm ra cách buộc nó viết lại URL chuyển hướng 302 bằng https thay vì http.

Có suy nghĩ gì không?

Câu trả lời:


9

Tôi luôn vật lộn với một vấn đề trong nhiều giờ trước khi từ bỏ và đăng câu hỏi - chỉ để giải quyết vấn đề của riêng tôi vài phút sau khi đăng ...

Đối với những người quan tâm, giải pháp không phải là sử dụng ProxyPassReverse , mà là sử dụng chỉ thị Tiêu đề - đó là để bạn gây rối với các tiêu đề bên ngoài. Trong trường hợp này, tôi có thể chụp tiêu đề phản hồi Vị trí và chạy regex trên nó để sửa giao thức của URL:

ProxyPreserveHost       on
RewriteEngine           on
RewriteRule ^/app$ /app/ [PT]
ProxyPass /app ajp://localhost:8009/app
Header edit Location ^http(\:\/\/proxy.*)$ https$1

Voila!

Nếu apache phàn nàn, có thể mod_headers chưa được kích hoạt: a2enmod headers


Không cần chỉnh sửa các tiêu đề, hãy tìm giải pháp @wondy để làm cho tomcat biết về giao thức LB / RProxy thông qua RempteIpValve
Muhammad Hewedy

Tôi đã sử dụng giải pháp này. Tôi thích làm một số cấu hình Apache hơn là làm tomcat làm những gì tôi muốn!
froderik

3

Tôi đã tìm thấy một lựa chọn khác.

Dựa trên /programming/5741210/handling-x-forwarded-proto-in-java-apache-tomcatApache ReverseProxyPass chuyển hướng sang http thay vì https , có vẻ như một số máy chủ nhận ra tiêu đề Giao thức X-Forwarded . Người ta có thể khiến Tomcat nhận ra nó bằng cách thêm:

<Valve className="org.apache.catalina.valves.RemoteIpValve" protocolHeader="x-forwarded-protocol" />

để server.xml.


1
Đây là giải pháp tốt nhất, do đó tomcat được thiết kế để hoạt động theo cách này
Muhammad Hewedy

Tôi nghĩ bạn có ý nghĩa X-Forwarded-Proto.
Michael Hampton

Tôi khá chắc chắn rằng tôi đã sử dụng "Giao thức" và nó đã hoạt động. Nhưng đó là tháng 3 năm 2013. Tôi có thể thấy cả hai phiên bản đã được sử dụng một thời gian. Như tôi có thể thấy trong thời gian đó, một RFC 7239 mới đã được viết (tháng 6 năm 2014). Có lẽ phiên bản "Proto" đã chiến thắng và là tiêu chuẩn bây giờ.
wodny
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.