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
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.
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.
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'.
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.
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.
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:
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.
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>
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.