gpt4 book ai didi

nginx - 如何控制 NGINX 'Location' 指令匹配顺序?

转载 作者:行者123 更新时间:2023-12-03 14:20:52 25 4
gpt4 key购买 nike

我正在尝试优化我的“位置”指令,但找不到确定是否尝试特定位置匹配的好方法。使用 echo位置 block 内部在这里没有帮助。

The NGINX ngx_http_core_module documentation有点困惑。

要使用正则表达式,您必须使用前缀:

  • ~对于区分大小写的匹配
  • ~*对于不区分大小写的匹配

  • 比赛如何进行:
  • 带有 = 的指令与查询完全匹配的前缀。如果找到,则停止搜索。
  • 所有剩余的带有常规字符串的指令。如果此匹配使用了 ^~前缀,搜索停止。
  • 正则表达式,按照它们在配置文件中定义的顺序。
  • 如果 #3 产生匹配,则使用该结果。否则,使用来自#2 的匹配。

  • 此处的数字 2 表示“常规字符串”,但随后表示它可以与 ^~ 一起使用字首。不是 ~暗示一个正则表达式?如果不是,它如何确定什么是非正则表达式?

    具体来说,我想要以下内容:
  • 提供任何文字内容/assets直接地。停止搜索。
  • 提供任何匹配正则表达式 \.php$|/$通过快速 CGI 停止搜索。
  • 通过文字 / 直接提供其他所有内容

  • 这样,只有一个 /从 Assets 外部提供的非动态文件的匹配尝试。

    我有:
    location ^~ /assets {}      # search-terminating literal? or regex?
    location ~ \.php$|/$ {}
    location / {} # is this match always attempted?

    从文档来看,实际顺序似乎是 1-3-2,始终运行文字 /匹配。是的,这种优化不会对实际性能产生任何影响,但我只是想澄清一些歧义。

    最佳答案

    来自维基:

    location  = / {
    # matches the query / only.
    [ configuration A ]
    }
    location / {
    # matches any query, since all queries begin with /, but regular
    # expressions and any longer conventional blocks will be
    # matched first.
    [ configuration B ]
    }

    因此,这将首先匹配: location ~ \.php$ {}
    即使 Assets 是由 location / {} 提供的

    在 php block 中,您还希望在传递给 fastcgi 之前防止恶意上传:
    if ($uri ~* "^/uploads/") {
    return 404;
    }

    如您所见,nginx 的工作方式与您预期的略有不同。

    关于nginx - 如何控制 NGINX 'Location' 指令匹配顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8437613/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com