微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

NGINX 上的全局变量

如何解决NGINX 上的全局变量

我正在使用 Nginx 来提供静态文件、反向代理到 Django 并验证客户端证书。

我不想在 url root 请求证书,所以我在 Nginx.conf 上创建了另一个服务器来请求端口 8443 上的证书。这个服务器只是为了请求证书并重定向客户端回到 443 端口,这里发生了 Django 的反向代理。

这是我的 Nginx.conf:


events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    sendfile        on;

    keepalive_timeout  65;

    gzip  on; 

    upstream app {
        server django:8000;
    }

    # Redirect from HTTP to HTTPS
    server {
        listen *:80;
        server_name localhost;
        return 301 https://localhost$request_uri;
    }

    server {
        
        listen *:443 ssl;
        server_name localhost;

        ssl_certificate      /etc/Nginx/ssl/certificate.pem;
        ssl_certificate_key  /etc/Nginx/ssl/certificate.key;
        ssl_password_file    /etc/Nginx/ssl/certificate.pass;

        ssl_verify_client off;
        ssl_client_certificate /etc/Nginx/ssl/chain.cer;
        ssl_verify_depth 3;

        ssl_protocols TLSv1.1 TLSv1.2;
        ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;                
        ssl_prefer_server_ciphers  on;

        server_tokens off;
        underscores_in_headers on;

        location /static/ {
            autoindex off;
            alias /static_files/;
        }

        location / {
            try_files $uri $uri/ @app_web;
        }

        location @app_web {
            proxy_pass http://app;
            proxy_pass_request_headers on;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header CERTINFO $http_certinfo;
            proxy_redirect off;
        }
    }

    server {
        
        listen *:8443 ssl;
        server_name localhost;

        ssl_certificate      /etc/Nginx/ssl/certificate.pem;
        ssl_certificate_key  /etc/Nginx/ssl/certificate.key;
        ssl_password_file    /etc/Nginx/ssl/certificate.pass;

        ssl_verify_client on;
        ssl_client_certificate /etc/Nginx/ssl/certificate.cer
        ssl_verify_depth 3;

        ssl_protocols TLSv1.1 TLSv1.2;
        ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;                
        ssl_prefer_server_ciphers  on;

        add_header CERTINFO $ssl_client_s_dn;

        return 301 https://$host$request_uri;
    
    }
}

当客户端在端口 8443 上进行身份验证并且我将他返回到端口 443 时,我需要转发他的证书信息,更具体地说是 $ssl_client_s_dn。为此,我尝试在端口 8443 (CERTINFO) 的服务器上使用 add_header 方法和在端口 443 的服务器上使用 $http_certinfo 捕获值的方法 proxy_set_header。但此解决方案不起作用。报头不会从 8443 端口转发到 443 端口服务器。

我的问题是:有没有办法做到这一点?我可以在 http 块上设置某种“全局”变量,更改其在端口 8443 上的值,然后使用端口 443 上的更新值将其转发给 Django?

非常感谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。