Назад | Перейти на главную страницу

PHP / Apache: несколько вызовов header () не работают

В моем файле PHP есть этот код (не настоящий код, просто для демонстрационных целей):

ob_start();
var_export(headers_sent());
var_export(ob_get_status());
header('Content-Type: text/html');
header('Content-Type: application/json');

Но заголовки ответов оказываются text/html вместо того application/json. Насколько я понимаю, последний звонок header() должно быть то, что используется - особенно, поскольку headers_sent() возвращает false и ob_get_status() также подтвердит, что буферизация вывода включена.

В Документация PHP для header() в журнале изменений версии 5.1.2 говорится об этом:

Эта функция теперь предотвращает одновременную отправку более одного заголовка в качестве защиты от атак путем внедрения заголовка.

Я не совсем уверен, что это означает, потому что это определенно не было проблемой все время, начиная с PHP 5.1.2.

И даже WordPress полагается на звонок header() несколько раз, например. в wp-admin/admin-ajax.php где он в самом начале файла вызывает @header( 'Content-Type: text/html; charset=' . get_option( 'blog_charset' ) ); а затем позже, когда он определит, что действие должно вернуть данные JSON, которые оно вызывает @header( 'Content-Type: application/json; charset=' . get_option( 'blog_charset' ) ); в wp_send_json() в wp-includes/functions.php.

Могу ли я сделать что-то на сервере, чтобы PHP использовал последний заданный тип контента? Я, очевидно, не могу изменить файлы ядра Wordpress.

Я использую Debian 9.3, PHP 7.1.3, Apache 2.4.25.

Примечание для сайта: эффект этой проблемы заключается в том, что медиа-библиотека не загружает изображения в режиме сетки, а индикатор активности просто продолжает вращаться.

!! ОБНОВИТЬ !!

Теперь я узнал, что это происходит потому, что у меня в моем .htaccess файл:

php_value output_handler mb_output_handler

Я забыл, почему у меня это там, поэтому я не уверен, что осмелюсь его удалить ... Но почему это дает такой эффект?