2010-05-03 25 views
34

Un ex sviluppatore ha scritto o API client-server in PHP. Invia semplicemente messaggi come xml usando post/risposta in modo molto semplicistico. Il problema è che anche quando c'è un errore (es: argomenti non validi passati nel lato server) otteniamo una risposta HTTP 200 con una pagina come questaCome faccio a rendere la pagina php restituire un errore 503 (o qualsiasi cosa non-200)

<h4>Unknown error!</h4> 

In Firebug posso vedere che la realtà HTTP di risposta è a 200. Come possiamo inviare una risposta diversa (es: 503) quando rileviamo in modo programmatico nel nostro codice php che è opportuno farlo.

risposta

71

Utilizzare la funzione di PHP header per inviare il codice (insieme alla versione HTTP e alle altre intestazioni necessarie). Maggiori informazioni complete:

When to send HTTP status code?

http://php.net/manual/en/function.header.php

http://en.wikipedia.org/wiki/List_of_HTTP_status_codes

header('HTTP/1.1 503 Service Temporarily Unavailable'); 
header('Status: 503 Service Temporarily Unavailable'); 
header('Retry-After: 300');//300 seconds 
+7

Perché si codifica l'assunzione di HTTP/1.1 in? Cosa succede se il client sta usando HTTP 1.0? – Pacerier

+0

@Pacerier, quindi cosa faresti? Come scriverei questo in modo che copra sia HTTP 1.0 che HTTP 1.1? Tutti gli esempi mostrano come indicato nella risposta – Inigo

+1

Credo intestazione '$ _ SERVER [" SERVER_PROTOCOL "]." 503 Servizio temporaneamente non disponibile ");'? – Inigo

2

In cima allo script (o realmente, prima di qualsiasi output viene inviato come risposta):

<?php header("HTTP/1.0 404 Not Found"); o qualsiasi altro HTTP status code.

+4

Questa si basa sulla capacità di PHP per mappare il codice di stato dal tipo di intestazione (gestione speciale e minuscole) - in realtà dovrebbe essere di intestazione ("HTTP/1.0 404 Not Found", vero, 404) – symcbean

+0

@symcbean Nizza , Non l'ho mai notato. Grazie! – chelmertz

0

Una buona classe per il raggiungimento di questo può essere trovato qui: http://www.krisjordan.com/php-class-for-http-response-status-codes/ - usare in questo modo (prima di qualsiasi altro output):

<?php header(StatusCodes::httpHeaderFor(503)); ?> 
+1

È preferibile utilizzare qualcosa come' symfony/http-foundation' https://symfony.com/doc/current/components/http_foundation.html – LONGMAN

3

Ho lavorato su un sito che era stato violato e ha dovuto usare HTACCESS per farlo.

<IfModule mod_rewrite.c> 

RewriteEngine on 

# let this (iescaped) IP address see the real site: 
# RewriteCond %{REMOTE_ADDR} !^123.45.67.89 

RewriteCond %{REQUEST_URI} !/maintenance.php$ [NC] 

RewriteCond %{REQUEST_URI} !.(jpe?g?|png|gif|css|js) [NC] 

RewriteRule .* /maintenance.php [R=503,L] 

</IfModule> 
Problemi correlati