重定向到 NGINX 中查询参数中存在的编码 URL

重定向到 NGINX 中查询参数中存在的编码 URL

当重定向 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
  1. 添加行

    load_module modules/ngx_http_js_module.so;
    

    到您的主要配置 ( nginx.conf)。

  2. http.js在 nginx 配置目录中创建包含以下内容的文件:

    function decoded_target_url(r) {
        return decodeURIComponent(r.args.target_url);
    }
    
    export default {decoded_target_url};
    
  3. 将您的默认配置更改为:

    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
    }
    
  4. 运行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

相关文档:

相关内容