2012-04-09 6 views
52

J'ai récemment décidé de passer d'Apache2 à Nginx. J'ai installé Nginx sur mon serveur CentOS et j'ai configuré une configuration de base. Lorsque j'ai essayé de charger mon site dans un navigateur (FF/Chrome), j'ai remarqué que le fichier css n'était pas chargé. J'ai vérifié la console d'erreur et ai vu ce message:Nginx ne parvient pas à charger les fichiers css

Error: The stylesheet http://example.com/style.css was not loaded because its MIME type, "text/html", is not "text/css".

J'ai vérifié la configuration Nginx et tout semble bien se passer:

http { 
    include /etc/nginx/mime.types; 
    .......... 
} 

Le type MIME pour les fichiers css est correctement défini dans/etc/nginx/mime.types.

text/css css;

Tout semble être bien configuré, mais mes fichiers CSS ne sont toujours pas chargé. Je n'ai aucune explication.

Autre chose qui mérite d'être mentionnée. Initialement j'ai installé Nginx en utilisant des dépôts epel et j'ai eu une ancienne version: 0.8 ... Il me semblait que mon problème était un bug dans cette version donc j'ai désinstallé la version 0.8, ajouté nginx repository à yum et installé la dernière version: 1.0. 14. Je pensais que la nouvelle version résoudrait mon problème, mais malheureusement ce n'est pas le cas, je manque d'idées.

J'apprécie toute aide.

fichiers de configuration:

/etc/nginx/nginx.conf

user nginx; 
worker_processes 1; 

error_log /var/log/nginx/error.log warn; 
pid  /var/run/nginx.pid; 


events { 
    worker_connections 1024; 
} 


