当重定向 URL 的值使用 进行编码时,Nginx 不会进行重定向encodeURIComponent
。
location /redirect/ {
return 307 $arg_target_url;
}
当我从浏览器输入网址时:
mylocalserver.com/redirect/?target_url=example.com%3Fx%3Dy%26z%3Dk
它被重定向到
mylocalserver.com/redirect/example.com%3Fx%3Dy%26z%3Dk
期望是,它应该被重定向到 url example.com?x=y&z=k
。
但是,当$arg_target_url
包含普通值时,它确实有效。
答案1
安装nginx和njs脚本语言,请阅读安装说明:nginx:Linux 软件包。确保先备份您的配置。
以 Debian 上的 nginx.org 稳定存储库为例,安装的最少步骤nginx
和软件包如下:nginx-module-njs
echo "deb http://nginx.org/packages/debian $(lsb_release -cs) nginx" |
sudo tee /etc/apt/sources.list.d/nginx.list
curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo apt-key add -
sudo apt update
sudo apt install nginx nginx-module-njs
添加行
load_module modules/ngx_http_js_module.so;
到您的主要配置 (
nginx.conf
)。http.js
在 nginx 配置目录中创建包含以下内容的文件:function decoded_target_url(r) { return decodeURIComponent(r.args.target_url); } export default {decoded_target_url};
将您的默认配置更改为:
js_import http.js; js_set $decoded_target_url http.decoded_target_url; server { # ... more stuff default_type text/html; location /redirect/ { return 307 $decoded_target_url; } # ... more stuff }
运行
nginx -t
以检查配置并重新启动服务器。
您需要将协议(http://
或https://
)添加到查询参数中,例如
mylocalserver.com/redirect/?target_url=http%3A%2F%2Fexample.com%2F%3Fx%3Dy%26z%3Dk
或改变
return 307 $decoded_target_url
到硬编码的
return 307 http://$decoded_target_url
或者
return 307 https://$decoded_target_url
相关文档: