location匹配的规则和优先级

10 篇文章 0 订阅

目录

location匹配规则

location匹配优先级

在实际网站中,如何配置location

nginx中的变量

内置变量:

用户自定义变量:

使用变量的注意事项:

重定向

rewrite语法

rewrite和location的区别

基于域名的跳转

基于客户端IP访问跳转

基于目录下所有 php 结尾的文件跳转


location匹配规则

location匹配uri字符串标识符,在URL:www.baidu.com/test 中,nginx就是匹配/test这一部分。

精确匹配 (=): 如果有精确匹配,将首先使用该规则。例如:

location = /path {
    # 匹配 /path,不匹配 /path/ 等其他路径
    # 处理逻辑
}

正则匹配 (~~*): 使用正则表达式进行匹配。~表示区分大小写,~*表示不区分大小写。按照配置文件中的顺序,第一个匹配成功的规则生效。例如:

        普通前缀匹配: 如果没有前缀匹配或正则匹配,将使用普通的前缀匹配。例如

location /path/ {
    # 匹配以 /path/ 开头的路径,包括 /path/subpath/
    # 处理逻辑
}

前缀匹配 (^~): 如果有前缀匹配,将按照配置文件中出现的顺序使用。例如:

location ^~ /images/ {
    # 匹配以 /images/ 开头的路径
    # 处理逻辑
}

通用匹配 (/): 如果没有以上匹配成功,将使用通用匹配。通用匹配通常用于处理所有未匹配的请求。例如:

location / {
    # 匹配所有路径
    # 处理逻辑
}

location匹配优先级

  • 精确匹配(location = ) >正则匹配(location ^-)>(location ~ ~*)>带路径的通用匹配location /test > location /

  • 在配置文件中,location块的顺序非常重要,因为匹配将按照配置文件中出现的顺序进行。第一个匹配成功的规则将生效,后续的规则将不再考虑。

在实际网站中,如何配置location

三个必选的规则

  • 精确匹配

    一般用于网站的首页,我们都用精确匹配。一般是静态页面,也可以是发送到后端的动态页面。

  • 处理静态文件的规则

  • 前缀匹配和后缀匹配

  • 一般匹配

nginx中的变量

在 Nginx 中,有两种类型的变量:内置变量和用户自定义变量。这些变量用于在配置文件中获取和使用请求相关的信息,以及进行一些条件判断或操作。

内置变量:

基本的请求信息变量:

  • $host: 请求中的 Host 头。

  • $uri: 请求中的 URI,不包括参数。

  • $request_uri: 完整的请求 URI,包括参数。

  • $args: 请求中的参数部分。

  • $remote_addr: 客户端的 IP 地址。

  • $request_method: 请求的方法,如 GET、POST 等。

时间和日期变量:

  • $time_local: 本地时间,通常用于日志记录。

  • $msec: 当前时间的毫秒部分。

连接信息变量:

  • $connection: 客户端连接信息。

  • $server_protocol: 使用的协议版本。

HTTP 头信息变量:

  • $http_user_agent: User-Agent 头。

  • $http_referer: Referer 头。

  • $http_cookie: Cookie 头。

  • 其他自定义的 $http_... 变量,可以获取其他 HTTP 头信息。

用户自定义变量:

        用户可以通过 set 指令在 httpserverlocation 块中自定义变量,然后在配置文件中引用这些变量。

http {
    # 定义一个自定义变量
    set $custom_variable "Hello, world!";

    server {
        location /example {
            # 使用自定义变量
            return 200 $custom_variable;
        }
    }
}

这里的 $custom_variable 就是一个用户自定义的变量。

使用变量的注意事项:

  • 变量名通常以 $ 符号开头。

  • 内置变量和用户自定义变量可以在配置文件中的任何地方使用。

  • 使用变量时,要注意变量的作用域。例如,某些变量只在 http 块中有效,而某些变量在 serverlocation 块中有效。

  • if 指令中使用变量时,要注意一些特殊的注意事项,因为 if 的使用可能会影响性能和产生一些不直观的结果。

