Nginx解决了错误的路线

时间:2014-04-07 07:18:06

标签: nginx

我有一个基于nginx的配置,其中域的根应该通向静态页面(启动页面),其他任何东西都应该代理到内部可访问的机器。配置大致如下:

server {
    listen 80;

    location = / {
        root /var/www;
    }

    location ~ / {
        location /robots.txt {
            root /var/www;
        }   
        proxy_pass http://127.0.0.1:9091;
        proxy_set_header Host $host;
    }

}

问题在于,如果第二个代码块存在,则第一个代码块不再被考虑在内。换句话说,nginx开始在9091实例上查找index.html文件,该文件不存在。如果注释了proxy_pass块,则第一部分生效。

就文件而言,情况并非如此。如果我的域的根被调用,Nginx应该在第一个块之后停止搜索,因为它是显式的。但事实并非如此。

这里应该做什么?我不想将启动页面代码与其余部分合并。

3 个答案:

答案 0 :(得分:1)

你的配置看起来很奇怪,但没有迹象表明它不应该像你想要的那样工作。

也许你可以试试这样的东西?另外,请提供您的完整配置(也许您的简要示例缺少我们应该了解的重要内容)。

server {
    listen 80;
    root /var/www;
    location = / {
    }
    location = /index.html {
    }
    location = /robots.txt {
    }
    location / {
        proxy_pass http://127.0.0.1:9091;
        proxy_set_header Host $host;
    }
}

答案 1 :(得分:0)

试试这个:

splash.html替换为您的启动页面文件名。

# Set root directory for requests
root /var/www;

# Rewrite / to /splash.html
rewrite ^/$ /splash.html break;

location = /splash.html { }

location = /robots.txt { }

location ~* / {
    proxy_pass http://127.0.0.1:9091;
    proxy_set_header Host $host;
}

答案 2 :(得分:0)

我猜你在某个地方有index指令,这就是index的工作方式。

  

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

您的第一次location次匹配,但随后index模块会导致内部重定向到/index.html,请求会在第二个location阻止中结束。

我会写这样的东西:

server {
    listen 80;
    root /var/www;

    location = /index.html {
    }

    location = /robots.txt {
    }

    location / {
        proxy_pass http://127.0.0.1:9091;
        proxy_set_header Host $host;
    }
}