HTTP / 2 nginx强制redirectHTTP到HTTPS打破预期的行为

我已经设置了一个使用支持HTTP / 2的最新版本的nginx的示例项目。

我正在closures这个官方博客文章: https : //www.nginx.com/blog/nginx-1-9-5/

下面是一个工作代码示例(详细介绍如何在README中设置所有内容 – 下面粘贴了nginx.conf ): https : //github.com/Integralist/Docker-Examples/tree/master/Nginx-HTTP2

 user nobody nogroup; worker_processes auto; events { worker_connections 512; } http { upstream app { server app:4567; } server { listen *:80 http2; location /app/ { return 301 https://$host$request_uri; } } server { listen *:443 ssl http2; server_name integralist.com; ssl_certificate /etc/nginx/certs/server.crt; ssl_certificate_key /etc/nginx/certs/server.key; ssl_trusted_certificate /etc/nginx/certs/ca.crt; location /app/ { proxy_pass http://app/; } } } 

虽然这个例子有效,但是我遇到了一个问题,如果我使用HTTP在浏览器中访问服务端点,它将首先下载一个名为download的文件, 然后正确地redirect到HTTPS。

我不知道这个文件是什么,或者为什么redirect导致它发生,但它的内容是?

如果我尝试使用curl (例如curl –insecure http:// $ dev_ip:$ dev_80 / app / foo),redirect失败,我想这是因为这个奇怪的下载文件? curl对stdout的响应只是??????

我想知道这是否可能是使用Docker来容纳Ruby应用程序和nginx服务器的副作用?

更新

我从http2 listen *:80 http2;删除了http2 listen *:80 http2; 所以它现在读取listen *:80; 和下载不会发生,但我有问题是试图让redirect指向正确的docker端口现在: – /

为了澄清,我有一个具有dynamic端口生成( -P )的nginx容器。 一个用于访问集装箱化nginx服务的端口:80和一个用于:443 – 我的nginx.conf将stream量从HTTPredirect到HTTPS,但是我需要能够识别443端口号。

例如docker ps显示0.0.0.0:32791->80/tcp, 0.0.0.0:32790->443/tcp : docker ps 0.0.0.0:32791->80/tcp, 0.0.0.0:32790->443/tcp

我正在尝试将http://example.com:32791/app/fooredirect到https://example.com:32790/app/foo

我不确定如何configurationnginx来知道相关的443 Docker端口号是否是dynamic生成的?

运行nginx容器时,我可以明确地使用-p 。 但是我仍然需要将这个端口号作为一个variables传递给nginx(快速谷歌会build议使用Docker的-e "my_port=9999" ,然后使用nginx的env声明来访问它)

更新2

我甚至尝试交换显式端口-p ,然后硬编码端口号到nginx.conf没有运气(例如docker run ... -p 60443:443 -p 60080:80 )…

 listen *:80; location /app/ { return 301 https://$host:60443$request_uri; } 

…如果我点击http://example.com:60080/app/,它会被redirect到https://example.com:60443/,所以几乎在那里,但实际的path/app/并没有被添加到最后redirect?

我遇到的问题是试图让redirect指向正确的docker端口

如果你的nginx docker run --link容器与docker run --link链接( docker run --link ),那么正确的端口是ruby容器镜像中的EXPOSE (d)(即使你不知道哪个主机端口的EXPOSE端口是映射)

直接链接容器到容器可以使用dockerfile中提到的端口。