重定向到HTTPS时,多次重定向到rails

时间:2011-09-13 18:36:45

标签: ruby-on-rails apache redirect https routes

情况如下(我正在使用Rails 3.1)。

我有以下路线:

match 'login', :to => 'sessions#new'

非常标准。我的Apache虚拟主机文件中也有这个重定向规则:

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule (/login$) https://%{HTTP_HOST}%{REQUEST_URI}

当我导航到https://hostname.dom/login时,我从浏览器中获取301状态代码(重定向太多)。有人能指出引擎盖后面发生了什么吗?感谢。

3 个答案:

答案 0 :(得分:1)

我会通过rails而不是apache来处理这种重定向。减少错误的可能性并删除rails应用程序与某个Web服务器的耦合(在本例中为apache) 对于Rails 3.0.X和以前的使用 SSL_Requirement和3.1.X以及之后使用“force_ssl”方法进行烘焙。

ssl_requirement示例:

class ApplicationController < ActiveRecord::Base
  include SslRequirement
end

class SessionController < ApplicationController
  ssl_required :new, :create

  def new
    # Non-SSL access will be redirected to SSL
  end
end

force_ssl示例:

class SessionController < ApplicationController
  force_ssl :only =>  :new, :create

  def new
    # Non-SSL access will be redirected to SSL
  end
end

答案 1 :(得分:0)

如果您可以访问Web服务器配置并且每个页面都应该位于HTTPS连接后面,我建议不要在Application层上使用SSL hanldling。那是为什么?

当您正在处理一个简单的应用程序时,没有理由在应用程序和外部之间安装负载均衡器。但是当您应该管理负载平衡并具有备份环境时,负载均衡器就是一个解决方案。

由于SSL握手和签名请求需要占用CPU周期,因此Load Balancer可以在没有SSL的情况下与每个内部Web服务器进行通信,但在外部。

如果应用程序正在增长,请将环境部分视为图层。每个层都有责任。只有在你想要的时候,责任的混合才能占据一席之地。

答案 2 :(得分:0)

嗯,答案或多或少是虚拟主机的错过配置。 NameVirtualHost指令在分隔文件中随处可见,每个文件都配置了自己的虚拟主机。我已经将所有NameVirtualHost指令合并到一个文件中,该文件在加载任何单个虚拟主机之前加载。

其中一个虚拟主机实际上使用了错误的命名主机。具体来说,登台环境和开发/测试环境都是本地安装的,但显然可以在不同的URL下访问。一个是在{etc / hosts中配置http://data.localhost/,另一个是http://data.domain.name/。所以前者解析为127.0.0.1,另一个解析为192.168.x.x.但是,两个虚拟主机都试图解析为127.0.0.1,所以很明显这是破坏了事情。我刚刚为每个主机配置指定了正确的命名主机,并重新启用了重写规则,并且在访问登录页面时,从HTTP到HTTPS的重定向都很顺利,反之亦然,可以访问每个其他页面。

TL; DR 您应该始终拥有一个包含所有NameVirtualHost指令的文件,并确保在所有虚拟主机之前加载该文件。它会为你节省很多,很多人很头疼。还要积极考虑你的虚拟主机是否真的使用了正确的主机。然后,确保ServerName指令不会导致与其他虚拟主机冲突,并且您将拥有一个快乐的虚拟Apache系列!