当前位置: 首页 > Web前端 > HTML

一个足够简单的NginxLocation配置讲解

时间:2023-03-28 17:20:25 HTML

前言Location是Nginx中非常核心的一个配置。本文重点讲解Location配置问题和一些注意事项。语法RespectedLocation,这里有一个简单的配置例子:http{server{listen80;server_namewww.yayujs.com;位置/{root/home/www/ts/;索引index.html;}}}大致意思是,当你访问www.yayujs.com的80端口时,返回/home/www/ts/index.html文件。我们来看看Location的具体语法:location[=|~|?*|^~]uri{...}关注[=|~|?*|^~]在方括号中,其中的内容用|分隔你可能用到的语法,其中=表示完全匹配,例如:location=/test{return200"hello";}#/testok#/test/notok#/test2notok#/test/2notok~表示区分大小写的正则匹配,例如:location~^/test${[configuration]}#/testok#/Testnotok#/test/notok#/test2notok~*表示不区分大小写的正则匹配location~*^/test${[configuration]}#/testok#/Testok#/test/notok#/test2notok^~表示uri以某个字符串开头location^~/images/{[configuration]}#/images/1.gifok当你不使用这些语法时,当你只写uri:/表示通用匹配:location/{[configuration]}#/index.htmloklocation/test{[configuration]}#/testok#/test2ok#/test/ok匹配顺序当存在多个location时,它们的匹配顺序参考Nginx官方文档:location可以通过前缀字符串定义,也可以通过正则表达式定义。正则表达式使用前面的“~*”修饰符(用于不区分大小写的匹配)或“~”修饰符(用于区分大小写匹配)。为了找到与给定请求匹配的位置,nginx首先检查使用前缀字符串(前缀位置)定义的位置。其中,选择并记住匹配前缀最长的位置。然后检查正则表达式,按照它们在配置文件中出现的顺序。正则表达式的搜索在第一次匹配时终止,并使用相应的配置。如果没有找到与正则表达式的匹配项,则使用之前记住的前缀位置的配置。如果最长匹配的前缀位置具有“^~”修饰符,则不检查正则表达式。此外,使用“=”修饰符它可以定义URI和位置的精确匹配。如果找到完全匹配,则搜索终止。例如,如果频繁出现“/”请求,则定义“location=/”将加快这些请求的处理速度,因为搜索会在第一次出现后立即终止比较。这样的位置显然不能包含嵌套位置。翻译后location的定义分为两种:前缀字符串(prefixstring)和正则表达式(regularexpression),具体是在前面加上~*和~修饰符匹配location的顺序是:使用prefixstring检查location,从locations中选出最长匹配的使用前缀字符串,并存储结果如果匹配到带=修饰符的URI,则立即停止匹配如果匹配到带^~修饰符的URI,则立即停止匹配,然后检查按照定义文件的顺序执行正则表达式,匹配不到正则表达式就停止。当正则表达式不匹配时,使用之前存储的前缀字符串总结如下:在顺序方面,前缀字符串的顺序并不重要,根据匹配的长度来确定,而正则表达式是按照定义的顺序。从优先级上来说,=修饰符最高,其次是^~,然后是正则,最后是前缀字符串匹配。我们来看几个简单的例子:server{location/doc{[configurationA]}location/docu{[configurationB]}}#request/document使用configurationB#虽然/doc也可以匹配,但是为了顺序,前缀字符串顺序不重要,服务器根据匹配长度确定{location~^/doc{[configurationA]}location~^/docu{[configurationB]}}#request/documentuseconfigurationA#虽然~^/docu它也可以匹配,但是正则表达式定义在order中docu也可以匹配,但是^~优先级更高,但常规优先级更高。root和alias的区别当我们这样设置root时:location/i/{root/data/w3;}当请求/i/top.gif时,会返回/data/w3/i/top.gif。当我们这样设置别名时:location/i/{alias/data/w3/images/;}当请求/i/top.gif时,会返回/data/w3/images/top.gif。乍一看,两者非常相似,但如果仔细观察,就会发现两者之间的区别。root是直接用root+location拼接的,alias是用alias代替location,所以root中最后一个路径有/i/,而alias中最后一个路径没有/i/。因此,如果您使用别名来定义这样的路径:location/images/{alias/data/w3/images/;}实际上,使用root会更好:location/images/{root/data/w3;}serverandrootserverinlocationroot和location都可以使用,例如:http{server{listen80;server_namewww.yayujs.com;根/home/www/网站/;位置/{root/home/www/ts/;指数指数。网页;}}}如果两者都出现,优先级是多少?简单来说,就是就近原则。如果位置匹配,则使用位置中的根配置,并忽略服务器中的根。当位置不匹配时,将使用服务器中的根配置。系列文章博客搭建系列是我目前为止唯一写的实用系列教程,讲解如何使用VuePress搭建博客并部署到GitHub、Gitee、个人服务器等平台。一会带你用VuePress+GitHubPages搭建博客一会教你如何在GitHub和Gitee之间同步代码还是不知道如何使用GitHubActions?看看这个Gitee是如何自动部署Pages的?仍然使用GitHubActions!一个前端足够的Linux命令微信:“mqyqingfeng”,加我到SaeYu的唯一读者群。如有错误或不准确的地方,请务必指正,万分感谢。如果你喜欢或者有启发,欢迎star,这也是对作者的鼓励。