如何在Nginx rewrite过程中对$request_uri进行base64编码
Nginx重定向时对$request_uri做Base64编码的实现方案
标准Nginx默认未内置Base64编码能力,需额外安装ngx_http_set_misc_module扩展模块,若使用OpenResty则该模块默认已集成,可直接使用。
方案1:使用set-misc模块实现(通用推荐)
修改配置如下即可,原有冗余的rewrite ^ $request_uri;规则可以直接删除:
server { listen 443 default_server; ssl_certificate /etc/ssl/private/nginx/certificate.crt; ssl_certificate_key /etc/ssl/private/nginx/key.key; # 生成URL安全的Base64编码,自动替换特殊字符、删除尾部填充位 set_encode_base64url $encoded_req "$host$request_uri"; return 302 https://my.domain.com/?req=$encoded_req; }
使用set_encode_base64url而非普通Base64编码的原因是它会自动将+替换为-、/替换为_,并删除尾部的=填充字符,完全避免特殊字符干扰URL参数解析。
方案2:Lua脚本实现(仅OpenResty环境可用)
如果不想单独安装扩展模块,OpenResty环境可直接调用内置Lua函数实现编码:
server { listen 443 default_server; ssl_certificate /etc/ssl/private/nginx/certificate.crt; ssl_certificate_key /etc/ssl/private/nginx/key.key; set $req_content "$host$request_uri"; rewrite_by_lua_block { -- 第二个参数为true时生成URL安全的Base64编码,自动移除尾部填充位 ngx.var.req_content = ngx.encode_base64(ngx.var.req_content, true) } return 302 https://my.domain.com/?req=$req_content; }
注意事项
接收重定向请求的服务端,需要对拿到的req参数做URL安全Base64解码,补全对应长度的=填充位即可得到原始的域名+请求路径内容。
内容的提问来源于stack exchange,提问作者Jean
相关产品推荐
相关产品推荐

