2012-04-09 10 views
52

Ich habe kürzlich entschieden, von Apache2 zu Nginx zu wechseln. Ich habe Nginx auf meinem CentOS Server installiert und eine Grundkonfiguration eingerichtet. Als ich versuchte, meine Website im Browser (FF/Chrome) zu laden, bemerkte ich, dass CSS-Datei nicht geladen ist. Ich habe die Fehlerkonsole und sah diese Nachricht:Nginx lädt CSS-Dateien nicht

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

checkte ich Nginx Konfiguration und alles scheint in Ordnung zu sein:

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

Der Mime-Typ für CSS-Dateien korrekt in/etc gesetzt/nginx/mime.types.

text/css css;

Alles scheint gut konfiguriert werden, aber meine CSS-Dateien geladen sind immer noch nicht. Ich habe keine Erklärung.

Eine weitere erwähnenswerte Sache. Anfangs habe ich Nginx mit epel-Repositories installiert und ich habe eine alte Version: 0.8 ... Es schien mir, dass mein Problem ein Bug in dieser Version war, also habe ich 0.8 Version deinstalliert, nginx repository zu yum hinzugefügt und dann neuste Version 1.0 installiert. 14. Ich dachte, dass die neue Version mein Problem lösen wird, aber leider ging es mir nicht so vor Ideen.

Ich schätze jede Hilfe.

Konfigurationsdateien:

/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

bitte in der Config-Code einfügen. in der Regel haben Sie andere Arten gut gehandhabt, und es überspringt Ihren öffentlichen Dateiteil, was bewirkt, dass Assets wie css und images 404 Fehler zurückgeben, oder in Ihrem Fall, Mime Type Errors – Kristian

Antwort

21

Ich habe einen Workaround im Internet gefunden. Ich habe folgendes /etc/nginx/conf.d/default.conf:

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

Das Problem ist jetzt, dass eine Anfrage an meine CSS-Datei nicht gut umgeleitet wird, als ob root ist nicht richtig eingestellt. In error.log Ich sehe

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

Als zweiten Workaround habe ich die Wurzel zu jedem definierten Ort hinzugefügt. Jetzt funktioniert es, aber scheint ein wenig überflüssig. Ist der Root nicht von/location geerbt?

+2

Ist das ein nginx Bug? Nur so kann ich es zum Laufen bringen. Übrigens benutze ich Arch Linux, nginx 1.4.1-3. – tprk77

+0

@ tprk77 nicht ein Fehler, die akzeptierte Antwort ist ein Workaround, für eine ordnungsgemäße Lösung siehe meine Antwort http://stackoverflow.com/a/23282158/1481489 – zamnuts

57

Putting include /etc/nginx/mime.types; unter location/{ statt unter http { löste das Problem für mich.

+2

Beachten Sie auch, dass, wenn Sie die Konfiguration von Grund auf neu starten - außer den Mime-Typen vielleicht - 'include mime.types;' macht seinen Job, da der (zumindest auf Windows, nginx 1.5.2) ist es nur relativ zu anderen Konfigurationsdateien. – omilke

+4

Beachten Sie auch, dass Sie die Seite in Ihrem Browser vollständig aktualisieren sollten, z. Verwenden Sie Strg + F5, um zu aktualisieren, um zu vermeiden, zwischengespeicherte Dateien mit falschen Headern zu erhalten. – CarelZA

+0

Das hat überraschend funktioniert! Was zum??! – rclai

5

Ich stieß auch auf dieses Problem.Es verwirrt mich, bis ich merkte, was los war:

Sie haben dies:

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

Sie wollen dies:

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

scheint es einen Fehler in nginx entweder oder ein Mangel in der docs (dies könnte das beabsichtigte Verhalten sein, aber es ist seltsam)

+3

Dies löste das Problem nicht auf Windows mit Nginx/1.6.0 – zamnuts

15

wird tatsächlich Prozess über Fastcgi aufgrund Ihrer "Standort /" - Anweisung. Also ist es fastcgi, das die Datei (nginx > fastcgi > filesystem) und nicht das Dateisystem direkt (nginx > filesystem) serviert.

Aus einem Grund, den ich noch herausfinden muss (ich bin mir sicher, es gibt irgendwo eine Direktive), wendet NGINX den Mime-Typ text/html auf alles an, was von fastcgi geliefert wird, außer die Backend-Anwendung sagt explizit etwas anderes.

Der Täter ist diese Konfiguration Block speziell:

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; 
} 

es sein sollte:

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; 
} 

Diese Änderung stellt sicher, dass nur *.php Dateien werden von fastcgi angefordert. Zu diesem Zeitpunkt wird NGINX den richtigen MIME-Typ anwenden. Wenn Sie ein URL-Rewriting haben, müssen Sie diese vor die Location-Direktive (location ~\.php$) behandeln, so dass die richtige Erweiterung abgeleitet und ordnungsgemäß an fastcgi weitergeleitet wird.

Achten Sie darauf, this article regarding additional security considerations using try_files zu überprüfen. Angesichts der Sicherheitsrisiken halte ich dies für ein Feature und nicht für einen Fehler.

+1

sollte dies die akzeptierte Antwort sein, siehe auch: http://forum.nginx.org/read.php?2,155222 , 155261 # msg-155261 –

+1

Es scheint, dass dies immer noch ein Problem ist, mehr als 4 Jahre nach der ursprünglichen Frage. Wie sieht die korrekte Konfiguration aus, wenn Sie nur statischen Inhalt bereitstellen, d. H. ** nein ** PHP? – rob

0

Ich folgte ein paar Tipps aus den restlichen Antworten und entdeckte, dass diese seltsamen Aktionen (zumindest in meinem Fall) geholfen haben.

1) I hinzugefügt, um Server-Block die folgenden:

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

I nginx nachgeladen und bekam dies in error.log:

2015/06/18 11:32:29 [Fehler] 3430 # 3430: * 169 open() "/etc/nginx/html/css/mysite.css" fehlgeschlagen (2: Keine solche Datei oder Verzeichnis)

2) Ich löschte die Zeilen, lud Nginx neu und bekam css. Ich kann nicht erklären, was passiert ist, weil meine Conf-Datei so wie zuvor wurde.

Mein Fall war sauber xubuntu 14,04 auf VirtualBox, nginx/1.9.2, eine Reihe 127.51.1.1 mysite in/etc/hosts und ziemlich einfach /etc/nginx/nginx.conf mit einem Server Block:

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

fügen Sie diese zu Ihrer ngnix conf Datei

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

ich hatte das gleiche Problem in Windows. Ich löste es hinzufügen: gehören mime.types; unter http { in meiner nginx.conf-Datei. Dann hat es immer noch nicht funktioniert .. so sah ich auf die error.log Datei und ich bemerkte, dass es versucht, die CSS-und Javascript-Dateien aus dem Dateipfad, aber mit einem/http-Ordner zwischen. Bsp: mein .css war in: "C: \ Benutzer \ pc \ Dokumente \ nginx-server/player-web/css/index.css" und es nahm es von: "C: \ Users \ pc \ Dokumente \ nginx-server/html /player-web/css/index.css“ Also änderte ich meinen Player-Web-Ordner in einem hTML-Ordner und es hat funktioniert;)