location /archive/oss {
# 使用 Lua 脚本处理请求
content_by_lua_block {
-- 获取请求的 URI 和查询参数
local uri = ngx.var.uri
local args = ngx.req.get_uri_args()
-- 定义一个表来存储需要保留的参数
local allowed_keys = {
"X-Amz-Algorithm",
"X-Amz-Date",
"X-Amz-SignedHeaders",
"X-Amz-Expires",
"X-Amz-Credential",
"X-Amz-Signature"
}
local new_args = {}
-- 遍历所有参数,只保留指定的参数
for key, value in pairs(args) do
for _, allowed_key in ipairs(allowed_keys) do
if key == allowed_key then
table.insert(new_args, key .. "=" .. value)
break
end
end
end
-- 将保留的参数拼接成新的查询字符串
local new_args_str = table.concat(new_args, "&")
-- 去掉 /archive/oss 路径
local new_uri = uri:gsub("^/archive/oss/", "/")
-- 构造新的请求 URL
local new_url = "http://s3.nvpc-middleware.svc.cluster.local:8333" .. new_uri
if new_args_str ~= "" then
new_url = new_url .. "?" .. new_args_str
end
-- 将新的请求路径和参数存储在 Nginx 变量中
ngx.var.new_url = new_url
-- 转发请求到后端服务
ngx.exec("@proxy", new_url)
}
}
# 定义一个内部 location 来处理代理
location @proxy {
internal;
# 从 Nginx 变量中获取新的请求路径和参数
set $new_url $new_url;
# 构造完整的后端服务 URL
proxy_pass $new_url;
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_set_header X-Forwarded-Proto $scheme;
# proxy_set_header Host $http_host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_set_header X-Forwarded-Proto $scheme;
# proxy_set_header Authorization $http_authorization;
}