2011-03-23 3 views
27

header("Content-type: text/css"); работает в Firefox, Chrome и других, но не в Интернете   Explorer   9. Я не уверен, что случилось.header ("Content-type: text/css"); работает в Firefox и Chrome, но в Internet Explorer 9 он отображается как «text/html»

В Chrome и Firework отображается таблица стилей, если я открываю ее на своей вкладке, и она применяется к странице.

В Chrome под сетью в инструментах разработчика он говорит тип text/css и статус 200.

В Internet Explorer,     9, он хочет, чтобы загрузить таблицу стилей, если открыть ее в отдельной вкладке и он не применяется к странице.

В инструментах разработчика F12 вы можете щелкнуть по сети, начать захватывать и обновлять страницу. Он показывает Style.css.php. Тип text/html и результат 406.

Это в голове:

<link rel="stylesheet" type="text/css" href="/assets/css/style.css.php" media="screen" /> 

заголовков запроса:

Key Value 
Request GET /assets/css/main.css HTTP/1.1 
Accept text/css 
Referer http://10.0.1.5/ 
Accept-Language en-US 
User-Agent Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0) 
Accept-Encoding gzip, deflate 
Host 10.0.1.5 
Connection Keep-Alive 
Cookie PHPSESSID=*Hidden* 

заголовки отклика:

Key Value 
Response HTTP/1.1 406 Not Acceptable 
Date Fri, 01 Apr 2011 10:12:42 GMT 
Server Apache/2.2.14 (Ubuntu) 
Alternates {"main.css.php" 1 {type application/x-httpd-php}} 
Vary negotiate 
TCN list 
Keep-Alive timeout=15, max=100 
Connection Keep-Alive 
Content-Type text/html; charset=iso-8859-1 
+5

Что значит «не работает»? В чем проблема? – Jonah

+0

Он не загружает его правильно, его как никакой файл css загружается вообще в IE. Если я иду в файл, он хочет загрузить его и не отображать его как Chrome и Firefox. – Keverw

+1

Вы пытались НЕ отправить колонку? :) –

ответ

16

Internet Explorer имеет историю доверия файловому расширению по типу MIME, о котором сообщает браузер. Если у вас есть доступ к mod_rewrite, попробуйте HTML-файл .css, а затем создайте правило mod_rewrite, которое связывает этот URL с вашим скриптом.

+2

+1; однако не только IE имеет тенденцию слепо доверять расширению файла (что должно быть совершенно бессмысленным!) по типу MIME. Все они делают это в [другом контексте] (http://stackoverflow.com/questions/4741438/what-content-types-execute-javascript-in-the-browser) –

9

Я обнаружил, что использование header("Content-type: text/css", true); работает для меня. Он не позволяет серверу выводить 2 заголовка HTTP для «Content-Type».

+14

Второй параметр для 'header()' равен 'true' по умолчанию. – Marcel

39

IE имеет «No, I'm not kidding about Content-Type» переключатель:

X-Content-Type-Options: nosniff 

КСТАТИ: убедитесь, что вы также отправить Last-Modified и отключить session.cache_limiter в PHP, иначе браузеры будут поддерживать перегрузочные файл CSS, который будет отрицательно влиять на производительность.

+2

'header (« Content-Type: text/css »); header («X-Content-Type-Options: nosniff»); 'или' header («Content-Type: text/css; X-Content-Type-Options: nosniff;»); 'не работает. Могу ли я применить его правильно? – Keverw

+0

Также session.cache_limiter установлен в nocache. Так что я просто печатаю? – Keverw

+0

@Keverw: Не помещайте два заголовка в один вызов 'header()'. 'session.cache_limiter' должен быть' none' (но это проблема производительности, которая не должна препятствовать работе MIME-типа). Используйте Fiddler2 или такие, чтобы увидеть, какие заголовки отправлены с вашего сервера. – Kornel

4

Есть ли выход перед отправкой заголовка? Спецификация в файле php? Возвращение кареты?

Если вы отключили отчет об ошибках, вы можете не увидеть ошибку, которую он должен вызвать.

Попробуйте добавить ob_start() сверху, он разрешит любую проблему, связанную с уже отправленными заголовками перед вызовом header().

Если у вас есть спецификация в файле UTF8, вы можете ее удалить.

0

Я думаю, что проблема может быть вызвана mod_security, которая служит странице ошибки 401 (HTML), а не CSS. Попытайтесь добавить это в файл .htaccess в корневом каталоге вашего веб-сайта, чтобы узнать, устраняет ли это проблему.

<IfModule mod_security.c> 
    SecFilterEngine Off 
    SecFilterScanPOST Off 
</IfModule> 
0

В статье Handle Images/CSS/JS as PHP without httpd.conf Using .htaccess помогли мне выяснить этот вопрос.

В основном вы делаете все те же вещи, что и все остальные (настройка заголовка на PHP и т. Д.), Но также используйте .htaccess для установки параметра AddHandler.

<Files my_style.css> 
    ForceType application/x-httpd-php 
    AddHandler application/x-httpd-php .css 
</Files> 

Таким образом, вы можете назвать его с помощью .css и все еще иметь PHP, анализируя его.

+0

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

+0

Следует также отметить, что при использовании ForceType IE использует все, на что это установлено, и игнорирует все, что вы помещаете на страницу PHP. Вот почему вы получаете ошибку 406. Вот почему я должен был назвать файл .css, чтобы IE был счастлив. – Mike

0

Для Internet Explorer,     9 служащей HTTP 406 код статуса в заголовке ответа на динамически генерируемый CSS файл, который мы:

  1. Удален модуль Apache mod_negiotiation или добавлены -Multiviews в конфигурации хоста (или .htaccess).
  2. Активированный Apache mod_rewrite
  3. Добавлен правило перезаписи конфигурации виртуального хоста или HTAccess:

    <IfModule mod_rewrite.c 
    
        RewriteEngine on 
        RewriteBase/
    
        #serve CSS and JS from combine.php 
        RewriteRule ^combine(.*) combine.php [NC,L] 
    
    </IfModule> 
    

Примечание: Это решение хорошо только для серверов/виртуальных хостов, не использующих MultiViews как удаление mod_negotiation также удаляет использование этой директивы.

0

В последнее время у меня была такая проблема для себя тоже. Отвратительная отладка - все, что я могу сказать об этом. Не уверен, что это может помочь вам людям, но я надеюсь, что так оно и будет. В погоню.

В Internet Explorer используется что-то вроде нюхания типа Mime, которое просто считывает 200 байтов заголовка FILE.

У меня был PHP-скрипт, который должен был вернуть другой видеофайл (с данными - весь файл) в зависимости от параметра, который был ему предоставлен.

Мое видео Пример запроса: получить-video.php ID = here_goes_the_id

$file = ''; // Get the video file path 
if (is_file($file)) { 
    header("Content-Type: video/mp4"); 
    header("Content-Length: " . filesize($file)); 
    readfile($file); 
} 
exit(); // This is the turnaround 

Вы должны приостановить свой скрипт сразу после того, как он отправляет данные файла. Это предотвращает обнюхивание типа IE Mime.

Надеюсь, это поможет.

 Смежные вопросы

  • Нет связанных вопросов^_^