重定向

  • rewrite 作用就是结合正则表达式实现URI的重写已经定向(页面跳转)

  • rewrite只能在server location if这三个位置之中

return和rewrite的区别

returnrewrite 是 Nginx 中用于处理请求的两个不同指令,它们在功能和使用上有一些区别。

return 指令:

示例:

server {
    listen 80;
    server_name your_domain.com;

    location /old-path/ {
        return 301 /new-path/;
        # 返回 HTTP 301 状态码,浏览器会跳转到 /new-path/
    }

    # 其他配置...
}
  • return 主要用于在请求处理过程中返回指定的 HTTP 状态码和响应头,而不是修改请求的 URI。

  • 可以用于实现简单的重定向,通常用于返回特定状态码,例如 301、302 等。

  • 不会改变原始请求的 URI,因此不适用于对请求路径进行重写。

rewrite 指令:

  • rewrite 用于修改请求的 URI,可以根据正则表达式进行匹配和替换。

  • 除了 URI 的修改,还可以配合 last 标志实现内部重定向,将请求重新发送到 Nginx 处理。

  • 可以实现更灵活的路径重写和修改。

    示例:

server {
    listen 80;
    server_name your_domain.com;

    location /old-url/ {
        rewrite ^/old-url/(.*)$ /new-url/$1 permanent;
        # 使用正则表达式将 /old-url/ 重定向到 /new-url/
    }

    # 其他配置...
}

总的来说,如果只是简单的重定向或返回特定状态码,可以使用 return 指令。如果需要更复杂的 URI 重写或内部重定向,可以使用 rewrite 指令。在实际使用中,选择使用哪个取决于具体的需求和场景。

rewrite语法

rewrite的语法

rewrite flag(标记位)

rewrite regex replacement [flag];

  • regex: 正则表达式,用于匹配请求 URI。
  • replacement: 替换部分,用于生成新的 URI。
  • flag(可选): 修饰符,用于指定额外的行为。常见的有 last、break、redirect 等。

 flag类型:

last

  • 作用:本条规则匹配完之后,继续向下匹配新的location uri的规则。停止当前 rewrite 阶段,并重新在新 URI 上执行 location 匹配。

  • 示例:

    location /old-path/ {
    rewrite ^/old-path/(.*)$ /new-path/$1 last;
    # 内部重定向到 /new-path/,并重新匹配 location
    }
    

break

  • 作用:本条规则匹配完成之后即停止,不再匹配其他跳转规则,URI地址也不会发生变化。停止当前 rewrite 阶段,不再处理后续的 rewrite 规则。

  • 示例:

    location /break-path/ {
    rewrite ^/break-path/(.*)$ /index.php?page=$1 break;
    # 终止重写过程,不再处理其他 rewrite 规则
    }
    

 redirect 和 permanent:

  • 作用:执行外部重定向。

  • redirect:临时重定向 HTTP302。

  • permanent:永久重定向 HTTP301。

  • 永久重定向(301)用于永久性的URL变更,搜索引擎会转移权重和排名到新的URL,客户端会记住新的URL。 临时重定向(302)用于短期的URL变更,搜索引擎不会转移权重和排名到新的URL,客户端会继续访问原始URL。

  • 示例:

location /old-url/ {
    rewrite ^/old-url/(.*)$ /new-url/$1 redirect;
    # 临时重定向到 /new-url/
}

location /old-path/ {
    rewrite ^/old-path/(.*)$ /new-path/$1 permanent;
    # 永久重定向到 /new-path/
}

 nginx内部语法last方式,最多只能循环10次,超过之后会返回500错误码 查看日志:internal redirection cycle while processing

rewrite和location的区别

  • rewrite和location似乎都可以实现页面跳转,

  • rewrite的就是跳转到新的或者是更改获取指定资源的路径

  • location是访问控制,以及反向代理。

rewritelocation 是 Nginx 中两个不同的指令,它们的作用和使用场景不同。

