首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我的Rails应用程序中的force_ssl会出现无限重定向循环?

为什么我的Rails应用程序中的force_ssl会出现无限重定向循环?
EN

Stack Overflow用户
提问于 2012-02-26 05:18:16
回答 1查看 19.3K关注 0票数 66

我想让我的API控制器使用SSL,所以我向nginx.conf添加了另一个listen指令。

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

server {
  listen 80 default deferred;
  listen 443 ssl default;
  ssl_certificate /etc/ssl/certs/foo.crt;
  ssl_certificate_key /etc/ssl/private/foo.key;

  server_name foo;
  root /var/apps/foo/current/public;

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

  location @unicorn {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://unicorn;
  }

  error_page 502 503 /maintenance.html;
  error_page 500 504 /500.html;
  keepalive_timeout 5;
}

它通过了nginx配置测试,没有任何问题。我还在我的ApiController中添加了一个force_ssl指令

代码语言:javascript
复制
class ApiController < ApplicationController
  force_ssl if Rails.env.production?

  def auth
    user = User.authenticate(params[:username], params[:password])
    respond_to do |format|
      format.json do
        if user
          user.generate_api_key! unless user.api_key.present?
          render json: { key: user.api_key }
        else
          render json: { error: 401 }, status: 401
        end
      end
    end
  end

  def check
    user = User.find_by_api_key(params[:api_key])
    respond_to do |format|
      format.json do
        if user
          render json: { status: 'ok' }
        else
          render json: { status: 'failure' }, status: 401
        end
      end
    end
  end
end

这在我不使用SSL的时候运行得很好,但是现在当我尝试curl --LI http://foo/api/auth.json时,我会被正确地重定向到https,但之后我会一直被重定向到http://foo/api/auth,并以无限的重定向循环结束。

我的路线简单地说

代码语言:javascript
复制
get "api/auth"
get "api/check"

我使用的是Ruby 1.9.2上的Rails 3.2.1和nginx 0.7.65

EN

回答 1

Stack Overflow用户

发布于 2012-02-26 05:23:47

尝试在您的nginx location @unicorn块中设置此指令:

proxy_set_header X-Forwarded-Proto https;

我遇到了同样的问题,并调查了Rack中间件处理程序(不是force_ssl,而是类似的),我可以看到它希望设置标头来确定请求是否已经被nginx作为SSL处理。

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

https://stackoverflow.com/questions/9448168

复制
相关文章

相似问题

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