2012-04-09 16 views
52

Recentemente ho deciso di passare da Apache2 a Nginx. Ho installato Nginx sul mio server CentOS e ho configurato una configurazione di base. Quando ho provato a caricare il mio sito nel browser (FF/Chrome) ho notato che il file css non è stato caricato. Ho controllato la console degli errori e ho visto questo messaggio:Nginx non carica i file css

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

ho controllato la configurazione Nginx e tutto sembra andare bene:

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

il tipo MIME per i file CSS è impostato correttamente in/etc/nginx/mime.types.

text/css css;

Tutto sembra essere ben configurato, ma i miei file CSS non sono ancora caricato. Non ho alcuna spiegazione

Un'altra cosa che vale la pena menzionare. Inizialmente ho installato Nginx usando repository epel e ho ottenuto una vecchia versione: 0.8 ... Mi sembrava che il mio problema fosse un bug in quella versione, quindi ho disinstallato la versione 0.8, aggiunto il repository nginx a yum e poi ho installato l'ultima versione: 1.0. 14. Pensavo che la nuova versione avrebbe risolto il mio problema, ma sfortunatamente non è così che sono a corto di idee.

Apprezzo qualsiasi aiuto.

file di configurazione:

/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

incolla nel codice di configurazione. di solito hai gestito bene altri tipi, e il suo saltare sulla parte dei tuoi file pubblici che fa sì che risorse come css e immagini restituiscano errori 404 o, nel tuo caso, errori di tipo mime – Kristian

risposta

21

Ho trovato una soluzione alternativa sul web. Ho aggiunto al /etc/nginx/conf.d/default.conf quanto segue:

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

Il problema ora è che una richiesta al mio file css non viene reindirizzato bene, come se root non è impostato correttamente. In error.log vedo

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

Quindi, come seconda soluzione, ho aggiunto la radice a ogni posizione definita. Ora funziona, ma sembra un po 'ridondante. La radice non è ereditata da/location?

+2

Si tratta di un bug nginx? Questo è l'unico modo per farlo funzionare. Dal modo in cui sto usando Arch Linux, nginx 1.4.1-3. – tprk77

+0

@ tprk77 non è un bug, la risposta accettata è un work-around, per una soluzione corretta vedi la mia risposta http://stackoverflow.com/a/23282158/1481489 – zamnuts

57

L'immissione di include /etc/nginx/mime.types; in location/{ anziché http { ha risolto il problema per me.

+2

nota anche che se stai iniziando la configurazione da zero - ad eccezione dei tipi mime forse - 'include mime.types;' fa il suo lavoro, dal momento che (almeno su windows, nginx 1.5.2) è solo relativo ad altri file di configurazione. – omilke

+4

nota anche che dovresti aggiornare completamente il sito nel tuo browser, ad es. usando ctrl + f5 per aggiornare per evitare di ottenere file memorizzati nella cache con intestazioni errate. – CarelZA

+0

Questo sorprendentemente ha funzionato! Che cosa ??! – rclai

5

Ho incontrato anche questo problema.E mi ha confuso fino a quando ho capito che cosa era sbagliato:

Hai questo:

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

si desidera che questo:

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

sembra che vi sia un problema che riguarda nginx o un deficit nel doc (questo potrebbe essere il comportamento previsto, ma è dispari)

+3

questo non ha risolto il problema su Windows con nginx/1.6.0 – zamnuts

15

style.css è in fase di elaborazione tramite fastcgi a causa della direttiva "posizione /". Quindi è fastcgi che sta servendo il file (nginx > fastcgi > filesystem), e non direttamente il filesystem (nginx > filesystem).

Per una ragione che non ho ancora capito (sono sicuro che ci sia una direttiva da qualche parte), NGINX applica il tipo mime text/html a qualsiasi cosa venga offerto da fastcgi, a meno che l'applicazione back-end non dice esplicitamente altrimenti.

Il colpevole è questo blocco di configurazione particolare:

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

dovrebbe essere:

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

Questa modifica consente di verificare solo i *.php file vengono richiesti da FastCGI. A questo punto, NGINX applicherà il tipo MIME corretto. Se si verifica la riscrittura degli URL, è necessario gestire questo prima della direttiva di ubicazione (location ~\.php$) in modo che l'estensione corretta sia derivata e instradata correttamente a fastcgi.

Assicurati di dare un'occhiata allo this article regarding additional security considerations using try_files. Date le implicazioni per la sicurezza, considero questa una funzionalità e non un bug.

+1

questa dovrebbe essere la risposta accettata, vedi anche: http://forum.nginx.org/read.php?2,155222 , 155261 # msg-155261 –

+1

Sembra che questo sia ancora un problema, più di 4 anni dopo la domanda originale. Come appare la configurazione corretta se si serve solo contenuto statico, ovvero ** no ** PHP? – rob

0

Ho seguito alcuni suggerimenti dalle risposte del resto e ho scoperto che queste strane azioni mi hanno aiutato (almeno nel mio caso).

1) ho aggiunto al blocco del server seguente:

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

ho ricaricato nginx e ottenuto questo in error.log:

2015/06/18 11:32:29 [errore] 3430 # 3430: * 169 open() "/etc/nginx/html/css/mysite.css" non riuscito (2: Nessun file o directory)

2) Ho eliminato le righe, ricaricato nginx e ottenuto il css funzionante. Non riesco a spiegare cosa sia successo perché il mio file di conf è diventato come prima.

Il mio caso era Xubuntu 14.04 pulita su VirtualBox, nginx/1.9.2, una fila 127.51.1.1 mysite in/etc/hosts e piuttosto semplice /etc/nginx/nginx.conf con un blocco del server:

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

aggiungilo al file conf ngnix

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

Ho avuto lo stesso problema in Windows. Ho risolto aggiungendo: include mime.types; in http { nel mio file nginx.conf. Poi ancora non ha funzionato .. quindi ho guardato il file error.log e ho notato che stava cercando di caricare i file .css e javascript dal percorso del file ma con una cartella/http tra. Es: mio .css era in: "C: \ Utenti \ pc \ Documenti \ nginx-server/player-web/css/index.css" e lo stava prendendo da: "C: \ Users \ pc \ Documents \ nginx-Server/html /player-web/css/index.css" Così ho cambiato la mia cartella di lettore-web all'interno di una cartella di html e ha funzionato;)