代码之家  ›  专栏  ›  技术社区  ›  user2490003

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

  •  1
  • user2490003  · 技术社区  · 6 年前

    我有一个简单的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;
    }
    

    如你所见,只有两条路线 / /foo

    • 当我去 www.example.com/ 一切正常。我能看到 index.html

    • 当我去 www.example.com/foo ,当我应该得到 foo.html

    查看日志,我看到以下错误:

    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 回复  |  直到 6 年前
        1
  •  1
  •   Richard Smith    6 年前

    这个 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 .

    指数 指令。

    this document 关于 指令。


    有许多解决方案可以工作,例如,使用 try_files 而不是 指数 :

    location /foo { try_files /foo.html =404; }
    

    this document 详细情况。