NGINX Localtion配置

小TOT 创建于 2017-02-07

nginx的location指令。

location需要配置在server上下文中,是虚拟主机中用于根据请求路由响应的一个配置。nginx使用location指令将不同uri路由到不同的配置,以完成响应。当nginx获取到请求的时候,会检查server下面的location配置,找出最匹配的设置对请求进行处理。location可以使用,常规字符串配置,也可以使用正则表达式进行配置。下面是location的语法规则

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

其中

= 开头表示精确匹配

^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可

~ 开头表示区分大小写的正则匹配

!~ 区分大小写不匹配

!~* 不区分大小写不匹配

~* 开头表示不区分大小写的正则匹配

/ 通用匹配,任何请求都会匹配到

匹配的最终结果以uri最长的为准,例如两个location配置,a:/image/static 与b:/image/在匹配/image/static/1.png时以a为准而不会以b为准。 在同等条件下,首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。

location uri匹配实例

学校location指令最好的方式是多看配置,这样才能更好的理解规则。下面列举了一些常见的location配置实例供大家参考。

location = / {
# 只匹配 / 查询。
[ configuration A ]
}

location / {
# 匹配任何查询,因为所有请求都已 / 开头。但是正则表达式规则和长的块规则将被优先和查询匹配。
[ configuration B ]
}

location ^~ /images/ {
# 匹配任何已 /images/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。
[ configuration C ]
}

location ~* \.(gif|jpg|jpeg)$ {
# 匹配任何已 gifjpgjpeg 结尾的请求。然而所有 /images/ 目录的请求将使用 Configuration C。
[ configuration D ]
}

更加详细的location讲解可以参考这篇文章.

location配置

location配置完成,我们可以将请求路由到{...}中的配置,我们可以在{}对请求进行个性化的处理。下面介绍对请求的处理配置。 当location指令将请求路由到{...}下面的配置时,nginx会根据{...}下面的配置对请求进行处理。常见的配置由重定向(使用rewrite指令),代理(使用proxy_pass指令),定义该请求下的root目录(使用root指令),日志文件(使用)等等。

1.对请求进行重定向(Rewrite)

常见的调节判定需要

Nginx Rewrite 规则相关指令有if,rewrite,set,return,break等,其中最关键的就是rewrite。一个简单的Nginx Rewrite规则语法如下:

rewrite ^/b/(.\*)\.html /play.php?video=$1 break; 

正则表达式匹配,其中:

~ 为区分大小写匹配; ~* 为不区分大小写匹配; !~!~*分别为区分大小写不匹配及不区分大小写不匹配。

文件及目录匹配,其中:

-f和!-f用来判断是否存在文件; -d和!-d用来判断是否存在目录; -e和!-e用来判断是否存在文件或目录; -x和!-x用来判断文件是否可执行。

flag标记有

last 相当于Apache里的[L]标记,表示完成rewrite; break 终止匹配, 不再匹配后面的规则; redirect 返回302临时重定向 地址栏会显示跳转后的地址; permanent 返回301永久重定向 地址栏会显示跳转后的地址。 当然除了这些以外,Rewrite规则中还会用到一些相应的全局变量,如$args,$url等等

下面是一些重定向的案例

 location / {
    rewrite ^/$ /web permanent;
    rewrite ^/web$ /page/login.html permanent;
    rewrite ^/admin$ /admin/login.html permanent; #永久重定
    if (!-f $request_filename) { # 如果找不到请求文件
        rewrite ^.*$ /app_dev.php last;
    }
}

  location /seed {
   rewrite (.*) http://seedforweb.cn;##将/seed开头的请求重定向到seedforweb.cn
 }

 location /baidu {
    rewrite (.*) http://www.baidu.com;
}

1.对请求进行代理(proxy_pass)

所谓的代理顾名思义就是代理其他服务器处理请求,或代理用户访问。nginx代理一般分为正向代理、反向代理。

正向代理是指,代理请求者访问其他服务,核心思想是根据请求地址的不同将请求发送到不同服务器,对于被访问的服务器而言访问者即为nginx,正向代理典型应用即代理访问。比如下面的场景,a不能访问c,但是b能。并且a能够访问b。这样的话为了实现a访问c,我们只让b代理a的访问即可。

反向代理(Reverse Proxy)是指代理服务器来接收来自Internet上的连接请求,并将请求转发给内部网络上的服务器,并从服务器上得到的结果返回给Internet上请求连接的客户端。对于客服端而言,并不清楚真实的服务者是内部网络的某台主机。

实际上nginx的正向代理,反向代理并没有真正意义的区别,都是使用nginx代理请求,只是具体的体现形式不同罢了。

下面是是代理的典型示例:

反向代理

## Basic reverse proxy(反向代理) server ##
    upstream apachephp  {
        server ip:8080; #Apache
    }
    ## Start www.nowamagic.net ##
    server {
        listen 80;
        server_name  www.nowamagic.net;
        access_log  logs/quancha.access.log  main;
        error_log  logs/quancha.error.log;
        root   html;
        index  index.html index.htm index.php;

        ## send request back to apache ##
        location / {
            proxy_pass  http://apachephp;
                #……………………
}
}

正向代理

server
{
  listen       8080;
  server_name www.hubwiz.com;
  index index.html index.htm index.php;
  root  /home/wwwroot;
     location / {
         resolver        192.168.8.88;
         proxy_pass      $scheme://$http_host$request_uri;
         proxy_buffers   256 4k;
 }
   access_log off;
}

以上配置的注意事项:

1,不能有hostname。

2,必须有resolver, 即dns,即上面的x.x.x.x,换成当前机器的DNS服务器ip即可(查看dns方法 cat /etc/resolv.conf 代理使用)。

3,$http_host和$request_uri是nginx系统变量,保持原样即可。