2012-04-25 18 views
11

Próbuję skonfigurować nginx, aby "static.domain.com" wyświetlało tylko obrazy. Oto, co wymyśliłem, ale wiem, że można to zrobić bardziej efektywnie. Chcę serwować 403.html, jeśli ktoś próbuje uzyskać dostęp do plików .htm, .php, directory (cokolwiek innego, czego mi brakuje?). Oczywiście, z wyjątkiem plików 403.htm i static.htm.nginx - służą tylko obrazy

Jakieś pomysły, w jaki sposób mogę to właściwie zabezpieczyć?

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

Odpowiedz

18

Dlaczego nie przenieść obrazów, a następnie odmówić wszystkim?

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

nie ma składnia nie pasuje do wyrażenia regularnego. Zamiast tego dopasuj docelowe wyrażenie regularne i przypisz pusty blok, a następnie użyj lokalizacji /, aby dopasować cokolwiek innego. -Od http://wiki.nginx.org/HttpCoreModule#location

Edit: usunięto "=" z "lokalizacji /" Cytując docs:

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

mój zły.

+0

To takie proste? nic więcej nie jest potrzebne? –

+0

Powinienem oczywiście przetestować to na pewno, ponieważ nie uruchomiłem tego, co tam napisałem. Lokalizacja ~ * \. (Jpg | jpeg | gif | png ...) pasuje do wszystkich wymienionych tam typów rozdzielonych rurami, jeśli nie, to pasuje do "/", ponieważ "/" pasuje do wszystkiego. –

+0

OK, to nie zadziała, ponieważ w FireFox każdy dostęp do pliku .php umożliwia użytkownikowi pobranie pliku (wyświetla monit o pobranie). –

Powiązane problemy