В моем файле 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
Я забыл, почему у меня это там, поэтому я не уверен, что осмелюсь его удалить ... Но почему это дает такой эффект?