首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nginx无法将请求协议正确转发到上游

Nginx无法将请求协议正确转发到上游
EN

Stack Overflow用户
提问于 2013-04-26 03:47:18
回答 2查看 6.8K关注 0票数 15

我有一个rails 4测试版的网站。它在Nginx + Unicorn上运行。我希望nginx将请求协议( 'http‘或'https’)转发给unicorn,这样我就可以使用它们了。然而,我不能让它工作。

我将<%= request.ssl? %><%= request.protocol %>放在视图文件中进行测试。我的nginx服务器配置文件如下:

代码语言:javascript
复制
upstream unicorn {
  server unix:/tmp/unicorn.blog.sock fail_timeout=0;
}

server {
  listen 80;
  listen 443;
  server_name example.com;
  root /home/example;

  ssl on;
  ssl_certificate /etc/nginx/ssl/server.crt;
  ssl_certificate_key /etc/nginx/ssl/server.key;

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  try_files $uri/index.html $uri @unicorn;

  location @unicorn {
    proxy_set_header X-Forwarded-Proto https;  # <--- Line 1
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Ssl on;       # <--- Line 2
    proxy_redirect off;
    proxy_pass http://unicorn;
  }

  error_page 500 502 503 504 /500.html;
  client_max_body_size 4G;
  keepalive_timeout 10;
}

我发现我标记的两行代码运行不正确。这是我的测试结果:

=================

第一行被注释掉了,第二行也被注释掉了:

访问http://the.url

代码语言:javascript
复制
<%= request.ssl? %>     : false
<%= request.protocol %> : http

访问https://the.url

代码语言:javascript
复制
<%= request.ssl? %>     : false
<%= request.protocol %> : http

=================

行1已注释掉,行2未注释或行2已注释,行1未注释或也未注释掉

访问http://the.url

代码语言:javascript
复制
<%= request.ssl? %>     : true
<%= request.protocol %> : https

访问https://the.url

代码语言:javascript
复制
<%= request.ssl? %>     : true
<%= request.protocol %> : https

=================

也就是说,如果这两行中的一行出现,nginx就会将"https“转发到上游,而不管实际的协议是什么。但是如果这两行都没有出现,nginx就会将"http“转发到上游,而不管实际的协议是什么。

有没有人能告诉我怎么写nginx配置文件,这样才能正确转发协议?非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-26 03:59:38

尝试:

代码语言:javascript
复制
proxy_set_header X-Forwarded-Proto $scheme;

代码语言:javascript
复制
server {
    Listen 80
    ...
}
server {
    Listen 443
    ...
    location @unicorn {
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Ssl on;
    }
}
票数 38
EN

Stack Overflow用户

发布于 2013-04-26 03:57:15

您将需要配置两个独立的服务器块。一个用于HTTP,另一个用于HTTPS。这将使配置这两个更容易得多。相同的零件可以包含在单独的共享配置文件中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16223470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档