Comment configurer un bloc d'emplacement pour toujours renvoyer un seul fichier dans nginx?

12

Dans mon application, je veux que l'emplacement "/" renvoie un fichier index.html statique, je veux que "/ static" serve des fichiers statiques à partir d'un dossier et je veux que toutes les autres demandes renvoient 404 NOT FOUND. Plus tard, je vais rediriger toutes les autres demandes vers un serveur WSGI.

C'est actuellement ma configuration:

# Dev server.
server {
    listen 1337;
    charset UTF-8;

    location / {
        rewrite ^ static/index_debug.html break;
    }

    location /static {
        alias /home/tomas/projects/streamcore/static;
    }
}

Le dossier statique fonctionne parfaitement, mais "/" renvoie 404 NOT FOUND. J'ai aussi essayé:

alias /home/tomas/projects/streamcore/static/index_debug.html;

Dans le bloc d'emplacement, mais cela renvoie 500 ERREUR DE SERVEUR INTERNE. Il semble que vous aliasn'aimiez pas les fichiers uniques. De plus, j'ai essayé:

try_files static/index_debug.html;

Mais cela empêche le serveur de démarrer avec l'erreur "nombre d'arguments non valide dans la directive try_files". Apparemment, try_filesvous devez en fait essayer plusieurs fichiers, ce qui n'est pas le comportement que je recherche.

Ma question est donc la suivante: comment configurer un bloc d'emplacement pour toujours renvoyer un fichier statique?


EDIT: J'ai vu d'autres réponses qui aliasdevraient en effet accepter un seul fichier comme argument, j'ai donc essayé:

location = / {
    alias /home/tomas/projects/streamcore/static/index_debug.html;
}

Mais je n'ai toujours que 500 ERREUR DE SERVEUR INTERNE. Le journal des erreurs de la demande "/" indique:

[alerte] 28112 # 0: * 7 "/home/tomas/projects/streamcore/static/index_debug.htmlindex.html" n'est pas un répertoire

Pourquoi essaie-t-il d'ouvrir "index_debug.htmlindex.html"? Je n'utilise la indexdirective nulle part.

Hubro
la source
Pouvez-voustry_files static/index_debug.html static/index_debug.html;
ceejayoz
@ceejayoz: J'essaie votre suggestion avec J'obtiens location =/404 PAS TROUVÉ, location /j'obtiens 500 ERREUR DE SERVEUR INTERNE.
Hubro
Si je ne me trompe pas, vous manquez la directive Index ... Tout serveur Web recherchera toujours le fichier d'index, fournissant l'URI racine (/), je pense que vous pouvez remplacer cela en ajoutant:location / { return 404; }
Martino Dino
@MartinoDino: Pourquoi en ai-je besoin? Et où?
Hubro
location = / {Index /home/tomas/projects/streamcore/static/index_debug.html;}
Martino Dino

Réponses:

10

Je viens de tester cela et cela fonctionne pour moi:

server {
    root /tmp/root;
    server {
        listen 8080;
        location /static {
            try_files $uri =404;
        }
        location / {
            rewrite ^ /static/index_debug.html break;
        }
    }
}

Le fichier /tmp/root/static/index_debug.htmlexiste bien sûr :)

Je peux frapper n'importe quelle URL et j'obtiens juste la page statique.

chrskly
la source
0

Vous pouvez utiliser try_files et une redirection vers un emplacement nommé avec réécriture. Comme ça:

server {
    root /tmp/root;
    server {
        listen 8080;

        location / {
            try_files $uri $uri/ @index;
        }

        location @index {
            rewrite ^ static/index_debug.html break;
        }
    }
}

Si le fichier existe, /tmp/rootil sera servi, sinon uri sera réécrit static/index_debug.htmlet il sera servi.

Kirill Zaitsev
la source