2016-01-07 150 views
2

我已经设置了nginx作为承载jenkins的ubuntu实例和其他一些应用程序的反向代理。我使用nginx根据相对路径路由到各种应用程序。从客户端到nginx的所有流量均超过https。在防火墙后面,nginx通过http路由一切到配置的路径和端口号。它看起来是这样的:如何处理nginx反向代理https http方案重定向

   firewall 
       | 
       | 
--->https--->nginx---http--->jenkins 
       | 
       | 

nginx的配置文件中的相关部分是这样的:

server { 

    listen 443 ssl; 

    ssl_certificate cert.crt; 
    ssl_certificate_key cert.key; 
    ssl_session_cache builtin:1000 shared:SSL:10m; 
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4; 
    ssl_prefer_server_ciphers on; 


    location /jenkins { 

      proxy_set_header Host $http_host; 
      proxy_set_header X-NginX-Proxy true; 
      proxy_set_header X-Real-IP $remote_addr; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

      proxy_pass http://127.0.0.1:6969; 
    } 

} 

的问题是,詹金斯使用一个简单的身份验证,并在成功登录时,它会发送一个302重定向。 Nginx正确代理的网址和端口,但不是该计划。因此,客户端通过http重定向,而不是https。在浏览器中我然后得到一个400错误:

400 Bad Request The plain HTTP request was sent to HTTPS port 

我知道,有一个方案变量:$方案。但我不知道如何告诉nginx将http重定向从jenkins映射到https。所有的examples我看着在stackoverflow似乎解决稍有不同的情况。

回答

0

我无法使用代理重定向,重写和返回指令来实现我正在寻找的行为。设置jenkins使用https解决了问题。

0

您可能需要重写来自上游的302重定向。假设一切正确,请尝试:

proxy_redirect http:// https://; 

有关详细信息,请参阅this document