精华内容
下载资源
问答
  • nginx 正则匹配配置

    2020-12-20 08:40:28
    location = / {# 精确匹配 / ,主机名后面不能带任何字符串[ configuration A ]}location / {#因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求#但是正则最长字符串会优先匹配[ configuration B ]}...

    location = / {

    # 精确匹配 / ,主机名后面不能带任何字符串

    [ configuration A ]

    }

    location / {

    #因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求

    #但是正则和最长字符串会优先匹配

    [ configuration B ]

    }

    location /documents/ {

    #匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索

    #只有后面的正则表达式没有匹配到时,这一条才会采用这一条

    [ configuration C ]

    }

    location ~ /documents/Abc {

    #匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索

    #只有后面的正则表达式没有匹配到时,这一条才会采用这一条

    [ configuration CC ]

    }

    location ^~ /images/ {

    #匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。

    [ configuration D ]

    }

    location ~* \.(gif|jpg|jpeg)$ {

    #匹配所有以 gif,jpg或jpeg 结尾的请求

    #然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则

    [ configuration E ]

    }

    location /images/ {

    #字符匹配到 /images/,继续往下,会发现 ^~ 存在

    [ configuration F ]

    }

    location /images/abc {

    #最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在

    #F与G的放置顺序是没有关系的

    [ configuration G ]

    }

    location ~ /images/abc/ {

    #只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用

    [ configuration H ]

    }

    location ~* /js/.*/\.js

    已=开头表示精确匹配

    如 A 中只匹配根目录结尾的请求,后面不能带任何字符串。

    ^~ 开头表示uri以某个常规字符串开头,不是正则匹配

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

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

    / 通用匹配, 如果没有其它匹配,任何请求都会匹配到

    顺序 no优先级:

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

    上面的匹配结果

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

    / -> config A

    精确完全匹配,即使/index.html也匹配不了

    /downloads/download.html -> config B

    匹配B以后,往下没有任何匹配,采用B

    /images/1.gif -> configuration D

    匹配到F,往下匹配到D,停止往下

    /images/abc/def -> config D

    最长匹配到G,往下匹配D,停止往下

    你可以看到 任何以/images/开头的都会匹配到D并停止,FG写在这里是没有任何意义的,H是永远轮不到的,这里只是为了说明匹配顺序

    /documents/document.html -> config C

    匹配到C,往下没有任何匹配,采用C

    /documents/1.jpg -> configuration E

    匹配到C,往下正则匹配到E

    /documents/Abc.jpg -> config CC

    最长匹配到C,往下正则顺序匹配到CC,不会往下到E

    实际使用建议

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

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

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

    # 第一个必选规则

    location = / {

    proxy_pass http://tomcat:8080/index

    }

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

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

    location ^~ /static/ {

    root /webroot/static/;

    }

    location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {

    root /webroot/res/;

    }

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

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

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

    location / {

    proxy_pass http://tomcat:8080/

    }

    Rewrite规则

    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里,它们的执行顺序是:

    执行server块的rewrite指令

    执行location匹配

    执行选定的location中的rewrite指令

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

    flag标志位

    last : 相当于Apache的[L]标记,表示完成rewrite

    break : 停止执行当前虚拟主机的后续rewrite指令集

    redirect : 返回302临时重定向,地址栏会显示跳转后的地址

    permanent : 返回301永久重定向,地址栏会显示跳转后的地址

    因为301和302不能简单的只返回状态码,还必须有重定向的URL,这就是return指令无法返回301,302的原因了。这里 last 和 break 区别有点难以理解:

    last一般写在server和if中,而break一般使用在location中

    last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配

    break和last都能组织继续执行后面的rewrite指令

    if指令与全局变量

    if判断指令

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

    当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false

    直接比较变量和内容时,使用=或!=

    ~正则表达式匹配,~*不区分大小写的匹配,!~区分大小写的不匹配

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

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

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

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

    例如:

    if ($http_user_agent ~ MSIE) {

    rewrite ^(.*)$ /msie/$1 break;

    } //如果UA包含"MSIE",rewrite请求到/msid/目录下

    if ($http_cookie ~* "id=([^;]+)(?:;|$)") {

    set $id $1;

    } //如果cookie匹配正则,设置变量$id等于正则引用部分

    if ($request_method = POST) {

    return 405;

    } //如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302

    if ($slow) {

    limit_rate 10k;

    } //限速,$slow可以通过 set 指令设置

    if (!-f $request_filename){

    break;

    proxy_pass http://127.0.0.1;

    } //如果请求的文件名不存在,则反向代理到localhost 。这里的break也是停止rewrite检查

    if ($args ~ post=140){

    rewrite ^ http://example.com/ permanent;

    } //如果query string中包含"post=140",永久重定向到example.com

    location ~* \.(gif|jpg|png|swf|flv)$ {

    valid_referers none blocked www.jefflei.com www.leizhenfang.com;

    if ($invalid_referer) {

    return 404;

    } //防盗链

    }

    rewrite实例

    例1:

    http {

    # 定义image日志格式

    log_format imagelog '[$time_local] ' $image_file ' ' $image_type ' ' $body_bytes_sent ' ' $status;

    # 开启重写日志

    rewrite_log on;

    server {

    root /home/www;

    location / {

    # 重写规则信息

    error_log logs/rewrite.log notice;

    # 注意这里要用‘’单引号引起来,避免{}

    rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4;

    # 注意不能在上面这条规则后面加上“last”参数,否则下面的set指令不会执行

    set $image_file $3;

    set $image_type $4;

    }

    location /data {

    # 指定针对图片的日志格式,来分析图片类型和大小

    access_log logs/images.log mian;

    root /data/images;

    # 应用前面定义的变量。判断首先文件在不在,不在再判断目录在不在,如果还不在就跳转到最后一个url里

    try_files /$arg_file /image404.html;

    }

    location = /image404.html {

    # 图片不存在返回特定的信息

    return 404 "image not found\n";

    }

    }

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

    例2:

    rewrite^/images/(.*)_(\d+)x(\d+)\.(png|jpg|gif)$ /resizer/$1.$4?width=$2&height=$3? last;

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

    这个location

    location ~ ^/(.+)\.3gp\.zip$ {

    #            access_by_lua_file  "/opt/pro/nginx/lua/zip_access.lua";

    rewrite_by_lua_file "/opt/pro/nginx/lua/zip_access.lua";

    }

    匹配 http://192.168.75.80:8092/20160614/mobi/vod/ts01/TVM/video/3gp/TVM/HuNanHD/2016/04/27/80a4b71a-c000-46fa-916b-70d9e2445635/Q350/Q350.3gp.zip?&end=5

    \.代表.    其中\是转义字符。    单独的.代表 匹配除换行符以外的任意字符   +匹配重复1次或更多次

    展开全文
  • nginx中location配置匹配详解1、location语法规则Location 基础知识1.location 是在 server 块中配置。2.可以根据不同的 URI 使用不同的配置(location 中配置),来处理不同的请求。3.location 是有顺序的,会被第...

    nginx中location配置及匹配详解

    1、location语法规则

    Location 基础知识

    1.location 是在 server 块中配置。

    2.可以根据不同的 URI 使用不同的配置(location 中配置),来处理不同的请求。

    3.location 是有顺序的,会被第一个匹配的location 处理。语法规则:     1. location [ = | ~ | ~*   | ^~ ] uri { ... }

    2. location @name { ... }

    location = /uri=开头表示精确匹配,只有完全匹配上才能生效

    location ^~ /uri^~ 开头对URL路径进行前缀匹配,并且在正则之前

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

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

    location !~ 正则表达式!~区分大小写不匹配的正则

    location !~*正则表达式!~*不区分大小写不匹配的正则

    location /uri不带任何修饰符,也表示前缀匹配,但是在正则匹配之后

    location /uri通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default

    location @名称nginx内部跳转

    2、location匹配顺序

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

    1.首先匹配=

    2.其次匹配^~

    3.再其次按照配置文件的顺序进行正则匹配

    4.最后是交给/进行通用匹配

    提示:当有匹配成功时,立刻停止匹配,按照当前匹配规则处理请求

    特别注意:

    1、字符串匹配优先搜索,但是只是记录下最长的匹配 ( 如果 ^~ 是最长的匹配,则会直接命中,停止搜索正则 ),然后继续搜索正则匹配,如果有正则匹配,则命中正则匹配,如果没有正则匹配,则命中最长的字符串匹配.,需要注意的是正则表达式按照配置文件里的顺序测试。找到第一个匹配的正则表达式将停止搜索。

    2、一般情况下,匹配成功了普通字符串location后还会进行正则表达式location匹配。有两种方法改变这种行为,其一就是使用“=”前缀,这时执行的是严格匹配,并且匹配成功后立即停止其他匹配,同时处理这个请求;另外一种就是使用“^~”前缀,如果把这个前缀用于一个常规字符串那么告诉nginx 如果路径匹配那么不测试正则表达式。

    location匹配的nginx变量是 $request_uri

    3、location实例说明

    (1)”=” 精确匹配

    location = / {

    #规则

    }

    #则匹配到`http://www.example.com/`这种请求。

    (2)”~” 大小写敏感

    location ~ /Example/ {

    #规则

    }

    #请求示例

    #http://www.example.com/Example/  [成功]

    #http://www.example.com/example/  [失败]

    (3)”~*” 大小写忽略

    location ~* /Example/ {

    #规则

    }

    #则会忽略uri部分的大小写

    #http://www.example.com/Example/  [成功]

    #http://www.example.com/example/  [成功]

    (4)”^~” 只匹配以 uri 开头

    location ^~ /img/ {

    #规则

    }

    #以/img/开头的请求,都会匹配上

    #http://www.example.com/img/a.jpg   [成功]

    #http://www.example.com/img/b.mp4 [成功]

    (5)”@” nginx内部跳转

    location /img/ {

    error_page 404 @img_err;

    }

    location @img_err {

    #规则

    }

    #以/img/开头的请求,如果链接的状态为404。则会匹配到@img_err这条规则上。

    展开全文
  • Nginx 正则匹配配置

    2020-12-20 08:40:26
    location表达式类型~ 表示执行一个正则匹配,区分大小写~* 表示执行一个正则匹配,不...@ 它定义一个命名的 location,使用在内部定向时,例如 error_page, try_fileslocation优先级说明在nginx的location和配置中l...

    location表达式类型~ 表示执行一个正则匹配,区分大小写

    ~* 表示执行一个正则匹配,不区分大小写

    ^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他location。

    = 进行普通字符精确匹配。也就是完全匹配。

    @ 它定义一个命名的 location,使用在内部定向时,例如 error_page, try_files

    location优先级说明

    在nginx的location和配置中location的顺序没有太大关系。正location表达式的类型有关。相同类型的表达式,字符串长的会优先匹配。

    以下是按优先级排列说明:等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项。

    ^~类型表达式。一旦匹配成功,则不再查找其他匹配项。

    正则表达式类型(~ ~*)的优先级次之。如果有多个location的正则能匹配的话,则使用正则表达式最长的那个。

    常规字符串匹配类型。按前缀匹配。

    location优先级示例

    配置项如下:location = / {

    # 仅仅匹配请求 /

    [ configuration A ]

    }

    location / {

    # 匹配所有以 / 开头的请求。

    # 但是如果有更长的同类型的表达式,则选择更长的表达式。

    # 如果有正则表达式可以匹配,则优先匹配正则表达式。

    [ configuration B ]

    }

    location /documents/ {

    # 匹配所有以 /documents/ 开头的请求。

    # 但是如果有更长的同类型的表达式,则选择更长的表达式。

    # 如果有正则表达式可以匹配,则优先匹配正则表达式。

    [ configuration C ]

    }

    location ^~ /p_w_picpaths/ {

    # 匹配所有以 /p_w_picpaths/ 开头的表达式,如果匹配成功,则停止匹配查找。

    # 所以,即便有符合的正则表达式location,也不会被使用

    [ configuration D ]

    }

    location ~* \.(gif|jpg|jpeg)$ {

    # 匹配所有以 gif jpg jpeg结尾的请求。

    # 但是 以 /p_w_picpaths/开头的请求,将使用 Configuration D

    [ configuration E ]

    }

    请求匹配示例/ -> configuration A

    /index.html -> configuration B

    /documents/document.html -> configuration C

    /p_w_picpaths/1.gif -> configuration D

    /documents/1.jpg -> configuration E

    注意,以上的匹配和在配置文件中定义的顺序无关。

    1. location正则写法

    一个示例:location  = / {

    # 精确匹配 / ,主机名后面不能带任何字符串

    [ configuration A ]

    }

    location  / {

    # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求

    # 但是正则和最长字符串会优先匹配

    [ configuration B ]

    }

    location /documents/ {

    # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索

    # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条

    [ configuration C ]

    }

    location ~ /documents/Abc {

    # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索

    # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条

    [ configuration CC ]

    }

    location ^~ /p_w_picpaths/ {

    # 匹配任何以 /p_w_picpaths/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。

    [ configuration D ]

    }

    location ~* \.(gif|jpg|jpeg)$ {

    # 匹配所有以 gif,jpg或jpeg 结尾的请求

    # 然而,所有请求 /p_w_picpaths/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则

    [ configuration E ]

    }

    location /p_w_picpaths/ {

    # 字符匹配到 /p_w_picpaths/,继续往下,会发现 ^~ 存在

    [ configuration F ]

    }

    location /p_w_picpaths/abc {

    # 最长字符匹配到 /p_w_picpaths/abc,继续往下,会发现 ^~ 存在

    # F与G的放置顺序是没有关系的

    [ configuration G ]

    }

    location ~ /p_w_picpaths/abc/ {

    # 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用

    [ configuration H ]

    }

    location ~* /js/.*/\.js已=开头表示精确匹配

    如 A 中只匹配根目录结尾的请求,后面不能带任何字符串。

    ^~ 开头表示uri以某个常规字符串开头,不是正则匹配

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

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

    / 通用匹配, 如果没有其它匹配,任何请求都会匹配到

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

    上面的匹配结果。按照上面的location写法,以下的匹配示例成立:/ -> config A

    精确完全匹配,即使/index.html也匹配不了

    /downloads/download.html -> config B

    匹配B以后,往下没有任何匹配,采用B

    /p_w_picpaths/1.gif -> configuration D

    匹配到F,往下匹配到D,停止往下

    /p_w_picpaths/abc/def -> config D

    最长匹配到G,往下匹配D,停止往下

    你可以看到 任何以/p_w_picpaths/开头的都会匹配到D并停止,FG写在这里是没有任何意义的,H是永远轮不到的,这里只是为了说明匹配顺序

    /documents/document.html -> config C

    匹配到C,往下没有任何匹配,采用C

    /documents/1.jpg -> configuration E

    匹配到C,往下正则匹配到E

    /documents/Abc.jpg -> config CC

    最长匹配到C,往下正则顺序匹配到CC,不会往下到E

    实际使用建议

    所以实际使用中,个人觉得至少有三个匹配规则定义,如下:#直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。

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

    # 第一个必选规则

    location = / {

    proxy_pass http://tomcat:8080/index

    }

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

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

    location ^~ /static/ {

    root /webroot/static/;

    }

    location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {

    root /webroot/res/;

    }

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

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

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

    location / {

    proxy_pass http://tomcat:8080/

    }

    参考:

    2. Rewrite规则

    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里,它们的执行顺序是:执行server块的rewrite指令

    执行location匹配

    执行选定的location中的rewrite指令

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

    2.1 flag标志位last : 相当于Apache的[L]标记,表示完成rewrite

    break : 停止执行当前虚拟主机的后续rewrite指令集

    redirect : 返回302临时重定向,地址栏会显示跳转后的地址

    permanent : 返回301永久重定向,地址栏会显示跳转后的地址

    因为301和302不能简单的只返回状态码,还必须有重定向的URL,这就是return指令无法返回301,302的原因了。这里 last 和 break 区别有点难以理解:last一般写在server和if中,而break一般使用在location中

    last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配

    break和last都能组织继续执行后面的rewrite指令

    2.2 if指令与全局变量

    if判断指令

    语法为if(condition){...},对给定的条件condition进行判断。如果为真,大括号内的rewrite指令将被执行,if条件(conditon)可以是如下任何内容:当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false

    直接比较变量和内容时,使用=或!=

    ~正则表达式匹配,~*不区分大小写的匹配,!~区分大小写的不匹配

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

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

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

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

    例如:if ($http_user_agent ~ MSIE) {

    rewrite ^(.*)$ /msie/$1 break;

    } //如果UA包含"MSIE",rewrite请求到/msid/目录下

    if ($http_cookie ~* "id=([^;]+)(?:;|$)") {

    set $id $1;

    } //如果cookie匹配正则,设置变量$id等于正则引用部分

    if ($request_method = POST) {

    return 405;

    } //如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302

    if ($slow) {

    limit_rate 10k;

    } //限速,$slow可以通过 set 指令设置

    if (!-f $request_filename){

    break;

    proxy_pass  http://127.0.0.1;

    } //如果请求的文件名不存在,则反向代理到localhost 。这里的break也是停止rewrite检查

    if ($args ~ post=140){

    rewrite ^ http://example.com/ permanent;

    } //如果query string中包含"post=140",永久重定向到example.com

    location ~* \.(gif|jpg|png|swf|flv)$ {

    valid_referers none blocked www.jefflei.com www.leizhenfang.com;

    if ($invalid_referer) {

    return 404;

    } //防盗链

    }

    全局变量

    下面是可以用作if判断的全局变量$args : #这个变量等于请求行中的参数,同$query_string

    $content_length : 请求头中的Content-length字段。

    $content_type : 请求头中的Content-Type字段。

    $document_root : 当前请求在root指令中指定的值。

    $host : 请求主机头字段,否则为服务器名称。

    $http_user_agent : 客户端agent信息

    $http_cookie : 客户端cookie信息

    $limit_rate : 这个变量可以限制连接速率。

    $request_method : 客户端请求的动作,通常为GET或POST。

    $remote_addr : 客户端的IP地址。

    $remote_port : 客户端的端口。

    $remote_user : 已经经过Auth Basic Module验证的用户名。

    $request_filename : 当前请求的文件路径,由root或alias指令与URI请求生成。

    $scheme : HTTP方法(如http,https)。

    $server_protocol : 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。

    $server_addr : 服务器地址,在完成一次系统调用后可以确定这个值。

    $server_name : 服务器名称。

    $server_port : 请求到达服务器的端口号。

    $request_uri : 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。

    $uri : 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。

    $document_uri : 与$uri相同。

    例:http://localhost:88/test1/test2/test.php$host:localhost

    $server_port:88

    $request_uri:http://localhost:88/test1/test2/test.php

    $document_uri:/test1/test2/test.php

    $document_root:/var/www/html

    $request_filename:/var/www/html/test1/test2/test.php

    2.3 常用正则. : 匹配除换行符以外的任意字符

    ? : 重复0次或1次

    + : 重复1次或更多次

    * : 重复0次或更多次

    \d :匹配数字

    ^ : 匹配字符串的开始

    $ : 匹配字符串的介绍

    {n} : 重复n次

    {n,} : 重复n次或更多次

    [c] : 匹配单个字符c

    [a-z] : 匹配a-z小写字母的任意一个

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

    2.4 rewrite实例

    例1:http {

    # 定义p_w_picpath日志格式

    log_format p_w_picpathlog '[$time_local] ' $p_w_picpath_file ' ' $p_w_picpath_type ' ' $body_bytes_sent ' ' $status;

    # 开启重写日志

    rewrite_log on;

    server {

    root /home/www;

    location / {

    # 重写规则信息

    error_log logs/rewrite.log notice;

    # 注意这里要用‘’单引号引起来,避免{}

    rewrite '^/p_w_picpaths/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4;

    # 注意不能在上面这条规则后面加上“last”参数,否则下面的set指令不会执行

    set $p_w_picpath_file $3;

    set $p_w_picpath_type $4;

    }

    location /data {

    # 指定针对图片的日志格式,来分析图片类型和大小

    access_log logs/p_w_picpaths.log mian;

    root /data/p_w_picpaths;

    # 应用前面定义的变量。判断首先文件在不在,不在再判断目录在不在,如果还不在就跳转到最后一个url里

    try_files /$arg_file /p_w_picpath404.html;

    }

    location = /p_w_picpath404.html {

    # 图片不存在返回特定的信息

    return 404 "p_w_picpath not found\n";

    }

    }

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

    例2:rewrite ^/p_w_picpaths/(.*)_(\d+)x(\d+)\.(png|jpg|gif)$ /resizer/$1.$4?width=$2&height=$3? last;

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

    展开全文
  • 文章目录Spring-cloud-gateway 路由配置方式及匹配规则1、路由配置⽅式1.1 基础路由配置⽅式1.2 基于代码的路由配置⽅式1.3 注册中⼼相结合的路由配置⽅式2、路由匹配规则2.1Predicate 断⾔条件2.1.1 通过请求参数...

    Spring-cloud-gateway 路由配置方式及匹配规则

    1、路由配置⽅式

    路由是⽹关配置的基本组成模块,和Zuul的路由配置模块类似。⼀个Route模块由⼀个 ID,⼀个⽬标 URI,⼀组断⾔和⼀组过滤器定义。如果断⾔为真,则路由匹配,⽬标URI会被访问。
    

    1.1 基础路由配置⽅式

    如果请求的⽬标地址,是单个的URI资源路径,配置⽂件实例如下:

    spring:
        application:
          name: api-gateway 
        cloud: 
          gateway: 
            routes: 
              - id: service1 
                uri: https://blog.csdn.net 
                predicates: 
                  - Path=/csdn
    

    各字段含义如下。

    • id:我们⾃定义的路由 ID,保持唯⼀

    • uri:⽬标服务地址

    • predicates:路由条件,Predicate 接受⼀个输⼊参数,返回⼀个布尔值结果。该接⼝包含多种默

      认⽅法来将 Predicate 组合成其他复杂的逻辑(⽐如:与,或,⾮)。

    上⾯这段配置的意思是,配置了⼀个 id 为 url-proxy-1的URI代理规则,路由的规则为,当访问地址

    http://localhost:8080/csdn/1.jsp时,会路由到上游地址https://blog.csdn.net/1.jsp。

    1.2 基于代码的路由配置⽅式

    转发功能同样可以通过代码来实现,我们可以在启动类 GateWayApplication 中添加⽅法 customRouteLocator() 来定制转发规则。

    @SpringBootApplication
    @EnableDiscoveryClient
    public class GatewayApplication {
        public static void main(String[] args) {
            SpringApplication.run(GatewayApplication.class, args);
        }
    
        @Bean
        public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
            return builder.routes().route("path_route", r -> r.path("/csdn").uri("https://blog.csdn.net")).build();
        }
    }
    

    1.3 和注册中⼼相结合的路由配置⽅式

    在uri的schema协议部分为⾃定义的lb:类型,表示从微服务注册中⼼(如Eureka)订阅服 务,并且通过负载均衡进⾏服务的路由。代码如下。

    server:
    	port: 9005
    spring:
        application:
          name: api-gateway 
        cloud: 
          gateway: 
            routes: 
              - id: service1 
                uri: https://blog.csdn.net 
                predicates: 
                  - Path=/csdn
              - id: service2
              # uri: http://127.0.0.1:9001 
              	uri: lb://cloud-payment-service 
              	predicates: 
              	- Path=/payment/**
    eureka: 
    	client: 
    		service-url: 
    			defaultZone: http://127.0.0.1:9004/eureka
    

    注册中⼼相结合的路由配置⽅式,与单个URI的路由配置,区别其实很⼩,仅仅在于URI的 schema协议不同。单个URI的地址的schema协议,⼀般为http或者https协议。启动多个⽀付微 服务,会发现端⼝9000,9001轮流出现。

    2、路由匹配规则

    Spring Cloud Gateway的主要功能之⼀是转发请求,转发规则的定义主要包含三个部分,如表所示。

    Route(路由)路由是⽹关的基本单元,由ID、URI、⼀组Predicate、⼀组Filter组成,根据Predicate进⾏匹配转发。
    Predicate(谓语、断⾔)路由转发的判断条件,⽬前SpringCloud Gateway⽀持多种⽅式,常⻅如:Path、Query、Method、Header等,写法必须遵循 key=vlue的形式
    Filter(过滤器)过滤器是路由转发请求时所经过的过滤逻辑,可⽤于修改请求、响应内容

    2.1Predicate 断⾔条件

    说⽩了 Predicate 就是为了实现⼀组匹配规则,⽅便让请求过来找到对应的 Route 进⾏处理,接下来我们接下 Spring Cloud GateWay 内置⼏种 Predicate 的使⽤。转发规则(predicates),假设 转发uri都设定为http://localhost:9001,常⻅Predicate,如表所示

    规则实例说明
    Path- Path=/gate/,/rule/当请求的路径为gate、rule开头的时,转发到 http://localhost:9001服务器上
    Before- Before=2017-01-20T17:42:47.789-07:00[America/Denver]在某个时间之前的请求才会被转发到 http://localhost:9001 服务器上
    After- After=2017-01-20T17:42:47.789- 07:00[America/Denver]在某个时间之后的请求才会被转发
    Between- Between=2017-01-20T17:42:47.789-07:00[America/Denver],2017-01- 21T17:42:47.789-07:00[America/Denver]在某个时间段之间的才会被转发
    Cookie- Cookie=chocolate, ch.p名为chocolate的表单或者满⾜正则ch.p的表单才会被匹配到 进⾏请求转发
    Header- Header=X-Request-Id, \d+携带参数X-Request-Id或者满⾜\d+的请求头才会匹配
    Host- Host=www.hd123.com当主机名为www.hd123.com的时候直接转发到 http://localhost:9001服务器上
    Method- Method=GET只有GET⽅法才会匹配转发请求,还可以限定POST、PUT等

    2.1.1 通过请求参数匹配

    Query Route Predicate ⽀持传⼊两个参数,⼀个是属性名⼀个为属性值,属性值可以是正则表达 式

    spring:
      cloud:
        gateway:
          routes:
            - id: service3 
              uri: https://www.baidu.com 
              order: 0 
              predicates:
                 - Query=smile
    

    这样配置,只要请求中包含 smile 属性的参数即可匹配路由。使⽤ curl 测试,命令⾏输⼊:curl localhost:9005?smile=x&id=2,经过测试发现只要请求汇总带有 smile 参数即会匹配路由,不带 smile 参数则不会匹配。 还可以将 Query 的值以键值对的⽅式进⾏配置,这样在请求过来时会对属性值和正则进⾏匹配,匹配上才会⾛路由。

    spring:
      cloud:
        gateway:
          routes:
            - id: service3 
              uri: https://www.baidu.com 
              order: 0 
              predicates:
                 - Query=keep, pu.
    

    这样只要当请求中包含 keep 属性并且参数值是以 pu 开头的⻓度为三位的字符串才会进⾏匹配和路由。 使⽤ curl 测试,命令⾏输⼊:curl localhost:8080?keep=pub,测试可以返回⻚⾯代码,将 keep 的属 性值改为 pubx 再次访问就会报 404,证明路由需要匹配正则表达式才会进⾏路由。

    2.1.2 通过Header匹配

    Header Route Predicate 和 Query Route Predicate ⼀样,也是接收 2 个参数,⼀个 header 中属性名称和⼀个正则表达式,这个属性值和正则表达式匹配则执⾏。

    spring:
      cloud:
        gateway:
          routes:
            - id: service4
              uri: https://www.baidu.com 
              order: 0 
              predicates:
                 - Header=X-Request-Id, \d+
    

    使⽤ curl 测试,命令⾏输⼊:curl http://localhost:9005 -H “X-Request-Id:88”,则返回⻚⾯代 码证明匹配成功。将参数-H "X-Request-Id:88"改为-H “X-Request-Id:spring”,再次执⾏时返回 404证明没有匹配。

    2.1.3 通过Cookie匹配

    Cookie Route Predicate 可以接收两个参数,⼀个是 Cookie name ,⼀个是正则表达式,路由规则会通过获取对应的 Cookie name 值和正则表达式去匹配,如果匹配上就会执⾏路由,如果没有匹配 上则不执⾏。

    spring:
      cloud:
        gateway:
          routes:
            - id: service5
              uri: https://www.baidu.com 
              predicates:
                 - Cookie=sessionId, test
    

    使⽤ curl 测试,命令⾏输⼊,curl http://localhost:9005 --cookie “sessionId=test”,则会返回⻚⾯代码,如果去掉–cookie “sessionId=test”,后台汇报 404 错误。

    2.1.4 通过Host匹配

    Host Route Predicate 接收⼀组参数,⼀组匹配的域名列表,这个模板是⼀个 ant 分隔的模板, ⽤.号作为分隔符。它通过参数中的主机地址作为匹配规则。

    spring:
      cloud:
        gateway:
          routes:
            - id: service6
              uri: https://www.baidu.com 
              predicates:
                 - Host=**.baidu.com
    

    使⽤ curl 测试,命令⾏输⼊,curl http://localhost:9005 -H "Host: www.baidu.com"或者curl http://localhost:8080 -H “Host: md.baidu.com”,经测试以上两种 host 均可匹配到 host_route 路由,去掉 host 参数则会报 404 错误。

    2.1.5 通过请求⽅式匹配

    spring:
      cloud:
        gateway:
          routes:
            - id: service7
              uri: https://www.baidu.com 
              predicates:
                 - Method=PUT
    

    使⽤ curl 测试,命令⾏输⼊,curl -X PUT http://localhost:9005,测试返回⻚⾯代码,证明匹配 到路由,以其他⽅式,返回 404 没有找到,证明没有匹配上路由

    2.1.6 通过请求路径匹配

    Path RoutePredicate 接收⼀个匹配路径的参数来判断是否路由。

    spring:
      cloud:
        gateway:
          routes:
            - id: service8
              uri: https://www.baidu.com 
              predicates:
                 - Path=/payment/{segment} 
    

    如果请求路径符合要求,则此路由将匹配, curl 测试,命令⾏输⼊,curl http://localhost:9005/payment/1, 可以正常获取到⻚⾯返回值,curl http://localhost:9005/payment2/1,报404,证明路由是通过指定路由来匹配

    2.1.7 组合匹配

    spring:
      cloud:
        gateway:
          routes:
            - id: service9
              uri: http://127.0.0.1:9001 
              predicates:
                 - Host=**.foo.org 
                 - Path=/headers
                 - Method=GET 
                 - Header=X-Request-Id, \d+ 
                 - Query=foo, ba. 
                 - Query=baz 
                 - Cookie=chocolate, ch.p
    

    各种 Predicates 同时存在于同⼀个路由时,请求必须同时满⾜所有的条件才被这个路由匹配。 ⼀个请求满⾜多个路由的断⾔条件时,请求只会被⾸个成功匹配的路由转发

    2.2 过滤器规则

    列举⼏个过滤器,如表所示。

    过滤规则实例说明
    PrefixPath- PrefixPath=/app在请求路径前加上app
    RewritePath- RewritePath=/test, /app/test访问localhost:9022/test,请求会转发到 localhost:8001/app/test
    SetPathSetPath=/app/{path}通过模板设置路径,转发的规则时会在路径前增加 app,{path}表示原请求路径
    RedirectTo重定向
    RemoveRequestHea去掉某个请求头信息\1. PrefixPath

    2.2.1 PrefixPath

    ​ 对所有的请求路径添加前缀

    spring:
      cloud:
        gateway:
          routes:
            - id: service10
              uri: http://127.0.0.1:9001 
              predicates:
                 - Path=/payment/{segment} 
              filters:
              	- PrefixPath=/payment
    

    访问/123请求被发送到http://127.0.0.1:9001/payment/123。

    2.2.2 StripPrefix

    跳过指定的路径

    spring:
      cloud:
        gateway:
          routes:
            - id: service11
              uri: http://127.0.0.1:9001 
              predicates:
                 - Path=/payment/{segment} 
              filters:
              	- StripPrefix=1 
              	- PrefixPath=/payment
    

    此时访问http://localhost:9005/api/123,⾸先StripPrefix过滤器去掉⼀个/api,然后PrefixPath 过滤器加上⼀个/payment,能够正确访问到微服务。

    2.2.3 RewritePath

    spring:
      cloud:
        gateway:
          routes:
            - id: service12
              uri: http://127.0.0.1:9001 
              predicates:
                 - Path=/payment/{segment} 
              filters:
              	- RewritePath=/api/(?<segment>.*), /$\{segment}
    

    请求http://localhost:9005/api/payment/123路径,RewritePath过滤器将路径重写为 http://localhost:9005/payment/123,能够正确访问微服务。

    2.2.4 SetPath

    SetPath和Rewrite类似,代码如下

    spring:
      cloud:
        gateway:
          routes:
            - id: service13
              uri: http://127.0.0.1:9001
              predicates:
                 - Path=/payment/{segment} 
              filters:
              	- SetPath=/payment/{segment}
    

    请求http://localhost:9005/api/payment/123路径,SetPath过滤器将路径设置为 http://localhost:9005/payment/123,能够正确访问微服务。

    2.2.5 RemoveRequestHeader

    去掉某个请求头信息。

    spring:
      cloud:
        gateway:
          routes:
            - id: removerequestheader_route
              uri: https://example.org  
              filters:
              	- RemoveRequestHeader=X-Request-Foo 12345678
    

    去掉请求头X-Request-Foo

    2.2.6 RemoveResponseHeader

    去掉某个回执头信息

    spring:
      cloud:
        gateway:
          routes:
            - id: removerequestparameter_route
              uri: https://example.org  
              filters:
              	- RemoveRequestParameter=red
    

    2.2.7 SetRequestHeader

    设置请求头信息

    spring:
      cloud:
        gateway:
          routes:
            - id: setrequestheader_route
              uri: https://example.org  
              filters:
              	- SetRequestHeader=X-Request-Red, Blue
    

    2.2.8 default-filters

    对所有的请求添加过滤器

    spring:
      cloud:
        gateway:
          routes:
            - id: service14
              uri: http://127.0.0.1:9001
              predicates:
                    - Path=/9001/{segment}
            - id: service15
              uri: http://127.0.0.1:9000
              predicates:
                    - Path=/9000/{segment}
          default-filters:
            - StripPrefix=1
            - PrefixPath=/payment
    

    对所有的请求添加过滤器

    spring:
      cloud:
        gateway:
          routes:
            - id: service14
              uri: http://127.0.0.1:9001
              predicates:
                    - Path=/9001/{segment}
            - id: service15
              uri: http://127.0.0.1:9000
              predicates:
                    - Path=/9000/{segment}
          default-filters:
            - StripPrefix=1
            - PrefixPath=/payment
    
    展开全文
  • ACL原理作用,ACL类型特点,ACL匹配和通配符使用 https://www.toutiao.com/i6944913479459553795/?tt_from=weixin&utm_campaign=client_share&wxshare_count=1&timestamp=1617195586&app=news_...
  • 九、使用注解开发配置文件:xmlns:xsi=...
  • NginxNginx使用与配置1 什么是nginx1.1 可大量并行处理1.2 与 Apache 相比1.2.1 Apache VS Nginx1.2.2 常用web服务器对比1.3 Nginx 模块1.3.1 核心模块1.3.2 标准 HTTP 模块1.3.3 可选 HTTP 模块1.3.4 邮件服务模块...
  • *分别为区分大小写不匹配及不区分大小写不匹配二、文件及目录匹配-f!-f用来判断是否存在文件-d!-d用来判断是否存在目录-e!-e用来判断是否存在文件或目录-x!-x用来判断文件是否可执行三.rewrite指令的最后一...
  • [TOC]在上篇.Net微服务实践(二):Ocelot介绍快速开始中我们介绍了Ocelot,创建了一个Ocelot Hello World程序...配置{"ReRoutes": [],"GlobalConfiguration": {}}Ocelot的配置文件包含两个节点: ReRoutesGlobalC...
  • URI 即统一标识资源符,...query][#fragment]格式说明如下:在 Nginx 的应用场景中,URL 与 URI 并无明确区别。URI 标准(RFC3986)中约定,URL 是 URI 的一个子集;scheme 是 URI 请求时遵守的协议,常见的有 HTTP、...
  • ACL匹配规则

    千次阅读 2021-08-21 14:00:04
    这里还有一种acl 5000-5999 这是用户自定义类型的acl 这里边匹配的规则随意搭配 在ACL中没有写的规则就是any 掩码、反掩码、通配符的区别 ACL配置 acl [编号] 创建一个acl rule [序列号] deny/permit [source] 192....
  • 文件及目录匹配,其中:* -f!-f用来判断是否存在文件* -d!-d用来判断是否存在目录* -e!-e用来判断是否存在文件或目录* -x!-x用来判断文件是否可执行三.rewrite指令的最后一项参数为flag标记,flag标记有:1...
  • 1、^: 匹配字符串的开始位置;2、 $:匹配字符串的结束位置;3、.*: .匹配任意字符,*匹配数量0到正无穷;4、\. 斜杠用来转义,\.匹配 . 特殊使用方法,记住记性了;5、(值1|值2|值3|值4):或匹配模式,例:(jpg|...
  • CentOS7网卡DNS配置

    2021-03-01 17:42:48
    关键词 /etc/sysconfig/network-scripts/ifcfg-eth0 网卡 网络接口 DNS 网卡配置文件 Linux如何加载IP地址信息?...在系统开机的时候,会加载该配置文件,进行IP地址等网络信息的配置 redhat系列 网络相关配置文件
  • nginx配置proxy_pass时url末尾带“/”与不带“/”的区别如下:注意:当location为正则表达式匹配模式时,proxy_pass中的url末尾是不允许有"/"的,因此正则表达式匹配模式不在讨论范围内。proxy_pass配置中url末尾带/...
  • python 匹配@

    2020-12-21 12:38:38
    正则查找相关的方法 | 手把手教你入门Python之八十五上一篇:正则表达式简介 | 手把手教你入门Python之八十四下一篇:Re....正则查找相关的方法在Python中的查找匹配⽅法,常⻅的...文章温柔的养猫人2020-07-08161浏...
  • 这个时候如果mavensetting.xml中配置了镜像 , 而且镜像配置的规则中匹配到目标仓库时 ,maven认为目标仓库被镜像了, 不会再去被镜像仓库下载依赖jar包, 而是直接去镜像仓库下载.简单而言, mirror可以拦截对远程仓库的...
  • 但为了避免相关的版权争议,我重新写了一个do文件,处理的方法变量也有改变。举例:接受培训对于工资的影响分析思路:(1)验证选择性的存在;(2)倾向值打分;(3)匹配估计量两种方法:pscore;psmatch2所选用数据:...
  • ~* 分别为区分大小写不匹配及不区分大小写不匹配二、文件及目录匹配-f !-f 用来判断是否存在文件-d !-d 用来判断是否存在目录-e !-e 用来判断是否存在文件或目录-x !-x 用来判断文件是否可执行三....
  • 注意:当location为正则...proxy_pass配置中url末尾带/时,nginx转发时,会将原uri去除location匹配表达式后的内容拼接在proxy_pass中url之后。测试地址:http://192.168.171.129/test/tes.jsp场景一:location ^...
  • URI 即统一标识资源符,...query][#fragment]格式说明如下:在 Nginx 的应用场景中,URL 与 URI 并无明确区别。URI 标准(RFC3986)中约定,URL 是 URI 的一个子集;scheme 是 URI 请求时遵守的协议,常见的有 HTTP、...
  • 我必须寻找一个PDF手册使用这个查询:root@localhost:test> select * from a where name like '%taz_manual%.pdf%';+--------------------+------------------+-------------+| name | description | s...
  • nginx location 匹配目录

    2020-12-22 21:10:03
    nginx每个location都是一个匹配目录,nginx的策略是:访问请求来时,会对访问地址进行解析,从上到下逐个匹配匹配上就执行对应location大括号中的策略,并根据策略对请求作出相应。依访问地址:...
  • 如何配置前缀列表

    2021-11-24 16:01:22
    前缀列表中匹配条目由IP地址掩码组成,IP地址可以是网段地址或者主机地址,掩码长度的配置范围为0-32,可以进行精确匹配或者在一定掩码长度范围内匹配,也可以通过配置关键字greater-equalless-equal指定待匹配...
  • 设置查看路由表都可以用 route 命令,设置内核路由表的命令格式是:route [add|del] [-net|-host] target [netmask Nm] [gw Gw] [[dev] If] 其中: add : 添加一条路由规则, del : 删除一条路由规则, -net : ...
  • 用低配置电脑试验,结果Win7旗舰版专业版配置要求差不多运行效果也相差不大,高级家庭版就明显比上面两个流畅了一些,因为家庭基础版没有aero,想来想用的朋友也不多我就没进行测试,由于win7旗舰,专业版较高级...
  • nacos如何实现动态刷新配置 1、nacos启动流程 前置知识: 1、springBoot在启动过程中,大致流程为首先从classpath/META-INF/spring.facotries文件中加载并实例化initializerslisteners,会在prepareContext时通过...
  • server段配置 listen: listen指令有三种配置方法: 1、listen address[:port] [ default_server ] [ ssl ]; 2、listen port [ default_server ] [ ssl ];... ###监听所有808000端口 listen 192.168.1.10;##...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 232,912
精华内容 93,164
关键字:

匹配和配置的区别