web-dev-qa-db-fra.com

en-tête ("Content-type: text/css"); fonctionne dans Firefox et Chrome, mais dans Internet Explorer 9, il apparaît sous la forme 'text/html'

header("Content-type: text/css"); fonctionne dans Firefox, Chrome et autres, mais pas dans Internet Explorer 9. Je ne suis pas sûr de ce qui se passe.

Dans Chrome et Firework, la feuille de style est affichée si je l’ouvre dans son propre onglet et si elle est appliquée à la page.

Dans Chrome sous Réseau dans les outils de développement, il est indiqué que le type est text/css et que le statut est 200.

Dans Internet Explorer 9, il souhaite télécharger la feuille de style si je l'ouvre dans son propre onglet et que cela ne s'applique pas à la page.

Dans les outils de développement F12, vous pouvez cliquer sur le réseau, commencer à capturer et actualiser la page. Il montre le Style.css.php. Le type est text/html et le résultat est 406.

C'est dans la tête:

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

En-têtes de demande:

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*

En-têtes de réponse:

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
28
Keverw

IE a " Non, je ne plaisante pas avec Content-Type ":

X-Content-Type-Options: nosniff

BTW: assurez-vous d’envoyer également Last-Modified et de désactiver session.cache_limiter en PHP, sinon les navigateurs continueront à recharger le fichier CSS, ce qui aura un impact négatif sur les performances.

41
Kornel

Internet Explorer a depuis toujours fait confiance à l'extension de fichier sur le type MIME signalé par le navigateur. Si mod_rewrite est disponible, demandez à votre code HTML de rechercher un fichier .css, puis créez une règle mod_rewrite qui dirige cette URL vers votre script.

16
Nathan Strong

J'ai trouvé que l'utilisation de header("Content-type: text/css", true); fonctionnait pour moi. Cela empêche le serveur de générer 2 en-têtes HTTP pour 'Content-Type'.

11
samshull

Existe-t-il une sortie avant que l'en-tête ne soit envoyé? BOM dans le fichier php? Un retour de voiture?

Si vous avez désactivé le rapport d’erreur, il est possible que l’erreur qu’elle déclenche ne soit pas détectée.

Essayez d’ajouter ob_start(), cela résoudra tout problème lié aux en-têtes déjà envoyés avant tout appel header().

Si vous avez une nomenclature dans votre fichier UTF8, vous souhaiterez peut-être la supprimer.

4
Capsule

Récemment, j’ai eu un problème comme celui-là aussi. Le débogage méchant est tout ce que je peux dire à ce sujet. Vous ne savez pas si cela pourrait vous aider, mais j'espère que cela vous aidera. Couper à la chasse.

Internet Explorer utilise un procédé appelé sniffing de type Mime, qui lit simplement 200 octets de l'en-tête THE FILE.

J'avais un script PHP qui devait renvoyer un fichier vidéo différent (avec les données - l'ensemble du fichier) en fonction du paramètre fourni.

Exemple de demande de vidéo: get-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

Vous devez suspendre votre script immédiatement après l’envoi des données de fichier .Cela empêche le reniflement de type IE Mime.

J'espère que ça aide.

0
Lukas

Pour Internet Explorer 9 servant le code d'état HTTP 406 dans l'en-tête de la réponse pour un fichier CSS généré dynamiquement, nous:

  1. Suppression du module Apache mod_negiotiation ou ajout de -Multiviews à la configuration de l'hôte (ou .htaccess).
  2. Apache activé mod_rewrite
  3. Ajout d'une règle de réécriture à la configuration de l'hôte virtuel ou à htaccess:

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

Remarque: cette solution convient uniquement aux serveurs/hôtes virtuels n'utilisant pas Multiviews car la suppression de mod_negotiation supprime également l'utilisation de cette directive.

0
Paktas

Je pense que le problème peut être dû à mod_security qui sert une page d'erreur 401 (HTML) plutôt que le CSS. Essayez d’ajouter ceci à un fichier .htaccess à la racine Web de votre site Web pour voir si cela résout le problème.

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

L'article Traiter Images/CSS/JS comme PHP sans httpd.conf. L'utilisation de .htaccess m'a aidé à comprendre le problème.

Vous faites essentiellement les mêmes opérations que celles mentionnées par tous les autres (définition de l'en-tête dans PHP, etc.), mais vous utilisez également .htaccess pour définir le paramètre AddHandler.

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

De cette façon, vous pouvez le nommer avec .css tout en ayant l’analyse PHP.

0
Mike