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.


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

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

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.


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

10

Cela a fonctionné pour moi:

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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.