2012-04-09 63 views
52

Recientemente he decidido cambiar de Apache2 a Nginx. Instalé Nginx en mi servidor CentOS y configuré una configuración básica. Cuando traté de cargar mi sitio en el navegador (FF/Chrome) noté que el archivo css no está cargado. Revisé la consola de errores y vi este mensaje:Nginx no puede cargar archivos css

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

he comprobado la configuración de Nginx y todo parece estar bien:

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

el tipo MIME para los archivos CSS se ha ajustado correctamente en/etc/nginx/mime.types.

text/css css;

Todo parece estar bien configurado pero mis archivos CSS todavía no se cargan. No tengo ninguna explicación.

Otra cosa que vale la pena mencionar. Inicialmente instalé Nginx usando repositorios epel y obtuve una versión anterior: 0.8 ... Me pareció que mi problema era un error en esa versión, así que desinstalé la versión 0.8, añadí el repositorio nginx a yum y luego instalé la última versión: 1.0. 14. Pensé que la nueva versión resolvería mi problema, pero desafortunadamente no, así que me estoy quedando sin ideas.

Agradezco cualquier ayuda.

archivos de configuración:

/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

favor pegar en el código de configuración. por lo general, ha manejado bien otros tipos, y omite su parte de archivos públicos, lo que hace que activos como css e imágenes devuelvan errores 404 o, en su caso, mime type errors – Kristian

Respuesta

21

Encontré una solución en la web. He añadido a /etc/nginx/conf.d/default.conf la siguiente:

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

El problema ahora es que una solicitud a mi archivo CSS no se redirige así, como si la raíz no está configurado correctamente. En error.log veo

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

Entonces, como segunda solución, agregué la raíz a cada ubicación definida. Ahora funciona, pero parece un poco redundante. ¿No se hereda raíz de/ubicación?

+2

¿Es esto un error de nginx? Esta es la única forma en que puedo hacer que funcione. Por cierto, estoy usando Arch Linux, nginx 1.4.1-3. – tprk77

+0

@ tprk77 no es un error, la respuesta aceptada es una solución alternativa, para una solución adecuada vea mi respuesta http://stackoverflow.com/a/23282158/1481489 – zamnuts

57

Poner el include /etc/nginx/mime.types; en location/{ en lugar de en http { resolvió el problema para mí.

+2

También tenga en cuenta que si está iniciando la configuración desde cero - a excepción de los tipos de mime, tal vez - 'include mime.types;' hace su trabajo, ya que el (al menos en Windows, nginx 1.5.2) es solo relativo a otros archivos de configuración. – omilke

+4

también tenga en cuenta que debe actualizar completamente el sitio en su navegador, p. usando ctrl + f5 para actualizar para evitar obtener archivos en caché con encabezados incorrectos. – CarelZA

+0

Esto sorprendentemente funcionó! ¡¿¿Que??! – rclai

5

Me encontré con este problema también.Se me confundió hasta que me di cuenta de lo que estaba mal:

Tiene esto:

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

desea que esta:

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

no parece que sea un error en nginx o una deficiencia en el documentos (este podría ser el comportamiento previsto, pero es extraño)

+3

esto no resolvió el problema en Windows con nginx/1.6.0 – zamnuts

15

style.css en realidad se está procesando a través de fastcgi debido a su directiva de "ubicación /". Entonces fastcgi está sirviendo el archivo (nginx > fastcgi > filesystem), y no el sistema de archivos directamente (nginx > filesystem).

Por una razón que todavía tengo que descubrir (estoy seguro de que hay una directiva en alguna parte), NGINX aplica el tipo de mimo text/html a todo lo que se atiende desde fastcgi, a menos que la aplicación backend indique explícitamente lo contrario.

El culpable es este bloque de configuración específica:

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

que debe ser:

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

Este cambio asegura que sólo se piden *.php archivos desde fastcgi. En este punto, NGINX aplicará el tipo MIME correcto. Si tiene alguna reescritura de URL ocurriendo, debe manejar esta antes de la directiva de ubicación (location ~\.php$) para que la extensión correcta sea derivada y enrutada correctamente a fastcgi.

Asegúrese de consultar this article regarding additional security considerations using try_files. Dadas las implicaciones de seguridad, considero que esto es una característica y no un error.

+1

esta debería ser la respuesta aceptada, vea también: http://forum.nginx.org/read.php?2,155222 , 155261 # msg-155261 –

+1

Parece que esto sigue siendo un problema, más de 4 años después de la pregunta original. ¿Cómo se ve la configuración correcta si solo se sirve contenido estático, es decir, ** no ** PHP? – rob

0

Seguí algunos consejos del resto de respuestas y descubrí que estas acciones raras me ayudaron (al menos en mi caso).

1) I añade al bloque de servidor de los siguientes:

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

Recargué nginx y dieron este en error.log:

2015/06/18 11:32:29 [error] 3430 # 3430: * 169 open() "/etc/nginx/html/css/mysite.css" failed (2: No such such file or directory)

2) Eliminé las filas, recargué nginx y obtuve css de trabajo. No puedo explicar lo que sucedió porque mi archivo conf llegó a ser como antes.

Mi caso era limpia Xubuntu 14.04 en VirtualBox, nginx/1.9.2, una fila 127.51.1.1 mysite en/etc/hosts y /etc/nginx/nginx.conf bastante simple con un bloque de servidor:

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

agréguela a su archivo 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

Tuve el mismo problema en Windows. Lo resolví agregando: include mime.types; en http { en mi archivo nginx.conf. Entonces todavía no funcionó ... así que miré el archivo error.log y noté que intentaba cargar los archivos .css y javascript desde la ruta del archivo pero con una carpeta/http entre. Ej: mi .css estaba en: "C: \ Users \ pc \ Documents \ nginx-server/player-web/css/index.css" y lo tomaba de: "C: \ Users \ pc \ Documents \ nginx-servidor/html /player-web/css/index.css" así que cambié mi carpeta de jugador en la web dentro de una carpeta html y funcionó;)