【问题标题】:Why does location matching change when using proxy_pass in nginx?为什么在 nginx 中使用 proxy_pass 时位置匹配会发生变化?
【发布时间】:2017-11-14 13:00:24
【问题描述】:

简单的 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 did (301)。

  1. 为什么相同的位置规则在我的两个配置之间似乎匹配不同?
  2. 为什么第二个配置会导致 301 添加尾部斜杠?

我正在使用nginx version: nginx/1.4.6 (Ubuntu)

【问题讨论】:

  • nginx.org/r/location阅读最后一段
  • 这完美地解释了它。谢谢! “如果位置由以斜杠字符结尾的前缀字符串定义,并且请求由 proxy_pass、fastcgi_pass 之一处理......然后执行特殊处理......将返回代码为 301 的永久重定向到请求的 URI 并附加斜杠 ..."

标签: nginx


【解决方案1】:

documentation 解释清楚,正如 cmets 中所指出的那样。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 2012-12-31
    • 2014-05-17
    相关资源
    最近更新 更多