nginx配置详解location_nginxlocation

后端 (6) 2024-04-08 16:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说nginx配置详解location_nginxlocation,希望能够帮助你!!!。
Nginx配置location详解

转自:

https://blog.csdn.net/u012260238/article/details/102498474?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1-102498474-blog-119041463.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1-102498474-blog-119041463.pc_relevant_default&utm_relevant_index=1

location正则写法

location使用语法:

location [ = | ~ | ~* | ^~ ] uri { }

nginx配置详解location_nginxlocation_https://bianchenghao6.com/blog_后端_第1张一个示例:



 

顺序 no优先级:(location =) > (location 完整路径) > (location ^~ 路径) > (location , 正则顺序) > (location 部分起始路径) > (/)*

上面的匹配结果按照上面的location写法,以下的匹配示例成立:


nginx配置详解location_nginxlocation_https://bianchenghao6.com/blog_后端_第2张

实际使用建议

所以实际使用中,个人觉得至少有三个匹配规则定义,如下:

直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。

这里是直接转发给后端应用服务器了,也可以是一个静态首页

  • 第一个必选规则

 

  • 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项

有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用


  • 第三个规则就是通用规则,用来转发动态请求到后端应用服务器

#非静态文件请求就默认是动态请求,自己根据实际把握

#毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了


Rewrite规则:

Nginx的rewrite的主要功能是实现URL地址重写。Nginx的rewrite规则需要PCRE软件的支持,即通过Perl兼容正则表达式语法进行规则匹配。

Nginx rewrite语法:

rewrite regex replacement [flag];
#应用位置:server、location、if

rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用,例如http://seanlook.com/a/we/index.php?id=1&u=str只对/a/we/index.php重写。语法rewrite regex replacement [flag];

如果相对域名或参数字符串起作用,可以使用全局变量匹配,也可以使用proxy_pass反向代理。

表明看rewrite和location功能有点像,都能实现跳转,主要区别在于rewrite是在同一域名内更改资源的路径,而location是对一类路径做控制访问或反向代理,可以proxy_pass到其他机器。很多情况下rewrite也会写在location里,它们的执行顺序是:


 

如果其中某步URI被重写,则重新循环执行1-3,直到找到真实存在的文件;循环超过10次,则返回500 Internal Server Error错误。

flag 标志位:


nginx配置详解location_nginxlocation_https://bianchenghao6.com/blog_后端_第3张
因为301和302不能简单的只返回状态码,还必须有重定向的URL,这就是return指令无法返回301,302的原因了。这里 last 和 break 区别有点难以理解:


 

Nginx的rewrite功能在企业里应用非常广泛:


 

if 指令与全局变量:

语法为if(condition){…},对给定的条件condition进行判断。如果为真,大括号内的rewrite指令将被执行,if条件(conditon)可以是如下任何内容:


 

-f和!-f用来判断是否存在文件

-d和!-d用来判断是否存在目录

-e和!-e用来判断是否存在文件或目录

-x和!-x用来判断文件是否可执行

例如:


nginx配置详解location_nginxlocation_https://bianchenghao6.com/blog_后端_第2张

 

全局变量:

下面是可以用作if判断的全局变量:


nginx配置详解location_nginxlocation_https://bianchenghao6.com/blog_后端_第2张

nginx配置详解location_nginxlocation_https://bianchenghao6.com/blog_后端_第2张

常用正则:


nginx配置详解location_nginxlocation_https://bianchenghao6.com/blog_后端_第2张

 

小括号()之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容。正则里面容易让人困惑的是转义特殊字符。

rewrite实例

例1:
···
http {


nginx配置详解location_nginxlocation_https://bianchenghao6.com/blog_后端_第2张

 

···
对形如/images/ef/uh7b3/test.png的请求,重写到/data?file=test.png,于是匹配到location /data,先看/data/images/test.png文件存不存在,如果存在则正常响应,如果不存在则重写tryfiles到新的image404 location,直接返回404状态码。

例2:


 

对形如/images/bla_500x400.jpg的文件请求,重写到/resizer/bla.jpg?width=500&height=400地址,并会继续尝试匹配location。

Nginx访问认证

有时需要为我们的网站设置访问账号和密码权限。
nginx配置详解location_nginxlocation_https://bianchenghao6.com/blog_后端_第9张


 

这两个参数需要说明:

auth_basic


 

auth_basic_user_file


file文件内容如下:


今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。