nginx url decode issue
7 February, 2023
公司的 bitbucket 已使用多年,最近计划升级,主要期望解决 nextjs 项目中文件名带有括号时 bitbucket 无法在 web 端查看代码的问题,发现升级完成后问题依旧,而相同版本,本地实验环境则没有发现这个问题,突然想到是不是中间代理层的问题,直连后 bitbucket (tomcat) 服务后发现果然没有这个问题,没想到困扰了这么久的问题居然是 nginx 导致的……
尝试了多种方式,包括 rewrite 等,proxy_pass
依旧转发的内容会先做 url decode,这导致了后端server无法处理,最后本想用 lua 来试试,不过代理网关那边是 apt
直接安装的 nginx,改为 openresty 改动还有点大,遂试试 apt 安装 nginx-module-njs
.
修改 nginx.conf, 添加 ngx_http_js_module
加载
load_module /usr/lib/nginx/modules/ngx_http_js_module.so;
修改有关 bitbucket 段的反向代理配置,导入 git.js,用 auth_request 每次请求都执行 /urlencode
块
js_import /etc/nginx/conf.d/git.js;
js_set $plain_uri 'empty';
location ^~ / {
# ...
auth_request /urlencode;
proxy_pass http://10.180.9.229:7990$plain_uri;
}
location /urlencode {
internal;
js_content git.urlencode;
}
其中 git.js
如下
这里没有用
replaceAll
是因为在njs
中并不支持
function urlencode(r){
let uri = r.variables.request_uri;
r.variables.plain_uri = uri.replace(/\[/g, '%5B').replace(/\]/g, '%5D');
r.return(200);
}
export default {urlencode};