使用 CloudFlare、Nginx 和 Thin 附加端口 80 的 Https URL

使用 CloudFlare、Nginx 和 Thin 附加端口 80 的 Https URL

我为运行 Ruby on Rails 项目的 Thin 服务器设置了 Nginx。Nginx 目前是我的 SSL 端点。

最近我的网络服务器遇到了一些攻击问题,所以我决定添加 CloudFlare。它目前使用来自 cloudflare 的“严格 SSL”(客户端-CF 链接和 CF-网络服务器链接中的 SSL)。现在浏览我的网站时可以使用此功能,但当我使用 Oauth 访问 Facebook、G+ 等时,重定向链接显示为:(https://example.com:80/destination/url注意:80)。当我不使用CloudFlare时,不会发生这种情况。

我该怎么做才能解决这个问题?这是 CloudFlare 还是 Nginx 的问题?我发现这个帖子,但我无法对其进行逆向工程以将其转化为 nginx。

我当前的 nginx 设置:

server {
      listen      80 default;
      server_name .example.com;
      ## redirect http to https ##
      return 301 https://example.com$request_uri;
}
server {
  listen      443 ssl;
  server_name .example.com;

  client_max_body_size 20M;

  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;
  ssl_ciphers EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS;


  ssl_certificate     /home/my_user/.ssl/example.crt;
  ssl_certificate_key /home/my_user/.ssl/example.key;

  access_log /var/www/example_server/log/access.log;
  error_log  /var/www/example_server/log/error.log;
  root     /var/www/example_server;
  index    index.html;

  if ($host != 'example.com' ) {
    return 301 https://example.com$request_uri;
  }

  location / {
    proxy_set_header  X-Real-IP  $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  Host $http_host;
    proxy_set_header  X_FORWARDED_PROTO $scheme;
    proxy_redirect  off;
    try_files /system/maintenance.html $uri $uri/index.html $uri.html @ruby;
  }

  location @ruby {
    proxy_pass http://example.com;
  }
}

在我的 nginx.conf 中:

#default stuff

http{
set_real_ip_from *IP address for cloudflare*;
#....

port_in_redirect off;

#more default stuff

作为参考,当前请求路径:客户端请求-SSL->CloudFlare-SSL->Nginx-non-SSL->Thin-non-ssl->Nginx-SSL->CloudFlare-SSL->客户端响应

答案1

看来 Omniauth gem 中存在一个问题,导致了这个问题。为什么只有当我使用 CloudFlare 时才会出现问题,而关闭 CloudFlare 时却不会出现问题,这让我很困惑。

无论如何,这是 github 上的问题:

https://github.com/intridea/omniauth/issues/101

我的解决方案:

在 rails 应用程序中,创建一个新的初始化程序 ( config/initializers/omniauth_fix.rb),内容如下:

if Rails.env.production?
  module OmniAuth
    module Strategy
      def full_host
        uri = URI.parse(request.url)
        uri.path = ''
        uri.query = nil
        uri.port = (uri.scheme == 'https' ? 443 : 80)
        uri.to_s
      end
    end
  end
end

这实际上是一个针对该问题的 monkeypatch。希望在 omniauth 的未来版本中能够修复该问题。

答案2

这似乎很奇怪,因为我们不会添加任何重定向,除非你明确要求我们这样做页面规则。我建议向 CloudFlare 支持部门开具一张支持单,以便我们进行检查。

相关内容