La directive de localisation ne fonctionne pas

10

Pour mon serveur NGINX, j'ai un serveur virtuel configuré juste pour diffuser du contenu statique. En ce moment, j'essaie de le configurer pour que les images aient une date d'expiration. Cependant, lorsque je crée une directive d'emplacement pour cela, tout se traduit simplement par un 404.

Ma configuration ressemble maintenant à ceci:

/srv/www/static.conf

server {
    listen                          80;
    server_name                     static.*.*;

    location / {
            root                    /srv/www/static;
            deny                    all;
    }

    location /images {
            expires                 1y;
            log_not_found           off;
            root                    /srv/www/static/images;
    }
}

Remarque, ce fichier est inclus à partir de /etc/nginx/nginx.conf, dans une directive http

Je suis en train d'accéder à l'image, à, disons ... static.example.com/images/screenshots/something.png. Effectivement, l'image existe également à /srv/www/static/images/screenshots/something.png. Cependant, aller à cette adresse ne fonctionne pas et me dit simplement 404 Not Found .

Cependant, si je supprime location /imageset modifie location /ce qui suit ...

location / {
    root /srv/www/static;
}

Ça marche! Qu'est-ce que je fais mal ici?

Marques Jesse
la source

Réponses:

14

Votre configuration suit les pièges de configuration de nginx Vous devez la lire avant de configurer nginx.

Pour répondre à votre question, vous ne devez pas définir l' rootemplacement, définissez-le une fois et la balise d'emplacement vous permettra automatiquement d'attribuer l'accès à des répertoires spécifiques.

Aussi, au lieu de définir la racine personnalisée pour le répertoire d'images, utilisez try_files. Le répertoire $urimappera /images/avec /static/images/.

Essayez cette configuration:

server {
    listen                          80;
    server_name                     static.*.*;
    root                            /srv/www;

    location /static/ {
            deny                    all;
    }

    location /images/ {
            expires                 1y;
            log_not_found           off;
            autoindex               off;
            try_files $uri static/images$uri;
    }
}
cerceaux
la source
Je vous remercie! J'ai lu les pièges, mais je suppose que ma mémoire m'a fait défaut. Cela fonctionne, même si je l'ai légèrement modifié pour mes besoins.
Jesse Brands
Oui, j'en relis moi-même de temps en temps des parties, il y a une raison pour laquelle il a une page wiki séparée pour ça;)
phoops
Si définir à l' rootintérieur locationest une mauvaise pratique, comment se fait-il qu'ils le donnent eux-mêmes dans alias docs / http / ngx_http_core_module.html # ? (voir où il est dit " il vaut mieux utiliser la directive racine à la place ") CORRECTION : D'accord, il semble que ce qui ne va pas est de définir la racine principale dans un emplacement, pas n'importe quelle racine
aexl