博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nginx conf location 配置
阅读量:4028 次
发布时间:2019-05-24

本文共 3640 字,大约阅读时间需要 12 分钟。

http://eyesmore.iteye.com/blog/1141660

匹配 规则是:
    
 1 先匹配普通location (再匹配正则表达式)
     注意:官方文档这句话就明确说了,先普通location ,而不是有些同学的误区“先匹配正则location ”
     2 “
普通location ”内部(普通location 与普通location )是如何匹配的呢?简单的说:
最大前缀匹配
     3
   普通location匹配不代表是最终结果,还会继续匹配正则location的匹配:
普通location 先匹配,而且选择了
最大前缀匹配后,不能就停止后面的匹配,最大前缀匹配只是一个临时的结果,
           nginx 还需要继续检查正则location (但至于最终才能普通location 的最大前缀匹配,还是正则location 的匹配,截止当前的内容还没讲,但后面会讲)。
     4
 “正则location ”与“正则location ”内部的匹配规则是:按照正则location 在配置文件中的
物理顺序(编辑顺序)匹配的(这句话就说明location 并不是一定跟顺序无关,
              只是普通location 与           顺序无关,正则location 还是与顺序有关的),并且只要
匹配到一条正则location ,就
不再考虑后面的(这与“普通location ”与“正则location ”之间的规则不一样
            “普通location ”与“正则location ”之间的规则是:选择出“普通location ”的最大前缀匹配结果后,还需要继续搜索正则location )
     5 “普通location ”的最大前缀匹配结果与继续搜索的“正则location ”匹配结果的决策关系。如果继续搜索的“正则location ”也有匹配上的,
           那么“
正则location ”覆盖 “普通location ”的最大前缀匹配(因为有这个覆盖关系,所以造成有些同学以为正则location 先于普通location 执行的错误理解);
           但是如果“
正则location ”没有能匹配上,那么就用“普通location ”的最大前缀匹配结果
     6  
只匹配普通location 不匹配 正则location(^~ 不要继续匹配正则 ):通常的规则是,匹配完了“普通location ”指令,还需要继续匹配“正则location ”,
         但是你也可以告诉Nginx :匹配到了“普通location ”后,不再需要继续匹配“正则location ”了,
         要做到这一点只要在“普通location ”前面加上“^~ ”符号(^ 表示“非”,~ 表示“正则”,字符意思是:不要继续匹配正则)
          除了上文的“^~ ”可以阻止继续搜索正则location 外,你还可以加
“= ”
          
那么如果“^~ ”和“= ”都能阻止继续搜索正则location 的话,那它们之间有什么区别呢?区别很简单,共同点是它们都能阻止继续搜索正则location ,不同点是“^~ ”依然遵守“最大前缀”匹配规则,然而“= ”不是“最大前缀”,而是必须是严格匹配(exact match )。
这里顺便讲下“location / {} ”和“location = / {} ”的区别,“location / {} ”遵守普通location 的最大前缀匹配,由于任何 URI 都必然以“/ ”根开头,所以对于一个URI ,如果有更specific 的匹配,那自然是选这个更specific 的,如果没有,“/ ”一定能为这个URI 垫背(至少能匹配到“/ ”),也就是说“location / {} ”有点默认配置的味道,其他更specific 的配置能覆盖overwrite 这个默认配置(这也是为什么我们总能看到location / {} 这个配置的一个很重要的原因)。而“location = / {} ”遵守的是“严格精确匹配exact match ”,也就是只能匹配 http://host:port/ 请求,同时会禁止继续搜索正则location 。因此如果我们只想对“GET / ”请求配置作用指令,那么我们可以选“location = / {} ”这样能减少正则location 的搜索,因此效率比“location / {}” 高(注:前提是我们的目的仅仅只想对“GET / ”起作用)。
    7    
