2014-06-24 21 views
6

Con php posso vedere l'indice "REDIRECT_STATUS" nell'array $ _SERVER ma php.net non ne parla. Ho una pagina di errore personalizzata che genera un 404 ma "REDIRECT_STATUS" è ancora 200. Quindi a che cosa si riferisce esattamente il codice di stato?

+3

[** 'Questo dovrebbe far luce» **] (http://www.php.net//manual/en/reserved.variables.server.php#105602) (tratto da php.net $ _SERVER manuale) – Darren

+0

Sì, l'ho visto, ma in realtà non spiega molto in un modo che io possa capire. – billynoah

+1

Queste variabili provengono da qualsiasi cosa stia eseguendo PHP ... nel tuo caso, probabilmente il tuo server web. Che server stai usando? – Brad

risposta

1

Non ho mai usato questa intestazione HTTP prima, ma quello che posso capire sull'URL che @Darren ha pubblicato è che puoi indicare tutti i tuoi errori (quegli errori che risultano in un'intestazione HTTP 4xx o 5xx) a solo un file php. E in quel file php puoi sapere quale specifico errore si verifica accedendo a questa intestazione HTTP REDIRECT_STATUS.

+0

'REDIRECT_STATUS' non è una" intestazione HTTP ". Le intestazioni delle richieste HTTP sono trasformate in 'HTTP_

' elementi nella matrice '$ _SERVER'. 'REDIRECT_STATUS' è impostato dal server (PHP quindi fa il suo dovere per renderlo disponibile anche nel superglobale' $ _SERVER'). Nel caso di Apache questa è una variabile di ambiente che viene impostata ogni volta che c'è un subrequest interno (che include le riscritture, ma non i reindirizzamenti) ed è impostato sul codice di stato HTTP in caso di errore (un sottorequest interno nel caso di un documento di errore personalizzato). – MrWhite

3

Il php-src code suggerisce la documentation link, vale a dire

<p>For more information as to <i>why</i> this behaviour exists, 
see the <a href=\"http://php.net/security.cgi-bin\">\ 
manual page for CGI security</a>.</p>\n\ 

leggere di sicurezza CGI. Con la variabile REDIRECT_STATUS - non è un'intestazione HTTP ma una variabile passata dal server web al programma CGI, in questo caso il processo php-cgi o php-fpm - si dice al processo php-cgi o php-fpm che la richiesta è stata elaborata dal server Web in modo controllato e non in qualche modo, accedendo direttamente a questi script CGI.

Storicamente il server Web è stato configurato per gestire i file binari CGI in una directory speciale, ad esempio $DOCROOT/cgi-bin, e hai reso accessibili tutti gli script CGI tramite qualche URL http://SERVERNAME/cgi-bin/.

Ora, se si chiama un programma CGI PHP tramite un URL (diretto) http://SERVERNAME/cgi-bin/php-cgi/PATH_TO_PHP_SCRIPT, il comportamento predefinito di php-cgi è elaborare il documento /PATH_TO_PHP_SCRIPT e quindi potrebbe ignorare i controlli di accesso dei server Web. Il documento /PATH_TO_PHP_SCRIPT verrà elaborato, anche se il server potrebbe non consentire/PATH_TO_PHP_SCRIPT, poiché la richiesta ha già lasciato il server Web e inserito il processo PHP. Con l'aiuto di php, un server di questo tipo avrebbe perso le informazioni e avresti avuto bisogno di un altro livello di controllo di accesso per tutti gli script PHP.

Per interrompere questo comportamento è possibile configurare il programma PHP-CGI in modo che gestisca solo le richieste che impostano l'intestazione REDIRECT_STATUS, impossibile per un client esterno, da impostare nella richiesta diretta. Solo il server web, nel mezzo tra client e php, può impostare questa intestazione e il server Web suggerisce uno stato HTTP, ad esempio 200, 404, 403 o quello che ti piace, e consente a PHP di elaborare questo stato. Ma anche la pura esistenza di questa intestazione informa il processo PHP, che la richiesta è stata elaborata in modo regolare dal server web.

Opinione: Il modo migliore per proteggersi da un tale uso sarebbe, per configurare il server Web per non consentire chiamate dirette a PHP CGI attraverso un/cgi-bin/percorso predefinito.

Problemi correlati