Content-type не работает в PHP
У меня проблемы с файлом PHP, который не работает должным образом. Content-type вообще не получает ни один браузер. Firebug интерпретирует файл как text / html вместо css. Вот файл:
Я попробовал поместить строку с echo ‘TEST’; перед строкой заголовка и ожидал увидеть классическую ошибку «заголовки уже отправлены», но ничего не появляется!
Однако обычные .css-файлы работают как шарм.
Что я могу сделать, чтобы разобраться в этом?
ОБНОВЛЕНИЕ: Изменил default_mimetype = «text/html» на default_mimetype = «text/css» в php.ini, и все страницы сразу интерпретировались как css, поэтому должен быть способ просто отправить заголовки css для этого файла 🙂
Полный файл по запросу Джона:
ОБНОВЛЕНИЕ №2: Добавление ini_set(‘default_mimetype’, ‘text/css’); в файл PHP исправляет этот файл, но не решает проблему, которая вызывает эту ошибку .
ОБНОВЛЕНИЕ №3: Протестировано добавление AddType text/css .css как в .htaccess, так и в конфигурацию Apache. По-прежнему не повезло. Также протестирован для отправки заголовков, отделенных от кодировки: header(‘Content-Type: text/css’); — Все равно не повезло .
ОБНОВЛЕНИЕ №4: Переустановили Apache + PHP на сервере, чтобы увидеть, исчезнет ли проблема, но нет. Такой же старый, такой же старый .
13 ответов
Проверьте свой файл php.ini на предмет настройки output_buffering. Если он не выключен, PHP автоматически выполняет буферизацию вывода за вас. Отключите его и укажите что-нибудь перед командой заголовка, и вы должны увидеть «классическую ошибку».
Вы не должны использовать закрытие?>. Я знаю, что это спорное предложение, но слишком часто люди добавляют после него возврат и / или пробел, который выводится в браузер (перед заголовком). Очень мало случаев, когда неиспользование может вызвать проблемы.
- Убедитесь, что ваш редактор файлов не сохраняет спецификацию. в вашем файле PHP.
- Попробуйте переместить error_reporting / ini_set, чтобы сделать их первыми операторами PHP (до вызова header ()). Таким образом вы увидите все ошибки (если есть). Не забудьте отключить это в производственной среде!
- Глупое замечание, но убедитесь, что этот файл интерпретируется как PHP (расширение .php или, если не .htaccess, скажите серверу интерпретировать как PHP).
- Все остальное подходит вашему коду. Если по-прежнему не работает, проверьте журналы сервера. Возможно, что-то еще приводит к сбою выполнения этого файла PHP (неверный MIME или иначе) .
Причина в том, что функция header работает только в том случае, если она вызывается первой!
Если вы поставите echo перед, тип контента автоматически станет text/html
Попробуйте напечатать код CSS после заголовка, чтобы проверить, действительно ли он работает.
Прочтите эту страницу для получения дополнительной информации.
РЕДАКТИРОВАТЬ: вы изменили свой пост? 🙂
Обычно это вызвано фатальной ошибкой (т. Е. Синтаксической ошибкой), которая приводит к прерыванию сценария до выполнения любого кода (до того, как display_errors может быть установлен с помощью ini_set () во время выполнения). Попробуйте изменить display_errors в файле конфигурации php (php.ini).
Может быть, в вашей конфигурации отключена функция header() ?
print ini_get('disable_functions');
Возможно, стоит проверить с помощью curl, какие заголовки фактически отправляются.
Попробуйте это из командной строки и проверьте наличие «text / css»:
В зависимости от заголовков запросов браузера PHP также может отправлять выходные данные в сжатом виде с использованием буферизации вывода. В файле PHP попробуйте это, чтобы проверить наличие ob_gzhandler .
Если он включен, проверьте zlib.output_compression в конфигурации php.ini или Apache.
Я обнаружил, что весь файл имеет отступ.
Поскольку отступ в строке 1 выводит 4 пробела, заголовок работать не будет.
Похоже, ваш веб-сервер интерпретирует скрипт как обычный файл. Имеет ли он расширение .php и работают ли другие файлы .php должным образом?
Выглядит нормально, и строка с echo обязательно должна генерировать предупреждение. Может быть, вы редактируете не тот файл?
Вы можете попробовать Content-Style-Type: text/css
Язык таблицы стилей по умолчанию также можно установить с помощью заголовков HTTP. Приведенное выше объявление META эквивалентно заголовку HTTP:
Content-Style-Type: text/css
По ссылке упоминается о добавлении AddType text/css .css в файл конфигурации apache. Может ты можешь попробовать
Edit2 Найдите «css» по этой ссылке. У кого-то была такая же проблема, как у вас. Попробуйте отправить заголовок без кодировки
Недавно у меня возникла опасная для волос проблема с переходным вариантом Firefox и XHTML 1.0.
Он отлично работал с другими браузерами, а также с HTML 4.1.
Короче говоря, сгенерированные PHP файлы JS и CSS по-прежнему сообщались заголовками как text / html, тогда как в HTML это были text / css и application / javascript; Firefox, которому сказали, что это страница XHTML 1.0, стал анально сохраняющим и отказался стилизовать страницу. (Я думаю, что JS все еще работает, но я все равно исправил.)
Решение:
заголовок (‘Content-type: text / css’); и заголовок (‘Content-type: application / javascript’);
Изменить 3 Было сообщение о том, что некоторые формы не отправляют никаких данных из-за утилиты AVG Linkscanner. Поскольку вы переустановили Apache + php, и я предполагаю, что вы не переустанавливали ОС, поэтому вы можете исследовать это / попробовать, отключив некоторые утилиты / плагины.
Content-type, не работающий в PHP
У меня есть некоторые проблемы с файлом PHP, который работает неправильно. Content-type не получает какой-либо браузер вообще. Firebug интерпретирует файл как text / html вместо css. Вот файл:
php header('Content-Type: text/css; charset=UTF-8'); error_reporting(E_ALL | E_STRICT); ini_set('display_errors', 'On'); /* CSS goes on from here */
Я тестировал, чтобы поставить строку с echo ‘TEST’; перед строкой заголовка, и ожидал увидеть классическую ошибку «отправленные заголовки», но ничего не появляется!
Однако обычные .css-файлы работают как шарм.
Что я могу сделать, чтобы разобраться в этом?
UPDATE: изменилось ли default_mimetype = «text/html» на default_mimetype = «text/css» в php.ini, и все страницы сразу получили интерпретацию как css, поэтому должен быть способ просто отправить заголовки css для этого файла 🙂
Полный файл по требованию Джона:
UPDATE # 2: добавление ini_set(‘default_mimetype’, ‘text/css’); в файл PHP исправляется этот файл, но он не решает проблему, которая вызывает эту ошибку …
UPDATE # 3: Протестировано, добавив AddType text/css .css в конфигурацию .htaccess и Apache. Еще не повезло. Также тестируется для отправки заголовков, отделенных от заголовка charset: header(‘Content-Type: text/css’); – Еще не повезло …
ОБНОВЛЕНИЕ # 4: переустановили Apache + PHP на сервере, чтобы узнать, не исчезла ли проблема, но нет. Тот же старый, такой же старый …
Проверьте файл php.ini для параметра output_buffering. Если он не установлен «выключен», то PHP автоматически выполняет буферизацию вывода для вас. Установите это, чтобы отключить и что-то повторить перед командой заголовка, и вы должны увидеть «классическую ошибку».
Вы не должны использовать закрытие?>. Я знаю, что это противоречивое предложение, но слишком много раз люди добавляют обратно и / или пространство после него, которое выводится в браузер (перед заголовком). Очень мало случаев, когда он не использует его, может вызвать проблему.
- Убедитесь, что ваш редактор файлов не сохраняет спецификацию в вашем файле PHP.
- Попробуйте переместить error_reporting / ini_set, чтобы сделать их первыми инструкциями PHP (перед вызовом header ()). Таким образом вы увидите все ошибки (если они есть). Не забудьте поставить это на производство!
- Глупое замечание, но убедитесь, что этот файл интерпретируется как PHP (расширение – .php или если не .htaccess, то сервер должен интерпретироваться как PHP).
- Все остальное в порядке с вашим кодом. Если он все еще не работает, проверьте журналы сервера. Может быть, что-то еще вызывает сбой выполнения этого файла PHP (неверный MIME или еще) …
причина в том, что функция header работает только в том случае, если это первый вызов!
Если вы помещаете echo раньше, тип контента автоматически становится text/html
попробуйте напечатать код CSS после заголовка, чтобы проверить, действительно ли он работает.
Прочтите эту страницу для получения дополнительной информации
EDIT: вы изменили свой пост? 🙂
Это обычно вызвано фатальной ошибкой (т. Е. Синтаксической ошибкой), которая заставляет сценарий прерываться до того, как какой-либо из кода будет выполнен (до того, как display_errors можно установить через ini_set () во время выполнения). Попробуйте изменить display_errors в файле конфигурации php (php.ini).
Может быть, функция header() отключена в вашей конфигурации?
print ini_get('disable_functions');
Возможно, стоит проверить с завиткой, чтобы увидеть, какие заголовки отправляются.
Попробуйте это из командной строки и проверьте «text / css»:
В зависимости от заголовков запросов браузера PHP также может отправлять выходные данные с помощью буферизации вывода. В файле PHP попробуйте это проверить для ob_gzhandler .
Если он включен, zlib.output_compression в zlib.output_compression в настройках php.ini или Apache.
Я обнаружил, что полный файл имеет отступы.
Поскольку отступ в строке 1 выводит 4 пробела, поэтому заголовок не будет работать.
Это похоже на то, что ваш веб-сервер интерпретирует сценарий как обычный файл. Имеет ли расширение .php и другие .php-файлы работают, как ожидалось?
Выглядит отлично, и линия с echo должна обязательно генерировать предупреждение. Может быть, вы редактируете неправильный файл?
Вы можете попробовать Content-Style-Type: text/css
Язык таблиц стилей по умолчанию также может быть установлен с заголовками HTTP. Вышеуказанная декларация META эквивалентна заголовку HTTP:
Content-Style-Type: text/css
Редактировать:
В ссылке упоминается добавить AddType text/css .css в файле конфигурации apache. Может быть, вы можете попробовать
Edit2 Ищите «css» по этой ссылке . У кого-то была такая же проблема, как и вы. Попробуйте отправить заголовок без кодировки
Недавно у меня возникла проблема с угрозой для Firefox и XHTML 1.0.
Он отлично работал с другими браузерами, а также с HTML 4.1.
Короче говоря, PHP-сгенерированные JS и CSS-файлы по-прежнему сообщаются заголовками как text / html, тогда как в HTML они были text / css и application / javascript; Firefox сообщил, что XHTML 1.0 стал анально-retentive и отказался стилизовать страницу. (Я думаю, что JS все еще работал, но я все равно исправил его.)
Решение:
header (‘Content-type: text / css’); и заголовок (‘Content-type: application / javascript’);
Редактировать 3 Было сообщение о некоторых формах, не отправляющих какие-либо данные из-за утилиты с именем AVG Linkscanner. Поскольку вы переустановили Apache + php, и я предполагаю, что вы не переустанавливали ОС, поэтому вы можете, возможно, исследовать это / попробуйте, отключив некоторые утилиты / заглушки.
Дикая догадка: откройте файл с чем-то, что будет отображать любую спецификацию . Если вы видите некоторые странные символы перед
Возможно, есть проблемы с кешированием.
header('Content-type: text/css'); header("Cache-Control: no-cache, must-revalidate"); header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); echo 'body ';
Работает для меня в ящике установки XAMPP и firefox – firebug сообщает правильный тип контента.