我有一个简单的nginx配置文件-
server {
listen 80 default_server;
root /var/www/example.com;
#
# Routing
#
location / { index index.html; }
location /foo { index foo.html }
#
# Logging
#
access_log /var/log/nginx/{{ www_domain }}.log;
error_log /var/log/nginx/{{ www_domain }}-error.log error;
server_name example.com;
charset utf-8;
}
如您所见,只有2条路径-/
和/foo
路径。
当我转到www.example.com/
时,一切正常。我可以看到index.html
页面已投放。
当我转到www.example.com/foo
时,应该进入foo.html
页面时收到404错误。
查看日志,我看到此错误:
2018/08/13 21:51:42 [error] 14594#14594: *6 open() "/var/www/example.com/foo" failed (2: No such file or directory), client: XX.XX.XX.XX, server: example.com, request: "GET /foo HTTP/1.1", host: "example.com"
该错误表示它正在寻找名为/var/www/example.com/foo
的文件,而不是我期望的/var/www/example.com/foo.html
。
为什么通常会发生这种情况,特别是为什么在我的根路径/
上不会发生这种情况?
谢谢!
编辑:如果我直接访问www.example.com/foo.html
,它确实可以工作
答案 0 :(得分:1)
当您提供目录的URI时,index
指令将附加文件名。
因此/
指向根目录(/var/www/example.com/
),而index index.html;
语句使nginx
返回文件/var/www/example.com/index.html
。
/foo
URI不指向目录。如果目录/var/www/example.com/foo/
实际上存在,则index foo.html;
语句将导致nginx
返回文件/var/www/example.com/foo/foo.html
。不是/var/www/example.com/foo.html
。
您试图实现的是某种无扩展方案,该方案与index
指令无关。
有关index
指令的详细信息,请参见this document。
有许多可行的解决方案,例如,使用try_files
代替index
:
location /foo { try_files /foo.html =404; }
有关详细信息,请参见this document。