Nginx资料之uri参数

本文详细介绍了在Lua环境中如何使用NGINX处理HTTP请求的GET和POST参数,包括uri参数的获取与传递,以及如何正确读取请求body内容。通过示例展示了ngx.req模块的使用方法。

◆ 获取uri参数:
1.获取get请求参数:ngx.req.get_uri_args
2.获取post请求参数ngx.req.get_post_args

   location /print_param {
       content_by_lua_block {
           local arg = ngx.req.get_uri_args()
           for k,v in pairs(arg) do
               ngx.say("[GET ] key:", k, " v:", v)
           end
           ngx.req.read_body() -- 解析 body 参数之前一定要先读取 body
           local arg = ngx.req.get_post_args()
           for k,v in pairs(arg) do
               ngx.say("[POST] key:", k, " v:", v)
           end
       }
   }
➜  ~  curl '127.0.0.1/print_param?a=1&b=2%26' -d 'c=3&d=4%26'
[GET ] key:b v:2&
[GET ] key:a v:1
[POST] key:d v:4&
[POST] key:c v:3

◆ 传递请求 uri 参数:
URI内容传递过程中是需要调用 ngx.encode_args 进行规则转义。

location /test {
       content_by_lua_block {
           local res = ngx.location.capture(
                    '/print_param',
                    {
                       method = ngx.HTTP_POST,
                       args = ngx.encode_args({a = 1, b = '2&'}),
                       body = ngx.encode_args({c = 3, d = '4&'})
                   }
                )
           ngx.say(res.body)
       }
   }

输出结果:

    ➜  ~  curl '127.0.0.1/test'
    [GET]  key:b v:2&
    [GET]  key:a v:1
    [POST] key:d v:4&
    [POST] key:c v:3

◆ 获取请求body内容
需先设置lua_need_request_body on,然后再用ngx.req.get_body_data()获取body数据

http {
    server {
        listen    80;
        # 默认读取 body
        lua_need_request_body on;
        location /test {
            content_by_lua_block {
                local data = ngx.req.get_body_data()
                ngx.say("hello ", data)
            }
        }
    }
}
再次测试,符合我们预期:
➜  ~  curl 127.0.0.1/test -d jack
hello jack
Nginx 中,URI 配置主要用于定义如何处理客户端请求,包括路径匹配、重定向、代理转发等操作。URI 配置主要通过 `location` 指令实现,它允许根据请求的 URI 来选择不同的处理逻辑。 ### URI 配置的基本语法 `location` 指令的语法如下: ```nginx location [modifier] uri { # 配置内容 } ``` 其中,`modifier` 是可选的匹配修饰符,用于定义 URI 匹配的类型,如精确匹配、前缀匹配、正则表达式匹配等。 #### 匹配类型 1. **无修饰符**:表示前缀匹配。例如,`location /images/` 会匹配所有以 `/images/` 开头的 URI。 2. **=**:表示精确匹配。例如,`location = /index.html` 只匹配 `/index.html`,不匹配 `/index.php` 或其他路径。 3. **~**:表示区分大小写的正则表达式匹配。例如,`location ~ ^/user/\d+$` 匹配 `/user/123`。 4. **~***:表示不区分大小写的正则表达式匹配。例如,`location ~* \.(jpg|jpeg)$` 匹配 `.jpg` 和 `.JPG` 文件。 5. **^~**:表示前缀匹配,但优先于正则表达式匹配。例如,`location ^~ /static/` 会优先匹配 `/static/` 路径[^2]。 ### URI 匹配顺序 Nginx 在匹配 `location` 时遵循以下顺序: 1. 精确匹配(`=`)。 2. 前缀匹配(`^~`)。 3. 正则表达式匹配(`~` 或 `~*`)。 4. 普通前缀匹配(无修饰符)。 如果多个 `location` 匹配成功,Nginx 会优先选择优先级最高的规则。 ### URI 重写与重定向 Nginx 支持通过 `rewrite` 指令对 URI 进行重写或重定向。`rewrite` 指令的基本语法如下: ```nginx rewrite regex replacement [flag]; ``` - `regex` 是一个正则表达式,用于匹配请求的 URI。 - `replacement` 是新的 URI 或路径。 - `flag` 是可选标志,如 `last`、`break`、`redirect`、`permanent` 等。 例如,以下配置将 `/old-page` 重定向到 `/new-page`: ```nginx rewrite ^/old-page$ /new-page permanent; ``` ### 示例配置 以下是一个典型的 `location` 配置示例: ```nginx server { listen 80; server_name example.com; location / { root /var/www/html; index index.html; } location /api/ { proxy_pass http://backend_server; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.4-fpm.sock; } } ``` 在这个配置中: - `location /` 处理根请求,使用 `/var/www/html` 作为文档根目录。 - `location /api/` 将所有 `/api/` 路径的请求代理到后端服务器。 - `location ~ \.php$` 处理 PHP 文件请求,使用 FastCGI 处理 PHP 脚本[^2]。 ### URI 与变量的使用 Nginx 支持在配置中使用变量,变量可以通过 `$` 符号引用。例如,`$uri` 变量表示当前请求的 URI,`$args` 表示请求的参数。 以下是一个使用变量的示例: ```nginx location /redirect { set $target http://example.com; rewrite ^/redirect/(.*)$ $target/$1 permanent; } ``` 在这个配置中,`set` 指令定义了一个变量 `$target`,`rewrite` 指令将 `/redirect/path` 重定向到 `http://example.com/path`[^2]。 ### 总结 NginxURI 配置通过 `location` 指令实现,支持多种匹配类型和重写规则。通过灵活的配置,可以实现路径匹配、重定向、代理转发等功能。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值