No meu arquivo PHP eu tenho este código (não o código real, apenas para fins de demonstração):
ob_start();
var_export(headers_sent());
var_export(ob_get_status());
header('Content-Type: text/html');
header('Content-Type: application/json');
Mas os cabeçalhos de resposta acabam sendo text/html
em vez de application/json
. Pelo que entendi, a última chamada para header()
deve ser o que é usado - espacially, pois headers_sent()
retorna falso e ob_get_status()
também confirma que o buffer de saída está ativado.
Em documentação do PHP para header()
ele diz esta declaração no changelog para a versão 5.1. 2:
This function now prevents more than one header to be sent at once as a protection against header injection attacks.
Eu não tenho certeza do que isso significa - porque isso certamente não tem sido um problema o tempo todo desde o PHP 5.1.2.
E até o WordPress está confiando em chamar header()
várias vezes, por exemplo. em wp-admin/admin-ajax.php
, onde no início do arquivo chama @header( 'Content-Type: text/html; charset=' . get_option( 'blog_charset' ) );
e, mais tarde, quando determinou que a ação precisa retornar dados JSON, chama @header( 'Content-Type: application/json; charset=' . get_option( 'blog_charset' ) );
em wp_send_json()
in wp-includes/functions.php
.
Existe alguma mudança que eu possa fazer no servidor para fazer o PHP usar o último tipo de conteúdo? Obviamente, não posso alterar os arquivos principais do Wordpress.
Eu uso Debian 9.3, PHP 7.1.3, Apache 2.4.25.
Observação do site: O efeito desse problema é que a Biblioteca de Mídia não carrega nenhuma imagem no modo de grade e o indicador de atividade continua girando.
Agora descobri que isso acontece porque tenho o seguinte no meu arquivo .htaccess
:
php_value output_handler mb_output_handler
Eu esqueci porque eu tenho isso lá, então não tenho certeza que ouso removê-lo ... Mas por que ele tem esse efeito?