2009-01-16 15 views
17

Problem, który mam, ma związek z koniecznością utrzymywania adresów URL witryny chronionej przez HTTPS, a reszta jest kopią HTTP.Wykrywanie żądań HTTPS w PHP

Zazwyczaj masz $_SERVER['HTTP_HTTPS'] lub $_SERVER['HTTPS'] (w zależności od Twojego smaku Apache). Możesz także sprawdzić port - w przypadku zwykłego ruchu wynosi 80, a w przypadku HTTPS - 443.

Moim problemem jest to, że certyfikat siedzi na loadbalancer, a wszystkie te zmienne są niedostępne, a serwer WWW widzi http://www.foo.com na porcie 80. Jednym ze sposobów, aby to naprawić to powiedzieć loadbalancer wysłać ruch na inny port, ale zastanawiam się, czy istnieją inne sposoby na wykrycie HTTPS pochodzącego z load balancera?

Odpowiedz

14

Jeśli moduł równoważenia obciążenia jest drugim końcem połączenia SSL, nie można uzyskać więcej informacji niż udostępnia to narzędzie równoważenia obciążenia. Chciałbym dodać nagłówek http, może już to robię, zrzucić wszystkie nagłówki HTTP i wyglądać.

Jako kolejne rozwiązanie można wykonać przekierowanie w module równoważenia obciążenia na podstawie adresu URL.

+0

Tak, dobra odpowiedź hayalci. Właśnie patrzyłem na ten sam problem (na stronie, która moim zdaniem jest również zrównoważona pod względem obciążenia) i wydaje się, że jedynym sposobem, w jaki mogę zidentyfikować użycie HTTPS, jest użycie nagłówka 'HTTP_NOSSL'. True oznacza HTTP, false oznacza HTTPS. –

38

Jeśli ktoś ma ten sam problem za jeden równoważenia obciążenia Amazon AWS Elastic, rozwiązanie jest proste, ponieważ zmienna $_SERVER obejmie:

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

Tak więc, aby uzyskać protokół, można użyć:

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

Czy istnieje przypadek, w którym '$ _SERVER ['HTTP_X_FORWARDED_PROTO']' nie zostanie uwzględnione w zmiennej $ _SERVER? – eipark

+0

@eipark na pewno od swojego nagłówka zestawu klienckiego, ale istnieje warunkowy powrót. – Zaffy

+0

@elpark Dopóki nie stoisz za balancer obciążenia aws, powiedziałbym, że nie, ponieważ jest to udokumentowana funkcja: http://aws.typepad.com/aws/2010/10/keeping-customers-happy-another-new- elastyczny-load-balancer-feature.html. – mrucci

2

$ _SERVER [ „HTTP_X_FORWARDED_PROTO”] wydaje się być dobrym rozwiązaniem dla użytkowników joomla bo jeśli loadbalancer robi rediretion i ustawić force_ssl ustawienie 1 lub 2 wtedy kończy w nieskończonej pętli, ponieważ joomla zawsze widzi http:

Powiązane problemy