Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 重定向到HTTPS时rails中的多个重定向_Ruby On Rails_Apache_Redirect_Https_Routes - Fatal编程技术网

Ruby on rails 重定向到HTTPS时rails中的多个重定向

Ruby on rails 重定向到HTTPS时rails中的多个重定向,ruby-on-rails,apache,redirect,https,routes,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} 当我导航到时,我从浏览器中获得301状态代码(重定向太多)。有人能指出引擎盖后面发生了什么吗?谢谢。

情况如下(我使用的是Rails 3.1)

我有以下路线:

match 'login', :to => 'sessions#new'
相当标准。我的Apache虚拟主机文件中也有此重定向规则:

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

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

我将通过rails而不是apache处理此重定向。减少出错的机会,并消除rails应用程序与特定web服务器(本例中为apache)的耦合。
适用于Rails 3.0.X和以前的使用 对于3.1.X及更高版本,请使用“”方法烘焙

ssl_需求示例:

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
class ApplicationController
强制ssl示例:

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

  def new
    # Non-SSL access will be redirected to SSL
  end
end
class SessionController:新建,:创建
def新
#非SSL访问将重定向到SSL
结束
结束

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

当您在处理一个简单的应用程序时,没有理由在应用程序和外部之间使用负载平衡器。但是,当您需要管理负载平衡并拥有备份环境时,负载平衡器是一个解决方案

由于SSL握手和签名请求需要CPU周期,因此负载平衡器可以在不使用SSL的情况下与每个内部Web服务器通信,但可以与外部Web服务器通信


如果您的应用程序正在增长,请将环境的部分视为。每一层都有责任。只有在你愿意的情况下,责任的混合才会发生。

好吧,答案或多或少是虚拟主机配置失误。NameVirtualHost指令分散在各个单独的文件中,每个文件都配置了自己的虚拟主机。此后,我将所有NameVirtualHost指令整合到一个文件中,该文件在加载任何单个虚拟主机之前加载

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


TL;DR您可能应该始终拥有一个包含所有NameVirtualHost指令的文件,并确保在加载所有虚拟主机之前加载该文件。这会让你省去很多很多头疼的事。另外,还要积极思考,让你陷入困境的虚拟主机是否使用了正确的主机。然后,确保ServerName指令不会引起与其他虚拟主机的冲突,您将拥有一个快乐的虚拟Apache家庭

force_ssl
确实非常可爱,我唯一的问题是在开发模式下不能使用它。事实上,它被“烘焙”到金属中,只有在生产模式下它才会切换协议,所以你甚至不能用它进行测试。我不确定那个决定背后的原因,但是,这是一个可怕的决定。也就是说,如果不是因为这个警告,我真的会使用force_ssl,但是,唉,这太糟糕了。你必须在本地服务器上配置一个生产模式主机。您可以使用apache设置passenger以运行生产模式,或者查看本指南,了解如何使用我假设您在mac osx上运行。我接受了这个答案,因为我不可避免地使用了
force\u ssl
。然而,我的重定向问题直到我纠正了Apache对虚拟主机的错误配置后才得以解决,我在下面的回答中提到了这一点
force_ssl
让我感到困扰,因为我之前说过,没有理由将其仅限于生产,这完全取决于开发人员。我只是觉得不值得在本地SSL支持上浪费时间。现在我唯一的问题是确保只有那些我希望加密的页面保持在HTTPS协议下,而HTTP协议则不然。我总是更喜欢web服务器来配置SSL支持。到目前为止,它的速度要快很多,所以我同意这种说法。在我的特殊情况下,我只希望需要安全的页面使用HTTPS作为活动协议。只是良好实践:)