nginx location指令不首先查找指定的文件

时间:2018-08-13 21:59:12

标签: nginx nginx-location

我有一个简单的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,它确实可以工作

1 个答案:

答案 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