情况如下(我正在使用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状态代码(重定向太多)。有人能指出引擎盖后面发生了什么吗?感谢。
答案 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系列!