Nginx高级应用之Location Url 配置

为了探究nginx的url配置规则,当然需要安装nginx。我使用了vagrant创建了一个虚拟环境的Ubuntu,通过apt-get安装nginx。这样就不会污染mac的软件环境。通过vragrant再创建一个项目进行实验。

/vagrant目录下创建了一个pro用于项目的根目录,同时配置nginx的配置文件(/etc/nginx/sites-enabled/pro.conf)

  pro  tree . ├── 403.html ├── 404.html ├── index.html0  directories, 3 files

pro.conf的配置如下,即监听本机的80端口。

server {    listen 80 default_server;    server_name localhost;    access_log /var/log/nginx/pro/access.log;    error_log /var/log/nginx/pro/error.log;    error_page 404 /404.html;    root /vagrant/pro;    index index.html index.htm; }

上述的配置并没有设置location,但是配置了root /vagrant/pro,访问将会返回/vagrant/pro/index.html。

匹配模式 匹配语法

nginx的url匹配模式很强大,同时使用非常灵活,尤其是优先级的匹配,如果不寻找规律,不但很难掌握,而且容易犯晕。了解优先级之前,先看看匹配的配置语法,以及都有那些匹配模式。

匹配的语法还是很简单的:

location [ = | ~ | ~* | ^~ ] uri { ... }location @name { ... }

没错,就这么多,实际写在loacation中大概是这样的

location = / { } location  [指令模式] url匹配模式 { }

指令模式指用于匹配的方式,即精确匹配,前缀匹配还是正则匹配,当然这个是可选的,如果不写,则退化成正常匹配或者全匹配。url匹配模式则需要匹配的url,可以看成是web开发中的路由。下面就分别介绍指令模式和匹配模式。

精确匹配

=指令用于精确字符匹配(模式),不能使用正则,区分大小写。为了直观的观察匹配命中的location,使用rewrite指令,用于转发。目前只要理解命中了就重定向到rewrite后面的url即可。

location = /demo {        rewrite ^ ; }

上述的配置表示只有访问  这样的url,才能跳转到google的页面。除此之外的任何地址都无法访问,那怕是访问这个地址也��行。因为url匹配模式是/demo。

修改 location:

location = /demo$ {        rewrite ^ ; }

熟悉正则的同学初看会以为/demo$表示demo结尾的url,其实不然,这里的$符号也是url的一部分,只有访问$这个地址才能跳转。

前缀匹配

^~指令用于字符前缀匹配,和=精确匹配一样,也是用于字符确定的匹配,不能使用正则且区分大小写。和=不同的在于,^~指令下,访问的url无需url匹配模式一模一样,只需要其开头前缀和url匹配模式一样即可。

location ^~ /demo {        rewrite ^ ; }

对于该模式(/demo),访问下列的地址都能匹配:

只需要以/demo为前缀开头的url都能匹配。与该模式后的是否大小写无关。

^~不支持正则。模式/demo$中的$并不代表字符模式结束,而是一个是实实在在的$,只有访问/demo$开头的url才能匹配,则不再匹配。

模式/[0-9]emo也不代表正则中的、之类,只有访问以 /[0-9]emo开头url才行,例如[0-9]emo或[0-9]emo/aaa

前缀匹配通常用于匹配文件夹,如配置静态文件。

正则匹配

众所周知,nginx的url功能强大,配置灵活。字符匹配中,支持正则和不支持正则完全是两个境界。前面的两种方式都不能使用正则,未免让人觉得nginx有点虚夸。

实际上,nginx支持正则匹配。所使用的指令是~和~*,前者表示使用正则,区分大小写,后者表示使用正则,不区分大小写。与前缀匹配一样,正则匹配也是只需匹配以url模式开头的即可。

location ~ /[0-9]emo {        rewrite ^ ; }

对于上述的模式,可以匹配的url如下:

只要是以正则表达式/[0-9]emo匹配的字符开头的url,都能匹配。

使用~*则不区分大小写

location ~ /[0-9]EmO {        rewrite ^ ; }

下面的都能匹配

正常匹配

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/e07b747da3ba7a1f266f26cd5ab63e34.html