用于查找 index.html 的 Nginx 配置

用于查找 index.html 的 Nginx 配置

我正在尝试实现以下行为:

在文件结构中

/var/html/jpmelos.com/
- index.html
- public/
  - index.html

如果我访问http://jpmelos.com,我想获取public/index.html文件是否存在,如果不存在,我想提示用户输入用户名和密码并获取index.html。 如果访问 ,行为相同http://jpmelos.com/index.html。 首先检查和匹配公共文件夹,然后检查和匹配受密码保护的文件夹。

我在块中包含了这个配置文件http

server {
    listen 80;
    server_name jpmelos.com;

    location / {
        root /var/html/jpmelos.com/public;
        index index.html;
        try_files $request_uri @redirect;
    }

    location @redirect {
        auth_basic on;
        auth_basic_user_file /htpasswd/jpmelos;

        root /var/html/jpmelos.com;
        index index.html;
    }
}

当我到达时,结果行为http://jpmelos.com/index.html是正确的,我得到了文件public/index.html。但是当我到达时http://jpmelos.com,它返回一个403 Forbidden。我正在运行Ubuntu 15.10,Nginx 1.11.1。

这很令人困惑,因为既然文件可以从 中返回http://jpmelos.com/index.html,我们就知道这并没有被禁止。而且配置正确设置了index index.html,文件就在那里。

那么,我遗漏了什么?


另外,还有一个问题:如果我更改root /var/html/jpmelos.com/public;alias /var/html/jpmelos.com/public;,它就不再匹配,并返回404 Not Found。这是为什么?

答案1

我修复了我的配置并实现了我想要的:

server {
    listen 80; 
    server_name jpmelos.com;
    root /var/html/jpmelos.com/public;

    index index.html;
    autoindex off;

    location / { 
        try_files $uri $uri/ @redirect;
    }   

    location @redirect {
        auth_basic on; 
        auth_basic_user_file /htpasswd/jpmelos;

        root /var/html/jpmelos.com;
    }
}

将第一个根指令移至server块,只是因为这是一个很好的做法。然后,index也移动该指令,以避免重复。然后,更改该try_files指令。这将尝试$uri文件,然后$uri 目录使用index指令,然后重定向。

重定向后,设置身份验证设置并将根更新为新值,仅针对该location块。

相关内容