我正在学习如何清理应用的网址。我的应用程序由Heroku上的Rails 3提供支持。
所需的网址为https://www.example.comite.com
我想将与上述不同的所有网址重定向到该网址。这是Rails还是DNS?
错误的网址:
https://example.comite.com
http://www.example.comite.com
http://example.comite.com
如果有任何内容落后,例如http://www.example.comite.com/photo/1
,网址将被重定向:https://www.example.comite.com/photo/1
答案 0 :(得分:47)
作为user2100689's answer的扩展,在Rails 3+中,您可以在 config / environments / production.rb 中使用config.force_ssl = true
该行可以取消注释如下
# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
config.force_ssl = true
答案 1 :(得分:18)
DNS记录无法定义域的协议,因此您无法通过DNS将http://
重定向到https://
。通过Web服务器配置执行此操作不可移植,难以执行,容易出错且只是过时了。这是Rails路由器最好的处理工作。
# beginning of routes.rb
match "*path" => redirect("https://www.mysite.com/%{path}"), :constraints => { :protocol => "http://" }
match "*path" => redirect("https://www.mysite.com/%{path}"), :constraints => { :subdomain => "" }
答案 2 :(得分:7)
因为这是Heroku,所以你不能使用apache或nginx配置。你可以做的是在你的ApplicationController中放一个before_filter,假设你有3个或更多的控制器 下面这些,虽然它们当然会在单独的文件中
class ApplicationController < ActionController::Base
def redirect_https
redirect_to :protocol => "https://" unless request.ssl?
return true
end
before_filter :redirect_https
end
class TypicalController < ApplicationController
def blah
end
end
class HomePageController < ApplicationController
skip_before_filter :redirect_https
end
使用设计时,您可能还需要稍微改变路线,但我怀疑是这样 就像我们这样做的方式所以我不会在这里详细介绍这些细节,并且我修改了代码 以上是为了避免这种并发症。
快乐的黑客攻击。
答案 3 :(得分:7)
Rails 3.1.0及更高版本具有force_ssl
,这是一种控制器方法,将在非开发环境中重定向到https。
http://api.rubyonrails.org/classes/ActionController/ForceSSL/ClassMethods.html
将它放在要重定向的每个控制器中,或者更好的是,将它放在ApplicationController中:
应用程序/控制器/ application.rb中:
class ApplicationController < ActionController::Base
# ...
force_ssl
# ...
end
这总是包含在您的应用中是一件好事(当然,您必须获得证书)。 HTTPS无处不在!
答案 4 :(得分:7)
您始终可以将其投放到production.rb ... config.use_ssl = true
答案 5 :(得分:-5)
在您的vhosts文件中执行此操作。
设置SSL虚拟主机。
在标准端口80虚拟主机中。将其添加到配置:
Redirect permanent / https://www.mysite.com
这会将所有端口80请求转发到https。