2009-01-16 40 views
17

Sự cố mà tôi đang gặp phải có liên quan đến việc cần giữ một số url của trang web được HTTPS bảo vệ và phần còn lại được khởi động cho HTTP.Phát hiện các yêu cầu HTTPS trong PHP

Thông thường, bạn có $_SERVER['HTTP_HTTPS'] hoặc $_SERVER['HTTPS'] (tùy thuộc vào hương vị của Apache). Bạn cũng có thể kiểm tra cổng - 80 cho lưu lượng truy cập thông thường và 443 cho HTTPS.

Vấn đề của tôi là giấy chứng nhận ngồi trên loadbalancer, và tất cả các biến này không có sẵn, và các máy chủ web thấy http://www.foo.com trên cổng 80. Một cách để khắc phục điều này là để nói với loadbalancer để gửi lưu lượng trên một khác nhau cổng, nhưng tôi tự hỏi nếu có những cách khác để phát hiện HTTPS đến từ cân bằng tải?

Trả lời

14

Nếu bộ cân bằng tải là đầu kia của kết nối SSL, bạn không thể nhận thêm bất kỳ thông tin nào ngoài bộ cân bằng tải một cách rõ ràng cung cấp. Tôi sẽ đi cho thêm một tiêu đề http, nó có thể đã được làm điều đó, đổ tất cả các tiêu đề HTTP và xem xét.

Là một giải pháp khác, bạn có thể thực hiện chuyển hướng trên bộ cân bằng tải dựa trên URL.

+0

Đúng, câu trả lời hay hayci. Tôi vừa xem xét cùng một vấn đề này (trên một trang web mà tôi tin là cũng được cân bằng tải) và dường như cách duy nhất tôi có thể xác định việc sử dụng HTTPS là thông qua tiêu đề 'HTTP_NOSSL'. Đúng nghĩa là HTTP, sai nghĩa là HTTPS. –

38

Nếu ai có cùng một vấn đề đằng sau một Amazon AWS đàn hồi cân bằng tải, giải pháp là đơn giản bởi vì các biến $_SERVER sẽ bao gồm:

[HTTP_X_FORWARDED_PORT] => 443 
[HTTP_X_FORWARDED_PROTO] => https 

Vì vậy, để có được những giao thức, bạn có thể sử dụng:

function getRequestProtocol() { 
    if(!empty($_SERVER['HTTP_X_FORWARDED_PROTO'])) 
     return $_SERVER['HTTP_X_FORWARDED_PROTO']; 
    else 
     return !empty($_SERVER['HTTPS']) ? "https" : "http"; 
} 
+2

có bao giờ xảy ra trường hợp '$ _SERVER ['HTTP_X_FORWARDED_PROTO']' không được bao gồm trong biến $ _SERVER không? – eipark

+0

@eipark chắc chắn vì tiêu đề được thiết lập bởi khách hàng của nó, nhưng có lợi tức có điều kiện. – Zaffy

+0

@elpark Cho đến khi bạn đứng sau một cân bằng tải aws, tôi sẽ nói không, vì nó là một tính năng được ghi lại: http://aws.typepad.com/aws/2010/10/keeping-customers-happy-another-new- elastic-load-balancer-feature.html. – mrucci

2

$ _SERVER ['HTTP_X_FORWARDED_PROTO'] có vẻ là giải pháp tốt cho người dùng Joomla vì nếu loadbalancer của bạn thực hiện chuyển hướng và bạn đặt cài đặt force_ssl thành 1 hoặc 2 thì bạn sẽ kết thúc trong vòng lặp vô hạn vì joomla luôn thấy http:

Các vấn đề liên quan