http { 
    include  /etc/nginx/mime.types; 
    default_type application/octet-stream; 

    log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 
         '$status $body_bytes_sent "$http_referer" ' 
         '"$http_user_agent" "$http_x_forwarded_for"'; 

    access_log /var/log/nginx/access.log main; 

    sendfile  on; 
    #tcp_nopush  on; 

    keepalive_timeout 65; 

    #gzip on; 

    include /etc/nginx/conf.d/*.conf; 
} 

/etc/nginx/conf.d/default.conf

server { 
    listen  80; 
    server_name localhost; 

    #charset koi8-r; 
    #access_log /var/log/nginx/log/host.access.log main; 

    location/{ 
     root /usr/share/nginx/html; 
     index index.html index.htm index.php; 
     fastcgi_pass 127.0.0.1:9000; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name; 
     include  fastcgi_params; 
    } 

    #error_page 404    /404.html; 

    # redirect server error pages to the static page /50x.html 
    # 
    error_page 500 502 503 504 /50x.html; 
    location = /50x.html { 
     root /usr/share/nginx/html; 
    } 

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80 
    # 
    #location ~ \.php$ { 
    # proxy_pass http://127.0.0.1; 
    #} 

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 
    # 
    #location ~ \.php$ { 
    # root   html; 
    # fastcgi_pass 127.0.0.1:9000; 
    # fastcgi_index index.php; 
    # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; 
    # include  fastcgi_params; 
    #} 

    # deny access to .htaccess files, if Apache's document root 
    # concurs with nginx's one 
    # 
    #location ~ /\.ht { 
    # deny all; 
    #} 
} 

/etc/nginx/mime.types

types { 
    text/html        html htm shtml; 
    text/css        css; 
    text/xml        xml; 
    image/gif        gif; 
    image/jpeg       jpeg jpg; 
    application/x-javascript    js; 
    application/atom+xml     atom; 
    application/rss+xml     rss; 
    .......................................... 
    other types here 
    .......................................... 
} 
+0

s'il vous plaît coller dans votre code de configuration. Habituellement, vous avez bien géré d'autres types, et en ignorant votre partie de fichiers publics, ce qui fait que des ressources comme css et images renvoient des erreurs 404 ou, dans votre cas, des erreurs de type mime – Kristian

Répondre

21

J'ai trouvé une solution de contournement sur le Web. J'ai ajouté à /etc/nginx/conf.d/default.conf ce qui suit:

location ~ \.css { 
    add_header Content-Type text/css; 
} 
location ~ \.js { 
    add_header Content-Type application/x-javascript; 
} 

Le problème est maintenant qu'une demande à mon dossier css est pas redirigée bien, comme si la racine est pas correctement. En error.log Je vois

2012/04/11 14:01:23 [error] 7260 # 0: * 2 open() "/etc/nginx//html/style.css"

Donc, comme une deuxième solution de contournement j'ai ajouté la racine à chaque emplacement défini. Maintenant, cela fonctionne, mais semble un peu redondant. La racine n'est-elle pas héritée de/location?

+2

Est-ce un bug nginx? C'est la seule façon de le faire fonctionner. En passant, j'utilise Arch Linux, nginx 1.4.1-3. – tprk77

+0

@ tprk77 pas un bug, la réponse acceptée est une solution de rechange, pour une solution appropriée voir ma réponse http://stackoverflow.com/a/23282158/1481489 – zamnuts

57

Mettre le include /etc/nginx/mime.types; sous location/{ au lieu de sous http { a résolu le problème pour moi.

+2

Notez également, que si vous démarrez la config à partir de zéro - sauf pour les types mime peut-être - 'include mime.types;' fait son travail, puisque le (au moins sur windows, nginx 1.5.2) il est juste par rapport aux autres fichiers de configuration. – omilke

+4

Notez également que vous devez actualiser complètement le site dans votre navigateur, par exemple. en utilisant ctrl + f5 pour actualiser pour éviter d'obtenir des fichiers en cache avec des en-têtes incorrects. – CarelZA

+0

Ce étonnamment travaillé! Qu'est-ce que le ??! – rclai

5

J'ai également rencontré ce problème.Il me confus jusqu'à ce que je compris ce qui était erroné:

Vous avez ceci:

include  /etc/nginx/mime.types; 
default_type application/octet-stream; 

Vous voulez ceci:

default_type application/octet-stream; 
include  /etc/nginx/mime.types; 

il semble être soit un bogue dans nginx ou d'une déficience dans la docs (cela pourrait être le comportement prévu, mais il est étrange)

+3

cela n'a pas résolu le problème sur windows avec nginx/1.6.0 – zamnuts

15

style.css est actuellement en cours de traitement via fastcgi en raison de votre directive "location /". C'est donc fastcgi qui sert le fichier (nginx > fastcgi > filesystem), et non directement le système de fichiers (nginx > filesystem). Pour une raison que je n'ai pas encore compris (je suis sûr qu'il y a une directive quelque part), NGINX applique le type mime text/html à tout ce qui est servi depuis fastcgi, à moins que l'application dorsale ne le dise explicitement.

Le coupable est ce bloc de configuration spécifique:

location/{ 
    root /usr/share/nginx/html; 
    index index.html index.htm index.php; 
    fastcgi_pass 127.0.0.1:9000; 
    fastcgi_index index.php; 
    fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name; 
    include  fastcgi_params; 
} 

Il devrait être:

location ~ \.php$ { # this line 
    root /usr/share/nginx/html; 
    index index.html index.htm index.php; 
    fastcgi_split_path_info ^(.+\.php)(/.+)$; #this line 
    fastcgi_pass 127.0.0.1:9000; 
    fastcgi_index index.php; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # update this too 
    include  fastcgi_params; 
} 

Ce changement fait en sorte que *.php fichiers sont demandés à partir FastCGI. À ce stade, NGINX appliquera le bon type MIME. Si vous avez une réécriture d'URL qui se passe, vous devez gérer ce avant la directive de localisation (location ~\.php$) afin que l'extension correcte soit dérivée et correctement routée vers fastcgi.

Assurez-vous de vérifier this article regarding additional security considerations using try_files. Compte tenu des implications sur la sécurité, je considère cela comme une caractéristique et non comme un bug.

+1

cela devrait être la réponse acceptée, voir aussi: http://forum.nginx.org/read.php?2,155222 , 155261 # msg-155261 –

+1

Il semble que ce soit toujours un problème, plus de 4 ans après la question initiale. A quoi ressemble la configuration correcte si vous ne diffusez que du contenu statique, c'est-à-dire ** non ** PHP? – rob

0

J'ai suivi quelques conseils des autres réponses et j'ai découvert que ces actions bizarres ont aidé (du moins dans mon cas).

1) J'ajouté au bloc de serveur suivantes:

location ~ \.css { 
add_header Content-Type text/css; 
} 

Je nginx et ai rechargé cela dans error.log:

2015/06/18 11:32:29 [error] 3430 # 3430: * 169 open() "/etc/nginx/html/css/mysite.css" a échoué (2: aucun fichier ou répertoire de ce type)

2) J'ai effacé les lignes, j'ai rechargé nginx et j'ai commencé à travailler. Je ne peux pas expliquer ce qui s'est passé parce que mon fichier conf est devenu comme avant.

Mon cas était propre Xubuntu 14.04 sur VirtualBox, nginx/1.9.2, une rangée 127.51.1.1 mysite dans/etc/hosts et assez simple /etc/nginx/nginx.conf avec un bloc de serveur:

user nginx; 
worker_processes 1; 

error_log /var/log/nginx/error.log warn; 
pid /var/run/nginx.pid; 

events { 
    worker_connections 1024; 
} 

http { 
    include /etc/nginx/mime.types; 

    server { 
     listen 80; 
     server_name mysite; 

     location/{ 
      root /home/testuser/dev/mysite/; 
     } 
    } 
} 
-1

ajoutez ceci à votre fichier ngnix conf

add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://ssl.google-analytics.com https://assets.zendesk.com https://connect.facebook.net; img-src 'self' https://ssl.google-analytics.com https://s-static.ak.facebook.com https://assets.zendesk.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://assets.zendesk.com; font-src 'self' https://themes.googleusercontent.com; frame-src https://assets.zendesk.com https://www.facebook.com https://s-static.ak.facebook.com https://tautt.zendesk.com; object-src 'none'"; 
0

J'ai rencontré le même problème sous Windows. Je l'ai résolu en ajoutant: include mime.types; sous http { dans mon fichier nginx.conf. Ensuite, il n'a toujours pas fonctionné .. donc j'ai regardé le error.log fichier et j'ai remarqué qu'il essayait de charger les fichiers .css et javascript à partir du chemin du fichier, mais avec un dossier/http entre. Ex: mon .css était dans: "C: \ Utilisateurs \ pc \ Documents \ nginx-serveur/joueur-web/css/index.css" et il le prenait de: "C: \ Users \ pc \ Documents \ nginx-server/html /player-web/css/index.css » donc j'ai changé mon dossier lecteur Web dans un dossier html et cela a fonctionné;)

Questions connexes