私の 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 以降、これが常に問題になっているわけではないからです。
そしてさらにワードプレスは、複数回の呼び出しに依存しています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
なぜそれをそこに入れたのか忘れてしまったので、それを削除できるかどうかはわかりません... しかし、なぜそれがそのような効果があるのでしょうか?