web-dev-qa-db-fra.com

Comment définir index.html en tant que fichier racine dans Nginx?

Comment définir index.html pour le nom de domaine, par exemple https://www.example.com/ - conduit l'utilisateur à index.html dans le répertoire racine. 

J'ai essayé différentes choses comme: 

server {
    # some configs

    location = / {
            index index.html;
            fastcgi_index index.html;
    }
or 
    location / {
            index index.html;
            fastcgi_index index.html;
    }

}

Rien ne m'a aidé. 

Il y a quelques autres configs avec le mot-clé location, bien que je les ai commentées non plus.

Les autres "emplacements" configurés dans la clause server {

location ~ .*(css|htc|js|bmp|jp?g|gif|ico|cur|png|swf|htm?|html)$ {
        access_log off;
        root $www_root;
}

location ~ \.php$
{
        include                         /etc/nginx/fastcgi_params;
        index                           index.html;
        fastcgi_index                   index.html;
        fastcgi_param SCRIPT_FILENAME   $www_root$fastcgi_script_name;
        fastcgi_param QUERY_STRING      $query_string;
        fastcgi_param PATH_INFO         $fastcgi_path_info;
        fastcgi_pass                    127.0.0.1:9000;
        # Директива определяет что ответы FastCGI-сервера с кодом больше или равные 400
        # перенаправлять на обработку nginx'у с помощью директивы error_page
        fastcgi_intercept_errors        on;
        break;
}

location ~ /\.ht {
    deny all;
}

Tous ont été commentés et non commentés, mais rien n'a aidé.

Les éditions PS ont été créées dans le fichier /etc/nginx/sites-enabled/domainname.com.

36
Arthur Kushman

La réponse consiste à placer le répertoire racine dans les directives d'emplacement:

root   /srv/www/ducklington.org/public_html;
16
Arthur Kushman

dans votre bloc de localisation, vous pouvez faire:

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

qui dira à ngingx de chercher un fichier avec le nom exact donné en premier, et si aucun fichier de ce type n’est trouvé, il essaiera uri/index.html. Donc, si une requête pour https://www.example.com/ est reçue, elle recherchera d'abord une correspondance de fichier exacte.

39
cobaco

location / { est l'emplacement le plus général (avec location {). Cela correspond à tout, AFAIU . Je doute qu'il soit utile d'avoir location / { index index.html; } en raison de nombreux contenus dupliqués pour chaque sous-répertoire de votre site.

L'approche avec 

try_files $ uri $ uri/index.html index.html;

est mauvais, comme mentionné dans un commentaire ci-dessus, car il renvoie index.html pour des pages qui ne devraient pas exister sur votre site (tout $uri possible finira par cela) . rediriger dans le dernier argument de try_files

Votre approche 

location = / {
   index index.html;

est également mauvais, puisque index effectue également une redirection interne. Au cas où vous le souhaiteriez, vous devriez pouvoir gérer cela dans une location spécifique. Créer par exemple.

location = /index.html {

comme cela a été proposé ici . Mais alors vous aurez un lien de travail http://example.org/index.html, qui peut ne pas être désiré. Une autre variante, que j'utilise, est la suivante:

root /www/my-root;

# http://example.org
# = means exact location
location = / {
    try_files /index.html =404;
}

# disable http://example.org/index as a duplicate content
location = /index      { return 404; }

# This is a general location. 
# (e.g. http://example.org/contacts <- contacts.html)
location / {
    # use fastcgi or whatever you need here
    # return 404 if doesn't exist
    try_files $uri.html =404;
}

P.S. Il est extrêmement facile de déboguer nginx (si votre binaire le permet). Ajoutez simplement dans le bloc server {:

error_log /var/log/nginx/debug.log debug;

et y voir toutes les redirections internes, etc.

27
Yaroslav Nikitenko

Selon la documentation Vérifie l’existence de fichiers dans l’ordre spécifié et utilise le premier fichier trouvé pour le traitement de la demande; le traitement est effectué dans le contexte actuel. Le chemin d'accès à un fichier est construit à partir du paramètre file conformément aux directives root et alias. Il est possible de vérifier l’existence du répertoire en spécifiant une barre oblique à la fin du nom, par exemple. “$ Uri /”. Si aucun des fichiers n'a été trouvé, une redirection interne vers l'URI spécifié dans le dernier paramètre est effectuée. Important

une redirection interne vers l'URI spécifié dans le dernier paramètre est fabriqué.

Donc, en dernier paramètre, vous devez ajouter votre page ou votre code si les deux premiers paramètres renvoient false. 

location / {
  try_files $uri $uri/index.html index.html;
}
4
Nokors

Pour moi, la directive try_files dans la réponse (actuellement la plus votée) https://stackoverflow.com/a/11957896/608359 conduit à des cycles de réécriture,

*173 rewrite or internal redirection cycle while internally redirecting

J'ai eu plus de chance avec la directive index. Notez que j'ai utilisé une barre oblique avant le nom, ce qui peut être ou ne pas être ce que vous voulez.

server {
  listen 443 ssl;
  server_name example.com;

  root /home/dclo/example;
  index /index.html;
  error_page 404 /index.html;

  # ... ssl configuration
}

Dans ce cas, je voulais que tous les chemins mènent à /index.html, y compris lors du renvoi d'un 404.

0
Douglas Lovell