How to set index.html as root file in Nginx?

后端 未结 5 575
挽巷
挽巷 2020-12-08 09:14

How to set index.html for the domain name e.g. https://www.example.com/ - leads user to index.html in root directory.

I\'ve tried different things like:

         


        
相关标签:
5条回答
  • 2020-12-08 09:44

    in your location block you can do:

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

    which will tell ngingx to look for a file with the exact name given first, and if none such file is found it will try uri/index.html. So if a request for https://www.example.com/ comes it it would look for an exact file match first, and not finding that would then check for index.html

    0 讨论(0)
  • 2020-12-08 09:47

    The answer is to place the root dir to the location directives:

    root   /srv/www/ducklington.org/public_html;
    
    0 讨论(0)
  • 2020-12-08 09:49

    According to the documentation Checks the existence of files in the specified order and uses the first found file for request processing; the processing is performed in the current context. The path to a file is constructed from the file parameter according to the root and alias directives. It is possible to check directory’s existence by specifying a slash at the end of a name, e.g. “$uri/”. If none of the files were found, an internal redirect to the uri specified in the last parameter is made. Important

    an internal redirect to the uri specified in the last parameter is made.

    So in last parameter you should add your page or code if first two parameters returns false.

    location / {
      try_files $uri $uri/index.html index.html;
    }
    
    0 讨论(0)
  • 2020-12-08 09:55

    location / { is the most general location (with location {). It will match anything, AFAIU. I doubt that it would be useful to have location / { index index.html; } because of a lot of duplicate content for every subdirectory of your site.

    The approach with

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

    is bad, as mentioned in a comment above, because it returns index.html for pages which should not exist on your site (any possible $uri will end up in that). Also, as mentioned in an answer above, there is an internal redirect in the last argument of try_files.

    Your approach

    location = / {
       index index.html;
    

    is also bad, since index makes an internal redirect too. In case you want that, you should be able to handle that in a specific location. Create e.g.

    location = /index.html {
    

    as was proposed here. But then you will have a working link http://example.org/index.html, which may be not desired. Another variant, which I use, is:

    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. It's extremely easy to debug nginx (if your binary allows that). Just add into the server { block:

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

    and see there all internal redirects etc.

    0 讨论(0)
  • For me, the try_files directive in the (currently most voted) answer https://stackoverflow.com/a/11957896/608359 led to rewrite cycles,

    *173 rewrite or internal redirection cycle while internally redirecting
    

    I had better luck with the index directive. Note that I used a forward slash before the name, which might or might not be what you want.

    server {
      listen 443 ssl;
      server_name example.com;
    
      root /home/dclo/example;
      index /index.html;
      error_page 404 /index.html;
    
      # ... ssl configuration
    }
    

    In this case, I wanted all paths to lead to /index.html, including when returning a 404.

    0 讨论(0)
提交回复
热议问题