【问题标题】:nginx. Test which location used to process requestnginx。测试用于处理请求的位置
【发布时间】:2012-09-24 02:21:28
【问题描述】:

我想知道如何知道某个特定位置是否用于处理nginx 中的请求。

例如:

# 1
location / {}

# 2
location ~ /[\w\-]+\.html {}

# 3
location ~ /\w+\.html {}

我如何知道像 /mysite 这样的 URI 是否由第三个位置而不是第二个位置处理? 对于这件事,我倾向于使用add_header

location / {
    add_header location 1;
}

location ~ /(\w+\-)\.html {
    add_header location 2;    
}

location @named {
    add_header location named;
}

我想知道有没有更好的解决方案,或者您个人使用什么来进行调试?

【问题讨论】:

  • 这只会在您的 HTTP 响应代码为 200、204、301、302 或 304 时添加标头。因此它不会帮助您跟踪 404:/
  • 对于后来的人:在 1.7.5 之后的 nginx 版本中(在 Air 发表评论后几个月发布),您可以向 add_header 添加一个 always 参数,这将指示 nginx无论状态码如何,始终添加它。

标签: debugging nginx


【解决方案1】:

如果您只想查看使用了哪个块,而不关心返回其他有效结果,则使用return 而不是add_header 可能更直接。

location / {
    return 200 'location 1';
}

location ~ /(\w+\-)\.html {
    return 200 'location 2';    
}

location @named {
    return 200 'location named';
}

【讨论】:

  • 我见过的关于测试 uris 的最佳答案。
  • 这真的很酷。我有一个奇怪的问题,几乎没有位置工作。用这个我一下子就找到了。
  • 这很方便。在return 之前添加add_header content-type text/plain; 以使其显示在浏览器窗口中。
  • 谢谢,这对我很有帮助
【解决方案2】:

对这种方法提出警告。我发现使用location 作为调试标头是个坏主意,因为Location 是HTTP 响应301 使用的真实标头。

所以如果(像我一样)在你的测试中你最终得到这个:

HTTP/1.1 301 Moved Permanently
...
Location: http://mydomain.com/banana/
location: banana

然后你的浏览器会崩溃并报告Duplicate headers received from server。所以请使用locationdebug 或其他安全的东西。

【讨论】:

  • banana & lemon 比 foo & bar 好! :-)
【解决方案3】:

add_header 技巧是我将如何做到的。

我现在正在工作,所以我无法测试,但你可能会在日志文件中得到一些东西,我将error_log 级别设置为:

  • debug:您的 nginx 需要使用 --with-debug 构建才能正常工作,您可以使用 nginx -V 命令进行检查
  • notice: 如果没有启用调试日志

【讨论】:

  • add_header 技巧在您最想调试的情况下不起作用:它不适用于 4xx 响应。
猜你喜欢
  • 2018-08-25
  • 2011-03-27
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
相关资源
最近更新 更多