隐式禁止继续搜索正则location : On exact match with literal location without "=" or "^~" prefixes search is also immediately terminated.
前面我们说了,普通location 匹配完后,还会继续匹配正则location ;但是nginx 允许你阻止这种行为,方法很简单,只需要在普通location 前加“^~ ”或“= ”。但其实还有一种“隐含”的方式来阻止正则location 的搜索,这种隐含的方式就是:当“最大前缀”匹配恰好就是一个“严格精确(exact match )”匹配,照样会停止后面的搜索。原文字面意思是:只要遇到“精确匹配exact match ”,即使普通location 没有带“= ”或“^~ ”前缀,也一样会终止后面的匹配。
先举例解释下,后面例题会用实践告诉大家。假设当前配置是:location /exact/match/test.html { 配置指令块1} ,location /prefix/ { 配置指令块2} 和 location ~ \.html$ { 配置指令块3} ,如果我们请求 GET /prefix/index.html ,则会被匹配到指令块3 ,因为普通location /prefix/ 依据最大匹配原则能匹配当前请求,但是会被后面的正则location 覆盖;当请求GET /exact/match/test.html ,会匹配到指令块1 ,因为这个是普通location 的exact match ,会禁止继续搜索正则location 。
     小结:To summarize, the order in which directives are checked is as follows:
1 Directives with the "=" prefix that match the query exactly. If found, searching stops.
2 All remaining directives with conventional strings. If this match used the "^~" prefix, searching stops.
3 Regular expressions, in the order they are defined in the configuration file.
4 If #3 yielded a match, that result is used. Otherwise, the match from #2 is used.
“正则 location ”让步 “普通 location ”的严格精确匹配结果;但覆盖 “普通 location ”的最大前缀匹配结果。
“普通 location ”与“正则 location ”的匹配规则:先匹配普通 location ,再匹配正则 location ,
但是如果普通 location 的匹配结果恰好是“严格精确( exact match )”的,则 nginx 不再尝试后面的正则 location ;
如果普通 location 的匹配结果是“最大前缀”,则正则 location 的匹配覆盖普通 location 的匹配。
也就是前面说的“正则 location 让步普通 location 的严格精确匹配结果,但覆盖普通 location 的最大前缀匹配结果”
     8 
“@ ”是用来定义“Named Location ”的(你可以理解为独立于“普通location (location using literal strings )”和“正则location (location using regular expressions )”之外的第三种类型),
这种“Named Location ”不是用来处理普通的HTTP 请求的,它是专门用来处理“内部重定向(internally redirected )”请求的。注意:这里说的“内部重定向(internally redirected )”或许说成“forward ”会好点,以为内internally redirected 是不需要跟浏览器交互的,纯粹是服务端的一个转发行为。

转载地址:http://vylbi.baihongyu.com/

你可能感兴趣的文章
PHP那点小事--三元运算符
查看>>
解决国内NPM安装依赖速度慢问题
查看>>
Brackets安装及常用插件安装
查看>>
在CentOS 7系统上搭建LNMP 环境
查看>>
Centos 7(Linux)环境下安装PHP(编译添加)相应动态扩展模块so(以openssl.so为例)
查看>>
fastcgi_param 详解
查看>>
Nginx配置文件(nginx.conf)配置详解
查看>>
标记一下
查看>>
一个ahk小函数, 实现版本号的比较
查看>>
IP报文格式学习笔记
查看>>
autohotkey快捷键显示隐藏文件和文件扩展名
查看>>
Linux中的进程
查看>>
学习python(1)——环境与常识
查看>>
学习设计模式(3)——单例模式和类的成员函数中的静态变量的作用域
查看>>
深度学习库安装与使用
查看>>
keras句子分类 keras_demo_for_sentence_classification (simplified version)
查看>>
MySQL for Windows 解压缩版配置安装
查看>>
MySQL必知必会(读书笔记)
查看>>
MySQL必知必会(读书笔记二)
查看>>
Pyhton、Numpy、Pandas排序小结
查看>>