rewrite 指令:

  • rewrite 用于修改请求的 URI(Uniform Resource Identifier)。

  • 它通常用于重定向请求、修改请求路径或执行高级的 URL 操作。

  • 语法示例:rewrite regex replacement [flag];

  • 例如:rewrite ^/old-url/(.*)$ /new-url/$1 permanent;

location 指令:

  • location 用于定义匹配请求 URI 的位置块,然后在该位置块内配置特定的指令。

  • 它通常用于配置不同 URI 的不同行为,如代理、反向代理、限制访问等。

  • 语法示例:location optional_modifier location_match { ... }

  • 例如:location /images/ { ... }

区别:

  • 作用:

  • rewrite 主要用于修改 URI,实现重定向或更改请求路径等操作。

  • location 用于定义不同 URI 的位置块,用于配置与特定 URI 匹配的一系列指令。

  • 使用场景:

  • 使用 rewrite 来执行复杂的 URI 操作,例如重定向、路径修改等。

  • 使用 location 来配置不同 URI 下的服务器行为,例如反向代理、限制访问等。

  • 语法:

  • rewrite 的语法包括正则表达式和替换字符串,用于匹配和修改 URI。

  • location 的语法包括匹配模式和位置块内的配置指令。

  • 示例:

  • rewrite 示例:rewrite ^/old-url/(.*)$ /new-url/$1 permanent;

  • location 示例:location /images/ { ... }

综上所述,rewrite 用于 URI 的修改和重定向,而 location 用于配置不同 URI 下的不同行为。


基于域名的跳转

        现在公司旧域名www.test.com有业务需求变更,需要使用新域名www.benet.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。

vim /usr/local/nginx/conf/nginx.conf
server {
    listen       80;
    server_name  www.test.com;                                       #域名修改  
    #charset utf-8;
    #access_log  /var/log/nginx/test.com-access.log;                  #日志修改
    location / {
    #添加域名重定向
        if ($host = 'www.test.com'){                                #$host为rewrite全局变量,代表请求主机头字段或主机名
            rewrite ^/(.*)$ http://www.benet.com/$1 permanent;       #在重定向时,$1表示请求的URL
        }
        root   html;
        index  index.html index.htm;
    }
}

实验准备

echo "192.168.41.10 www.test.com www.benet.com" >> /etc/hosts

基于客户端IP访问跳转

        今天公司业务新版本上线,要求所有 IP 访问任何内容都显示一个固定维护页面, 只有公司 IP :192.168.41.10访问正常。

vim /usr/local/nginx/conf/nginx.conf
server {
    listen       80;
    server_name  www.test.com;                       #域名修改  
    charset utf-8;
    access_log  /var/log/nginx/test.com-access.log;  #日志修改

    #设置是否合法的IP标记
    set $rewrite true;                             #设置变量$rewrite,变量值为boole值true

    #判断是否为合法IP
    if ($remote_addr = "192.168.41.61"){          #当客户端IP为192.168.41.61时,将变量值设为false,不进行重写
        set $rewrite false;
    }
                                                   #除了合法IP,其它都是非法IP,进行重写跳转维护页面
    if ($rewrite = true){                          #当变量值为true时,进行重写
        rewrite (.+) /error.html;                   #重写在访问IP后边插入/error.html,例如192.168.41.22/error.html
    }
    location = /error.html {
        root html;                                 #网页返回html/error.html的内容
    }

    location / {
        root   html;
        index  index.html index.htm;
    }
}

systemctl restart nginx

基于目录下所有 php 结尾的文件跳转

vim /usr/local/nginx/conf/nginx.conf
server {
    listen       80;
    server_name  www.test.com;      #域名修改   
    charset utf-8;
    access_log  /var/log/nginx/www.test.com-access.log;

    location ~* /upload/.*\.php$ {
        rewrite (.+) http://www.test.com permanent;
    }

    location / {
        root   html;
        index  index.html index.htm;
    }
}
systemctl restart nginx

访问http://www.test.com/upload/123.php,直接跳转到www.test.com
  • 24
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值