nginx = /位置模式不起作用

时间:2015-05-19 00:23:26

标签: nginx

我正在尝试配置nginx以在根域上提供静态html页面,并将其他所有内容代理到uwsgi。作为一个快速测试,我试图转向两个不同的静态页面:

server {
    server_name *.example.dev;
    index  index.html index.htm;
    listen      80;
    charset     utf-8;

    location = / {
        root   /www/src/;
    }

    location / {
        root /www/test/;
    }
}

这似乎是http://nginx.org/en/docs/http/ngx_http_core_module.html#location所说的。但是我总是被发送到测试网站,即使是在/请求中,也可以访问我的浏览器中的http://www.example.dev

卷曲输出:

$ curl http://www.example.dev -v
* Rebuilt URL to: http://www.example.dev/
* Hostname was NOT found in DNS cache
*   Trying 192.168.50.51...
* Connected to www.example.dev (192.168.50.51) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.37.1
> Host: www.example.dev
> Accept: */*
> 
< HTTP/1.1 200 OK
* Server nginx/1.8.0 is not blacklisted
< Server: nginx/1.8.0
< Date: Tue, 19 May 2015 01:11:10 GMT
< Content-Type: text/html; charset=utf-8
< Content-Length: 415
< Last-Modified: Wed, 15 Apr 2015 02:53:27 GMT
< Connection: keep-alive
< ETag: "552dd2a7-19f"
< Accept-Ranges: bytes
< 
<!DOCTYPE html>
<html>
...

来自nginx访问日志的输出:

192.168.50.1 - - [19/May/2015:01:17:05 +0000] "GET / HTTP/1.1" 200 415 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36" "-"

所以我决定将测试位置注释掉。所以我只有location = / { ...块。 Nginx现在404s并记录以下错误:

2015/05/19 01:24:12 [error] 3116#0: *6 open() "/etc/nginx/html/index.html" failed (2: No such file or directory), client: 192.168.50.1, server: *.example.dev, request: "GET / HTTP/1.1", host: "www.example.dev"

原始nginx conf文件中的默认根目录是什么?我想这证实我的location = /模式匹配。

我在访问日志中添加了$uri并看到它显示/index.html,我猜这意味着第一个位置模式 匹配,但后来进入第二个位置块?所以现在我只需要弄清楚如何从/块中提供index.html,或者只添加另一个块,如:location =/index.html

1 个答案:

答案 0 :(得分:0)

根据@Alexey Ten评论,在ngx_http_index doc中:

  

应该注意,使用索引文件会导致内部重定向,并且可以在不同的位置处理请求。例如,使用以下配置:

location = / {
    index index.html;
}

location / {
    ...
}
  

“/”请求实际上将在第二个位置处理为“/index.html”。

在您的情况下,请求“/”不会获得/www/src/index.html,但/www/test/index.html。