2012-04-09 26 views
52

Niedawno zdecydowałem się przełączyć z Apache2 na Nginx. Zainstalowałem Nginx na moim serwerze CentOS i skonfigurowałem podstawową konfigurację. Kiedy próbowałem załadować moją stronę w przeglądarce (FF/Chrome) zauważyłem, że plik css nie jest załadowany. Sprawdziłem konsolę błędów i zobaczyłem tę wiadomość:Nginx nie może załadować plików css

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

sprawdziłem konfigurację Nginx i wszystko wydaje się być w porządku:

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

typu MIME dla plików CSS jest prawidłowo ustawiona w/etc/nginx/mime.types.

text/css css;

Wszystko wydaje się być dobrze skonfigurowany, ale moje pliki CSS nadal nie są ładowane. Nie mam żadnego wyjaśnienia.

Kolejna rzecz, o której warto wspomnieć. Początkowo instalowałem Nginx przy użyciu repozytoriów epel i mam starą wersję: 0.8 ... Wydawało mi się, że moim problemem był błąd w tej wersji, więc odinstalowałem wersję 0.8, dodałem repozytorium nginx do yuma, a następnie zainstalowałem najnowszą wersję: 1.0. 14. Myślałem, że nowa wersja rozwiąże mój problem, ale niestety tak się nie stało, dlatego brakuje mi pomysłów.

Doceniam każdą pomoc.

pliki konfiguracyjne:

/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

proszę wkleić w kodzie konfiguracyjnym. zazwyczaj dobrze radziłeś sobie z innymi typami i pomijasz część plików publicznych, która powoduje, że zasoby takie jak css i obrazy zwracają błędy 404, lub w twoim przypadku błędy typu mime – Kristian

Odpowiedz

21

Znalazłem obejście tego problemu w Internecie. Dodałem do /etc/nginx/conf.d/default.conf co następuje:

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

Problem jest teraz, że wniosek do mojego pliku css nie jest przekierowywany dobrze, jakby korzeń nie jest prawidłowo ustawiony. W error.log widzę

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

Jako drugie obejście dodałem korzeń do każdej zdefiniowanej lokalizacji. Teraz działa, ale wydaje się trochę zbędny. Czy root nie jest dziedziczony z/location?

+2

Czy to jest błąd nginx? To jedyny sposób, w jaki mogę go uruchomić. Tak przy okazji, używam Arch Linux, nginx 1.4.1-3. – tprk77

+0

@ tprk77 nie jest błędem, zaakceptowana odpowiedź to obejście, dla poprawnego rozwiązania zobacz moją odpowiedź http://stackoverflow.com/a/23282158/1481489 – zamnuts

57

Umieszczenie include /etc/nginx/mime.types; pod location/{ zamiast pod http { rozwiązało problem.

+2

również zwróć uwagę, że jeśli uruchamiasz konfigurację od zera - z wyjątkiem typów mime może - 'include mime.types;' wykonuje swoje zadanie, ponieważ (przynajmniej w Windows, nginx 1.5.2) jest to tylko względne w stosunku do innych plików konfiguracyjnych. – omilke

+4

należy również pamiętać, że należy całkowicie odświeżyć witrynę w przeglądarce, np. użycie ctrl + f5 do odświeżenia, aby uniknąć pobierania buforowanych plików z niepoprawnymi nagłówkami. – CarelZA

+0

To zadziwiająco zadziałało! Co??! – rclai

5

Wpadłem też na ten problem.To mylić mnie aż zdałem sobie sprawę, co się stało:

Trzeba to:

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

Chcesz to:

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

wydaje się być albo błąd w nginx lub niedobór w docs (może to być zamierzone zachowanie, ale jest dziwne)

+3

to nie rozwiąże problemu w systemie Windows z nginx/1.6.0 – zamnuts

15

style.css jest aktualnie przetwarzany przez fastcgi ze względu na dyrektywę "location /". Tak więc fastcgi obsługuje plik (nginx > fastcgi > filesystem), a nie bezpośrednio system plików (nginx > filesystem).

Z tego powodu nie mam jeszcze pojęcia (jestem pewien, że gdzieś istnieje dyrektywa), NGINX stosuje mime typu text/html do wszystkich obsługiwanych przez fastcgi, chyba że aplikacja backend wyraźnie mówi inaczej.

winowajcą jest ten blok konfiguracja szczególności:

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

Powinno być:

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

Ta zmiana sprawia, że ​​tylko *.php pliki są wymagane z FastCGI. W tym momencie NGINX zastosuje prawidłowy typ MIME. Jeśli masz jakieś przepisanie adresu URL, musisz obsłużyć tę przed dyrektywą lokalizacyjną (location ~\.php$), aby wyprowadzić poprawne rozszerzenie i poprawnie skierować je do fastcgi.

Pamiętaj, aby sprawdzić this article regarding additional security considerations using try_files. Biorąc pod uwagę implikacje związane z bezpieczeństwem, uważam to za cechę, a nie błąd.

+1

to powinna być zaakceptowana odpowiedź, patrz także: http://forum.nginx.org/read.php?2,155222 , 155261 # msg-155261 –

+1

Wygląda na to, że problem ten nadal występuje, ponad 4 lata po pierwotnym pytaniu. Jak wygląda poprawna konfiguracja, jeśli wyświetlasz tylko zawartość statyczną, tj. ** nie ** PHP? – rob

0

Podążyłem za niektórymi wskazówkami z pozostałych odpowiedzi i odkryłem, że te dziwne działania pomogły (przynajmniej w moim przypadku).

1), że dodane do bloku serwera następujące:

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

że załadowany nginx i dostaje w ten Error.log:

2015/06/18 11:32:29 [Błąd] 3430 # 3430: * 169 open() "/etc/nginx/html/css/mysite.css" nie powiodło się (2: Brak takiego pliku lub katalogu)

2) Usunąłem wiersze, ponownie załadowałem nginx i otrzymałem działające css. Nie mogę wyjaśnić, co się stało, ponieważ mój plik conf stał się taki jak wcześniej.

Mój przypadek był czysty Xubuntu 14.04 na VirtualBox, nginx/1.9.2, wiersz 127.51.1.1 mysite w/etc/hosts i dość prosty /etc/nginx/nginx.conf z bloku serwera:

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

dodaj to do swojego pliku 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

Miałem ten sam problem w systemie Windows. Rozwiązałem to dodając: zawierają mime.types; pod http { w moim pliku nginx.conf. Następnie nadal nie działa .. więc spojrzałem na plik error.log i zauważyłem, że próbował ładować pliki .css i javascript ze ścieżki pliku, ale z folderem/http między. Przykład: moja .css była w: "C: \ Users \ pc \ Documents \ nginx-server/player-web/css/index.css" i pochodziła z: "C: \ Users \ pc \ Documents \ nginx-server/html /player-web/css/index.css” Więc zmieniłem folderu gracz-web wewnątrz folderu html i pracował;)

Powiązane problemy