在nginx中使用proxy_pass时,为什么位置匹配会发生变化?

时间:2016-03-24 20:05:35

标签: nginx

简单的nginx配置

server {
  listen 0.0.0.0:80;

  server_name localhost 127.0.0.1;

  location /en-us/ {
    return 301 http://www.lego.com;
  }
}

以下是curl/en-us上没有尾随斜杠的情况下进行配置时会发生什么。

curl -v http://127.0.0.1/en-us -o /dev/null
# HTTP/1.1 404 Not Found

我希望404. location阻止使用prefix match,因此/en-us与该阻止不匹配对我有意义。

这里我感到困惑......

相同的配置,但使用proxy_pass

这里我使用相同的配置,但不是返回301,而是proxy_pass

server {
  listen 0.0.0.0:80;

  server_name localhost 127.0.0.1;

  location /en-us/ {
    proxy_pass http://www.lego.com;
  }
}

现在看一下当我运行相同的curl时会发生什么。

curl -v http://127.0.0.1/en-us -o /dev/null
# HTTP/1.1 301 Moved Permanently

/en-us上的301对我没有意义。它已重定向到Location: http://127.0.0.1/en-us/

在第一个配置中,/en-us似乎匹配我的location块(404)。在第二个配置中,/en-us 执行了(301)。

  1. 为什么我的两个配置中相同的位置规则似乎不同?
  2. 为什么第二个配置会导致301添加一个尾部斜杠?
  3. 我正在使用nginx version: nginx/1.4.6 (Ubuntu)

1 个答案:

答案 0 :(得分:0)

documentation清楚地解释了事情,正如评论中所指出的那样。

  

如果某个位置由以斜杠字符结尾的前缀字符串定义,并且请求由proxy_pass,fastcgi_pass,...之一处理,则执行特殊处理...具有代码301的永久重定向将返回到请求的URI并附加斜杠...

proxy_pass

上的尾部斜杠进行特殊处理