Eu tenho um script PHP que precisa responder com códigos de resposta HTTP (status-codes), como HTTP 200 OK ou algum código 4XX ou 5XX.
Como posso fazer isso em PHP?
fonte
Eu tenho um script PHP que precisa responder com códigos de resposta HTTP (status-codes), como HTTP 200 OK ou algum código 4XX ou 5XX.
Como posso fazer isso em PHP?
Acabei de encontrar esta pergunta e achei que precisava de uma resposta mais abrangente:
No PHP 5.4, existem três métodos para fazer isso:
A header()
função possui um caso de uso especial que detecta uma linha de resposta HTTP e permite substituí-la por uma personalizada
header("HTTP/1.1 200 OK");
No entanto, isso requer tratamento especial para o PHP CGI (rápido):
$sapi_type = php_sapi_name();
if (substr($sapi_type, 0, 3) == 'cgi')
header("Status: 404 Not Found");
else
header("HTTP/1.1 404 Not Found");
Nota: De acordo com o HTTP RFC , a frase de razão pode ser qualquer sequência personalizada (que esteja em conformidade com o padrão), mas, para fins de compatibilidade do cliente , não recomendo colocar uma sequência aleatória lá.
Nota: php_sapi_name()
requer PHP 4.0.1
Obviamente, existem alguns problemas ao usar essa primeira variante. O maior dos quais eu acho é que ele é parcialmente analisado pelo PHP ou pelo servidor da Web e mal documentado.
Desde 4.3, a header
função possui um terceiro argumento que permite definir o código de resposta de maneira confortável, mas usá-lo exige que o primeiro argumento seja uma sequência não vazia. Aqui estão duas opções:
header(':', true, 404);
header('X-PHP-Response-Code: 404', true, 404);
Eu recomendo o segundo . O primeiro faz o trabalho em todos os navegadores que eu testei, mas alguns navegadores menores ou rastreadores da web pode ter um problema com uma linha de cabeçalho que contém apenas dois pontos. O nome do campo de cabeçalho no 2º. é claro que a variante não é padronizada de nenhuma maneira e pode ser modificada. Acabei de escolher um nome que se espera ser descritivo.
A http_response_code()
função foi introduzida no PHP 5.4 e facilitou muito as coisas .
http_response_code(404);
Isso é tudo.
Aqui está uma função que eu criei quando precisava de compatibilidade abaixo da versão 5.4, mas queria a funcionalidade da função "nova" http_response_code
. Eu acredito que o PHP 4.3 é mais do que suficiente compatibilidade com versões anteriores, mas você nunca sabe ...
// For 4.3.0 <= PHP <= 5.4.0
if (!function_exists('http_response_code'))
{
function http_response_code($newcode = NULL)
{
static $code = 200;
if($newcode !== NULL)
{
header('X-PHP-Response-Code: '.$newcode, true, $newcode);
if(!headers_sent())
$code = $newcode;
}
return $code;
}
}
header('X-PHP-Response-Code: 404', true, 404);
funciona corretamente em PHP-FPM (FastCGI)headers_sent()
sempre é verdade depois de ligarheader()
? (2) alguma vez encontrou algo como http_response_text () no mundo 5.4? Pelo menos o cabeçalho antigo () pode afetar o texto após o código de status.headers_sent()
é verdadeiro se você não puder adicionar mais cabeçalhos porque o conteúdo já foi enviado, não se você tiver adicionado um cabeçalho. (2) Desculpe, não. Outros idiomas têm melhor suportehttp_response_code
(e talvez mais geralmente modificando o cabeçalho) não funciona mais depois de vocêecho
alguma coisa. Espero que ajude.Infelizmente, encontrei as soluções apresentadas pela @dualed com várias falhas.
O uso
substr($sapi_type, 0, 3) == 'cgi'
não é suficiente para detectar CGI rápido. Ao usar o FastCGI Process Manager do PHP-FPM,php_sapi_name()
retorna fpm não cgiFasctcgi e php-fpm expõem outro bug mencionado por @Josh - o uso
header('X-PHP-Response-Code: 404', true, 404);
funciona corretamente no PHP-FPM (FastCGI)header("HTTP/1.1 404 Not Found");
pode falhar quando o protocolo não é HTTP / 1.1 (ou seja, 'HTTP / 1.0'). O protocolo atual deve ser detectado usando$_SERVER['SERVER_PROTOCOL']
(disponível desde o PHP 4.1.0Existem pelo menos 2 casos ao chamar
http_response_code()
resultam em comportamento inesperado:Para sua referência aqui, há a lista completa de códigos de status de resposta HTTP (esta lista inclui códigos dos padrões da Internet IETF e de outras RFCs da IETF. Muitos deles NÃO são atualmente suportados pela função http_response_code do PHP): http: //en.wikipedia .org / wiki / List_of_HTTP_status_codes
Você pode facilmente testar esse bug chamando:
O servidor enviará o código de resposta HTTP "500 Internal Server Error", resultando em erros inesperados se você tiver, por exemplo, um aplicativo cliente personalizado ligando para o servidor e esperando alguns códigos HTTP adicionais.
Minha solução (para todas as versões do PHP desde 4.1.0):
Conclusão
A implementação http_response_code () não suporta todos os códigos de resposta HTTP e pode substituir o código de resposta HTTP especificado por outro do mesmo grupo.
A nova função http_response_code () não resolve todos os problemas envolvidos, mas piora a introdução de novos bugs.
A solução de "compatibilidade" oferecida pelo @dualed não funciona como esperado, pelo menos no PHP-FPM.
As outras soluções oferecidas pelo @dualed também possuem vários bugs. A detecção rápida de CGI não suporta PHP-FPM. O protocolo atual deve ser detectado.
Quaisquer testes e comentários são apreciados.
fonte
desde o PHP 5.4, você pode usar
http_response_code()
para obter e definir o código de status do cabeçalho.aqui um exemplo:
aqui está o documento dessa função no php.net:
http_response_code
fonte
Adicione esta linha antes de qualquer saída do corpo, caso você não esteja usando o buffer de saída.
Substitua a parte da mensagem ('OK') pela mensagem apropriada e o código de status pelo código conforme apropriado (404, 501, etc.)
fonte
Se você está aqui por causa do Wordpress dando 404 ao carregar o ambiente, isso deve resolver o problema:
O problema é devido ao envio de um cabeçalho Status: 404 não encontrado. Você tem que substituir isso. Isso também funcionará:
fonte
Com a função de cabeçalho . Há um exemplo na seção sobre o primeiro parâmetro necessário.
fonte
http_response_code (200); não funciona porque o alerta de teste 404 https://developers.google.com/speed/pagespeed/insights/
fonte
Se sua versão do PHP não incluir esta função:
fonte
Podemos obter valores de retorno diferentes de http_response_code por meio de dois ambientes diferentes:
No ambiente do servidor da web, retorne o código de resposta anterior se você forneceu um código de resposta ou quando não fornece nenhum código de resposta, ele imprimirá o valor atual. O valor padrão é 200 (OK).
No CLI Environment, true será retornado se você forneceu um código de resposta e false se você não fornecer nenhum response_code.
Exemplo do valor de retorno do ambiente do servidor Web do Response_code:
Exemplo de valor de retorno do ambiente CLI do Response_code:
fonte