web-dev-qa-db-fra.com

Comment configurer un bloc d'emplacement pour toujours renvoyer un fichier unique dans NGinx?

Dans mon application, je souhaite que l'emplacement "/" pour renvoyer un fichier statique index.html, je veux "/ static" de servir des fichiers statiques à partir d'un dossier et je souhaite que toutes les autres demandes de retour 404 non trouvées. À un moment ultérieur, je vais rediriger toutes les autres demandes d'un serveur WSGI.

Ceci 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 "/" retourne 404 non trouvé. J'ai aussi essayé:

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

Dans le bloc d'emplacement, mais qui renvoie 500 erreurs de serveur internes. Il semble que alias _ n'aime pas les fichiers simples. De plus, j'ai essayé:

try_files static/index_debug.html;

Mais cela arrête le serveur de commencer par l'erreur "Nombre de virgule non valide dans la directive Try_Files". Apparemment try_files exige que vous essayiez plus d'un fichier, ce qui n'est pas le comportement que je recherche.

Donc, ma question est la suivante: Comment puis-je configurer un bloc d'emplacement pour toujours renvoyer un fichier statique?


Edit : J'ai vu d'autres réponses que alias devrait en effet accepter un seul fichier comme argument, alors j'ai essayé:

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

Mais je n'ai toujours que 500 erreurs de serveur internes. Le journal d'erreur pour la requête "/" dit:

[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 pas la directive index n'importe où.

12
Hubro

Je viens de tester cela et ça marche 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.html existe bien sûr :)

Je peux frapper n'importe quelle URL et je viens d'obtenir la page statique.

10
chrskly

Vous pouvez utiliser Try_Files et une redirection à 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 dans /tmp/root Il sera servi, sinon UriR sera réécrit à static/index_debug.html et ce sera servi.

0
Kirill Zaitsev