gpt4 book ai didi

ruby-on-rails - 为什么我的 Rails 应用程序中会出现使用 force_ssl 的无限重定向循环?

转载 作者:太空宇宙 更新时间:2023-11-03 12:36:57 24 4
gpt4 key购买 nike

我想让我的 API Controller 使用 SSL,所以我在我的 nginx.conf 中添加了另一个 listen 指令

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 conftest。我还在我的 ApiController 中添加了一个 force_ssl 指令

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,以无限重定向循环结束。

我的路线只有

get "api/auth"
get "api/check"

我在 Ruby 1.9.2 和 nginx 0.7.65 上使用 Rails 3.2.1

最佳答案

您不会转发有关此请求是否为 HTTPS 终止请求的任何信息。通常,在服务器中,“ssl on;”指令将设置这些 header ,但您使用的是组合 block 。

Rack(和 force_ssl)通过以下方式确定 SSL:

  • 如果请求来自端口 443(这可能不会从 nginx 传递回 Unicorn)
  • 如果 ENV['HTTPS'] == "on"
  • 如果 X-Forwarded-Proto header == "HTTPS"

参见 the force_ssl source完整的故事。

由于您使用的是组合 block ,因此您想使用第三种形式。尝试:

proxy_set_header X-Forwarded-Proto $scheme;

在您的服务器或位置 block 中 per the nginx documentation .

这会在您收到端口 80 请求时将 header 设置为“http”,并在您收到 443 请求时将其设置为“https”。

关于ruby-on-rails - 为什么我的 Rails 应用程序中会出现使用 force_ssl 的无限重定向循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9448168/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com