基于openresty进行 query string 重写

主要目前很简单就是移除nginx request 中的query_string,因为rewrite 阶段处理的是uri ,不包含query_string,但是rewrite 会保持 
原query_string ,我们可以通过args 变量重写,当然也可以基于openresty 的 ngx.req.set_uri_args 重写,从代码的简洁以及扩展上 
基于openresty 更好点,以下是一个简单的demo说明

需求

  • 格式
    /demo/?name=demo
    重写为
    /demo/

环境准备

  • docker-compose 文件
 
version: "3"
services: 
  api:
    image: openresty/openresty:alpine
    volumes:
    - "./nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf"
    - "./demoapps:/opt/demoapps"
    ports:
    - "80:80"
    - "8080:8080"
 
 
  • nginx.conf
user root;  
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    gzip  on;
    rewrite_log on;
    real_ip_header     X-Forwarded-For;
    server {
       listen 80;
       charset utf-8;
       default_type text/html;
       location / {
           root /opt/demoapps;
            index index.html index.htm index;
       }
       location ~* ^/demo {
           root /opt/demoapps;
           rewrite_by_lua_block {
               -- format /demo/index.html?name=dalong
              // 基于re.sub 当然也可以使用match 进行处理
               local uri,n,err = ngx.re.sub(ngx.var.request_uri, [[^\/(.+)\/(.+)\?(.+)]], "/$1/$2", "o")
                ngx.log(ngx.ERR,"fetch---"..uri..[[---------]]..ngx.var.request_uri)
                if n >  0 then
                   -- you can also set uri
                   -- ngx.req.set_uri(uri,false)
                   ngx.req.set_uri_args({a="dalong"})
                end
            }
            content_by_lua_block {
            local cjson  = require("cjson.safe");
            local info = {
                request_uri = ngx.var.request_uri,
                query_string = ngx.var.query_string
            }
            ngx.say(cjson.encode(info))
          }
        }
    }
} 
  • 启动
docker-compose up -d

效果

 

 

说明

nginx 的request_uri 变量是只读的,不可修改的,实际使用查询字符串,推荐使用query_string
一个完整的使用参考/index.html$is_args$query_string 此配置对于但页面应用是比较有意义的
$is_args 表示是否携带query_string 包含了为? 没有为空

参考资料

http://nginx.org/en/docs/varindex.html
https://github.com/openresty/lua-nginx-module#ngxreqset_uri_args

posted on 2020-07-27 23:21  荣锋亮  阅读(1374)  评论(0编辑  收藏  举报

导航