2012-04-25 15 views
11

Estoy tratando de configurar nginx para que "static.domain.com" solo pueda servir imágenes. Esto es lo que se me ocurrió, pero sé que se puede hacer de manera más eficiente. Quiero servir 403.html si alguien intenta acceder a cualquier archivo .htm, .php, directorio (¿me falta algo más?). Por supuesto, con la excepción de los archivos 403.htm y static.htm.nginx - solo imágenes

¿Alguna idea de cómo puedo asegurar esto correctamente?

server { 
    listen   xx.xx.xx.xx:80; 

    server_name  static.domain.com; 

    root   /www/domain.com/httpdocs; 
    index   static.htm; 

    access_log  off; 
    error_log  /dev/null crit; 

    error_page 403 /403.html; 

    # Disable access to .htaccess or any other hidden file 
    location ~ /\.ht { 
     deny all; 
    } 

    location ~* \.php { 
     deny all; 
    } 

    # Serve static files directly from nginx 
    location ~* \.(jpg|jpeg|gif|png|bmp|ico|pdf|flv|swf|exe|html|htm|txt|css|js) { 
     add_header  Cache-Control public; 
     add_header  Cache-Control must-revalidate; 
     expires   7d; 
    } 
} 

Respuesta

18

¿Por qué no mover las imágenes hacia arriba y luego negar todo?

location ~* \.(jpg|jpeg|gif|png|bmp|ico|pdf|flv|swf|exe|html|htm|txt|css|js) { 
    add_header  Cache-Control public; 
    add_header  Cache-Control must-revalidate; 
    expires   7d; 
} 
location/{ 
    deny all; 
} 

no hay sintaxis para que no coincida con una expresión regular. En su lugar, haga coincidir la expresión regular de destino y asigne un bloque vacío, luego use la ubicación/para hacer coincidir cualquier otra cosa. -desde http://wiki.nginx.org/HttpCoreModule#location

Editar: Se ha eliminado "=" de "lugar /" Para citar los documentos:

location =/{ 
    # matches the query/*only.* 
} 
location/{ 
    # matches *any query*, since all queries begin with /, but regular 
    # expressions and any longer conventional blocks will be 
    # matched first. 
} 

Mi mal.

+0

¿Es así de simple? nada más se necesita? –

+0

Debería ser, por supuesto, lo probaría para estar seguro ya que no he ejecutado lo que escribí allí. La ubicación ~ * \. (Jpg | jpeg | gif | png ...) coincide con todos los tipos enumerados allí separados con pipes, si no coincide con "/" porque "/" coincide con todo. –

+0

Bien, esto no funcionará porque en FireFox, cualquier archivo .php al que se acceda le permite al usuario descargar el archivo (muestra el mensaje de solicitud de descarga). –