Тип контента не работает в PHP - PullRequest
9 голосов
/ 24 марта 2010

У меня есть некоторые проблемы с файлом 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 для этого файла:)

Полный файл по запросу Джона:

    <?php
    header('Content-Type: text/css; charset=UTF-8');
    echo 'body {background-color: #000000; }';
    ?>

ОБНОВЛЕНИЕ № 2: Добавление ini_set('default_mimetype', 'text/css'); в файл PHP исправляет этот файл, но не решает проблему, которая вызывает эту ошибку ...

ОБНОВЛЕНИЕ № 3: Протестировано добавление AddType text/css .css в конфигурацию .htaccess и Apache. Все еще не повезло. Также проверено на отправку заголовков, отделенных от кодировки: header('Content-Type: text/css'); - Все еще не повезло ...

ОБНОВЛЕНИЕ № 4: Переустановите Apache + PHP на сервере, чтобы увидеть, исчезнет ли проблема, но нет. Такой же старый, такой же старый ...

Ответы [ 13 ]

8 голосов
/ 16 апреля 2010

Проверьте ваш файл php.ini для настройки output_buffering. Если он не выключен, тогда PHP автоматически выполняет буферизацию для вас. Установите для этого значение off и echo что-то перед командой header, и вы должны увидеть «классическую ошибку».

Вы не должны использовать закрытие?>. Я знаю, что это спорное предложение, но слишком много раз люди добавить возврат и / или пробел после него, который получает результат в браузер (перед заголовком). Очень немногие случаи, когда он не используется, может вызвать проблемы.

4 голосов
/ 13 апреля 2010
  1. Убедитесь, что ваш файловый редактор не сохраняет спецификацию в вашем PHP-файле.
  2. Попробуйте переместить error_reporting / ini_set, чтобы сделать их первыми операторами PHP (до вызова header ()). Таким образом, вы увидите все ошибки (если есть). Не забудьте включить это в производство!
  3. Глупое замечание, но убедитесь, что этот файл интерпретируется как PHP (расширение - .php или, если не .htaccess, указывает серверу интерпретировать как PHP).
  4. Все остальное в порядке с вашим кодом. Если это все еще не работает, проверьте журналы вашего сервера. Может быть, что-то еще прерывает выполнение этого файла PHP (неверный MIME или еще) ...
2 голосов
/ 24 марта 2010

причина в том, что функция header работает только в том случае, если она вызывается первой!

Если вы поставите echo раньше, тип контента автоматически станет text/html

попробуйте напечатать код CSS после заголовка, чтобы проверить, действительно ли он работает.

Прочитайте эту страницу для получения дополнительной информации

РЕДАКТИРОВАТЬ: вы изменили свой пост? : -)

1 голос
/ 16 апреля 2010

Я нашел полный файл с отступом.

    <?php
    header('Content-Type: text/css; charset=UTF-8');
    echo 'body {background-color: #000000; }';
    ?>

Поскольку отступ в строке 1 выводит 4 пробела, поэтому заголовок не будет работать.

1 голос
/ 13 апреля 2010

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

Попробуйте это из командной строки и проверьте «text / css»:

curl -I http://example.com

В зависимости от заголовков запросов браузера, PHP также может отправлять выходные данные в сжатом виде, используя буферизацию вывода. В файле PHP попробуйте это для проверки ob_gzhandler.

print_r(ob_list_handlers());

Если он включен, проверьте наличие zlib.output_compression в конфигурации php.ini или Apache.

1 голос
/ 11 апреля 2010

Может быть, функция header() отключена в вашей конфигурации?

Тест:

print ini_get('disable_functions');
1 голос
/ 24 марта 2010

Это обычно вызывается фатальной ошибкой (т. Е. Синтаксической ошибкой), которая приводит к прерыванию работы скрипта перед выполнением любого кода (до того, как display_errors может быть установлен через ini_set () во время выполнения). Попробуйте изменить display_errors в файле конфигурации php (php.ini).

0 голосов
/ 30 мая 2018

output_buffering = Off в php.ini был причиной для меня, почему он продолжает отправлять Content-Type = text/html. Установка в 1 решает это.

0 голосов
/ 13 апреля 2010

Возможно, есть проблемы с кэшированием.

Попробуйте это:

header('Content-type: text/css');
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");

echo 'body {background-color: #000000; }';

Работает у меня на готовой установке XAMPP и firefox - firebug сообщает правильный тип содержимого

0 голосов
/ 13 апреля 2010

Дикая догадка: откройте ваш файл с чем-то, что будет отображать любую спецификацию . Если вы видите какие-то странные символы до <?php, у вас есть проблема. Проверьте текущие параметры редактора, чтобы сохранить файл UTF-8 и сделать так, чтобы он сохранял их без спецификации.

...