zoukankan      html  css  js  c++  java
  • [记录]Nginx配置实现&&和||的方法实例

    Nginx配置文件中if的&&和||的实现(nginx不支持&&和||的写法)


    1.与(&&)的写法:


    set $condiction '';
    if ($http_user_agent ~ "Chrome"){
    set $condiction a;
    }
    if ($args ~ "r=hao123"){
    set $condiction "${condiction}b";
    }
    if ($condiction = ab){
    rewrite ^/(.*)$ https://www.hao123.com/?tn=94408350_hao_pg;
    }
    说明:当浏览器是Chrome并且url的参数是r=hao123的时候做重定向。

      rewrite有四个flag,不带flag时默认是redirect(302),如下:

      1)last(重写后的规则,会继续用重写后的值去匹配下面的location。)

      2)break(重写后的规则,不会去匹配下面的location。使用新的规则,直接发起一次http请求了。)

      3)permanent(301永久重定向,搜索引擎在抓取新内容的同时也将旧的网址替换为重定向之后的网址)

      4)redirect(302临时重定向,搜索引擎会抓取新的内容而保留旧的网址)(网站换量的场景下使用)

    2.或(||)的写法:


    set $condiction 0;
    if ($http_x_forwarded_for ~ " ?xxx.xxx.xxx.xx1$"){
    set $condiction 1;
    }
    if ($http_x_forwarded_for ~ " ?xxx.xxx.xxx.xx2$"){
    set $condiction 1;
    }
    if ($condiction){
    rewrite ^/(.*)$ https://www.hao123.com/?tn=94408350_hao_pg;
    }
    说明:当ip是xxx.xxx.xxx.xx1或xxx.xxx.xxx.xx2的时候做重定向。

    3.结合上面两段代码,实现禁止IP访问,禁止Chrome浏览器并且url参数是r=hao123的访问。
    set $condiction1 true;
    set $condiction2 '';
    if ($http_user_agent ~ "Chrome") {
    set $condiction2 a;
    }
    if ($args ~ "r=hao123") {
    set $condiction2 "${condiction2}b";
    }
    if ($condiction2 = ab) {
    set $condiction1 false;
    }

    if ($http_x_forwarded_for ~ " ?xxx.xxx.xxx.xx1$") {
    set $condiction1 false;
    }
    if ($http_x_forwarded_for ~ " ?xxx.xxx.xxx.xx2$") {
    set $condiction1 false;
    }

    if ($condiction1 = false) {
    return 403;
    }

    扩展:nginx+lua,实现upstream是由lua从redis中读取配置动态生成的。

    server {  
      listen 80;
      server_name _;
      server_name_in_redirect off;
      port_in_redirect off;
      root /root/html;
    
      location / {
        set $upstream "";
        rewrite_by_lua '
          -- load global route cache into current request scope
          -- by default vars are not shared between requests
          local routes = _G.routes
    
          -- setup routes cache if empty
          if routes == nil then
            routes = {}
            ngx.log(ngx.ALERT, "Route cache is empty.")
          end
    
          -- try cached route first
          local route = routes[ngx.var.http_host]
          if route == nil then
            local redis  = require "redis"
            local client = redis.connect("localhost", 6379)
            route        = client:get(ngx.var.http_host)
          end
    
          -- fallback to redis for lookups
          if route ~= nil then
            ngx.var.upstream = route
            routes[ngx.var.http_host] = route
            _G.routes = routes
          else
            ngx.exit(ngx.HTTP_NOT_FOUND)
          end
        ';
    
        proxy_buffering             off;
        proxy_set_header            Host $host;
        proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_redirect              off;
        proxy_connect_timeout       10;
        proxy_send_timeout          30;
        proxy_read_timeout          30;
        proxy_pass                  http://$upstream;
      }
    }

  • 相关阅读:
    单例模式及其调用
    SQL 语句中left join 与join 条件放置位置,进而影响SQL语句的执行效率的问题
    用辩证的方法去看待项目管理(《最后期限》、《人月神话》),没有最好的项目管理方案,只有最适合的。
    关于Aspose.Words插入表格单元格的高度问题的解决
    google guava cache
    jvm 设置
    Heron 数据模型,API和组件介绍
    基数统计的常用方法
    apache storm 1.0.0 新特性
    spark的那些坑
  • 原文地址:https://www.cnblogs.com/wsjhk/p/8394827.html
Copyright © 2011-2022 走看看