2009-01-16 10 views
17

Il problema che sto avendo riguarda la necessità di mantenere alcuni URL di un sito Web protetti da HTTPS e il resto avviato a HTTP.Rilevamento di richieste HTTPS in PHP

Normalmente, si dispone di $_SERVER['HTTP_HTTPS'] o $_SERVER['HTTPS'] (a seconda del proprio gusto di Apache). Puoi anche controllare la porta: 80 per il traffico normale e 443 per HTTPS.

Il mio problema è che il certificato siede sul loadbalancer, e tutte queste variabili non sono disponibili, e il server web vede http://www.foo.com sulla porta 80. Un modo per risolvere questo problema è quello di raccontare la loadbalancer di inviare il traffico su un diverso porta, ma mi chiedo se ci sono altri modi per rilevare HTTPS provenienti dal bilanciamento del carico?

risposta

14

Se il bilanciamento del carico è l'altra estremità della connessione SSL, non è possibile ottenere più informazioni di quelle fornite dal bilanciamento del carico. Vorrei aggiungere un'intestazione http, potrebbe già farlo, eseguire il dump di tutte le intestazioni HTTP e cercare.

Come un'altra soluzione, è possibile eseguire il reindirizzamento sul bilanciamento del carico in base all'URL.

+0

Sì, buona risposta hayalci. Ho appena esaminato lo stesso problema (su un sito che credo sia bilanciato dal carico) e sembra che l'unico modo per identificare l'utilizzo di HTTPS sia tramite l'intestazione 'HTTP_NOSSL'. Vero significa HTTP, falso significa HTTPS. –

38

Se qualcuno ha lo stesso problema dietro un Load Balancer Amazon AWS Elastic, la soluzione è semplice perché la variabile $_SERVER includerà:

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

Quindi, per ottenere il protocollo, è possibile utilizzare:

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

c'è mai un caso in cui '$ _SERVER ['HTTP_X_FORWARDED_PROTO']' non sarà incluso nella variabile $ _SERVER var? – eipark

+0

@eipark è sicuro dall'intestazione dell'insieme client, ma esiste un ritorno condizionale. – Zaffy

+0

@elpark Fino a quando non sei dietro un bilanciamento del carico aws, direi di no, dal momento che è una funzionalità documentata: http://aws.typepad.com/aws/2010/10/keeping-customers-happy-another-new- elastica-bilanciamento del carico-feature.html. – mrucci

2

$ _SERVER ['HTTP_X_FORWARDED_PROTO'] sembra essere una buona soluzione per gli utenti di joomla perché se il tuo loadbalancer esegue il reindirizzamento e imposti l'impostazione force_ssl su 1 o 2, terminerai in un ciclo infinito perché joomla vede sempre http: