如何修复Sinatra将https重定向到nginx下的http

Ale*_*ans 14 nginx thin sinatra

我有一个在nginx中运行的Sinatra应用程序(使用thin作为后代理),我redirect '/<path>'在Sinatra中使用语句.但是,当我在https下访问该站点时,这些重定向将发送给我http://localhost/<path>而不是https://localhost/<path>他们应该这样做.

目前,nginx的将控制传递到薄用这个命令,其中是proxy_pass http://thin_clusterthin_cluster

upstream thin_cluster { server unix:/tmp/thin.cct.0.sock; }
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?

mat*_*att 22

为了让Sinatra正确地组装用于重定向的URL,它需要能够确定请求是否使用ssl,以便可以使用httphttps适当地进行重定向.

显然,对thin的实际调用不使用ssl,因为这是由前端Web服务器处理的,并且代理请求是明确的.因此,我们需要一种方法来告诉Sinatra它应该将请求视为安全,即使它实际上并没有使用ssl.

最终,确定请求是否应被视为安全的代码在Rack::Request#ssl?Rack::Request#scheme方法中.这些scheme方法检查env散列以查看是否存在多个条目之一.其中一个HTTP_X_FORWARDED_PROTO对应于X-Forwarded-ProtoHTTP头.如果设置了此项,则该值将用作协议方案(httphttps).

因此,如果我们在从nginx代理到后端时将此HTTP标头添加到请求中,Sinatra将能够正确地确定何时重定向到https.在nginx中,我们可以将代码添加到代理请求中proxy_set_header,并且该方案在$scheme变量中可用.

所以添加线

proxy_set_header X-Forwarded-Proto $scheme;
Run Code Online (Sandbox Code Playgroud)

proxy_pass在行之后的nginx配置应该使它工作.

  • @bioneuralnet你也可以使用`X-Forwarded-Host`,在检查`Host`标题之前进行机架检查.我看起来不像nginx自动添加这些标题,但Apache在mod_proxy中. (2认同)