nginx: envoyer toutes les demandes sur une seule page html

156

En utilisant nginx, je souhaite conserver l'URL, mais charger la même page quoi qu'il arrive. J'utiliserai l'url avec History.getState()pour acheminer les requêtes dans mon application javascript. Il semble que cela devrait être une chose simple à faire?

location / {
    rewrite (.*) base.html break;
}

fonctionne, mais redirige l'URL? J'ai toujours besoin de l'url, je veux juste utiliser toujours la même page.

prisme de tout
la source
6
Merci d'avoir posé cette question pour que la réponse soit prête pour moi :-)
Lasse Bunk

Réponses:

191

Je pense que cela le fera pour vous:

location / {
    try_files /base.html =404;
}
Alex Howansky
la source
1
[émerg] 613 # 0: nombre d'arguments invalide dans la directive "try_files"?
prismofeverything
2
Ok, essayez ceci: try_files $ uri /base.html;
Alex Howansky
5
Remarque - cela vérifiera d'abord le fichier demandé, et s'il n'est pas là, il servira base.html. Assurez-vous donc que vous n'avez pas d'anciens fichiers supplémentaires dans le répertoire racine de votre document, sinon ils seront servis directement si vous êtes interrogé.
Alex Howansky
22
L'utilisation de try_files '' /base.html;(chaîne vide comme premier argument de try_files) évite la recherche d'un fichier appelé $uri.
davidjb
17
try_files '' /base.html;m'a donné un problème de redirection et une erreur de serveur interne, mais en le modifiant pour résoudre ce problème try_files '' /base.html =404;, si cela aide quelqu'un.
William Turrell
30

L'utilisation try_filesne fonctionnait tout simplement pas pour moi - cela provoquait une erreur de réécriture ou de cycle de redirection interne dans mes journaux.

La documentation Nginx contenait quelques détails supplémentaires:

http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files

J'ai donc fini par utiliser ce qui suit:

root /var/www/mysite;

location / {
    try_files $uri /base.html;
}

location = /base.html {
    expires 30s;
}
Kevan Stannard
la source
1
try_files '' /base.html =404;(voir ci-dessus)
Marc
Cela a fonctionné pour moi, mais je n'avais en fait pas besoin de la location = /base.html { expires 30s }pièce.
maechler
17

Votre réécriture originale devrait presque fonctionner. Je ne sais pas pourquoi cela redirigerait, mais je pense que vous voulez vraiment

rewrite ^ /base.html break;

Vous devriez pouvoir le mettre dans un emplacement ou directement sur le serveur.

kolbyjack
la source
13

Cela a fonctionné pour moi:

location / {
    alias /path/to/my/indexfile/;
    try_files $uri /index.html;
}

Cela m'a permis de créer une URL fourre-tout pour une application javascript d'une seule page. Tous les fichiers statiques tels que css, polices et javascript créés par npm run build seront trouvés s'ils se trouvent dans le même répertoire que index.html.

Si les fichiers statiques se trouvaient dans un autre répertoire, pour une raison quelconque, vous auriez également besoin de quelque chose comme:

# Static pages generated by "npm run build"
location ~ ^/css/|^/fonts/|^/semantic/|^/static/ {
    alias /path/to/my/staticfiles/;
}
Mark Chackerian
la source
10

Cela a fonctionné pour moi:

location / {
    try_files $uri $uri/ /base.html;
}
Abhishek
la source
7

La bonne façon serait:

location / {
    rewrite (.*) base.html last;
}

L'utilisation lastpermettra à nginx de trouver un nouveau locationbloc approprié en fonction du résultat de la réécriture.

try_files est également une approche parfaitement valable de ce problème.

Éthérealone
la source