我正在尝试实现以下行为:
在文件结构中
/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
块。