60

如何为域名设置 index.html,例如https://www.example.com/ - 将用户引导至根目录中的 index.html。

我尝试了不同的方法,例如:

server {
    # some configs

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

}

没有什么帮助我。

还有其他一些带有 location 关键字的配置,尽管我也对它们进行了评论。

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

所有这些都被评论和取消评论,但没有任何帮助。

PS 版本是在 /etc/nginx/sites-enabled/domainname.com 文件中制作的。

4

5 回答 5

59

在您的位置块中,您可以执行以下操作:

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

这将告诉 ngingx 查找具有首先给出的确切名称的文件,如果没有找到这样的文件,它将尝试 uri/index.html。因此,如果对https://www.example.com/的请求来了,它会首先查找完全匹配的文件,如果没有找到,则会检查 index.html

于 2012-08-14T17:49:55.603 回答
44

location / {是最一般的位置(带有location {)。它会匹配任何东西,AFAIU。我怀疑它是否有用,location / { index index.html; }因为您网站的每个子目录都有很多重复的内容。

该方法与

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

很糟糕,正如上面的评论中提到的,因为它会返回index.html您网站上不应该存在的页面(任何可能的$uri结果都会出现)。此外,正如上面的答案中提到的,在的最后一个参数中有一个内部重定向try_files

你的方法

location = / {
   index index.html;

也很糟糕,因为也会index进行内部重定向。如果您需要,您应该能够在特定的location. 创建例如

location = /index.html {

正如这里提出的那样。但是随后您将拥有一个工作链接http://example.org/index.html,这可能不是您所希望的。我使用的另一个变体是:

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

PS调试nginx非常容易(如果你的二进制文件允许的话)。只需添加到server {块中:

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

并查看所有内部重定向等。

于 2015-10-30T16:18:21.353 回答
21

答案是将根目录放置在位置指令中:

root   /srv/www/ducklington.org/public_html;
于 2012-08-14T14:42:08.907 回答
5

根据文档按指定顺序检查文件是否存在,并使用第一个找到的文件进行请求处理;处理在当前上下文中执行。文件的路径是根据根和别名指令从文件参数构造的。可以通过在名称末尾指定斜杠来检查目录是否存在,例如“$uri/”。如果没有找到任何文件,则内部重定向到最后一个参数中指定的 uri。重要的

内部重定向到最后一个参数中指定的 uri。

因此,如果前两个参数返回 false,则在最后一个参数中您应该添加您的页面或代码。

location / {
  try_files $uri $uri/index.html index.html;
}
于 2014-05-28T07:22:59.260 回答
1

对我来说,try_files(目前投票最多的)答案https://stackoverflow.com/a/11957896/608359中的指令导致重写周期,

*173 rewrite or internal redirection cycle while internally redirecting

我对 index 指令有更好的运气。请注意,我在名称前使用了正斜杠,这可能是也可能不是您想要的。

server {
  listen 443 ssl;
  server_name example.com;

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

  # ... ssl configuration
}

在这种情况下,我希望所有路径都指向 /index.html,包括返回 404 时。

于 2019-02-10T12:31:40.257 回答