Rails - 确保www在URL中

AnA*_*ice 5 ruby-on-rails ruby-on-rails-3

我的应用程序托管在Heroku上,并拥有www.mysite.com的证书

我正在努力解决

  • 确保www在URL中,并且URL是HTTPS

这是我到目前为止所拥有的:

class ApplicationController < ActionController::Base
before_filter :check_uri

  def check_uri
    redirect_to request.protocol + "www." + request.host_with_port + request.request_uri if !/^www/.match(request.host) if Rails.env == 'production'
  end
Run Code Online (Sandbox Code Playgroud)

但这似乎并没有起作用.任何建议或可能不同的方法来解决确保HTTP和www.在URL中?

谢谢

yfe*_*lum 12

对于SSL,请使用rack-ssl.

# config/environments/production.rb
MyApp::Application.configure do
  require 'rack/ssl'
  config.middleware.use Rack::SSL
  # the rest of the production config....
end
Run Code Online (Sandbox Code Playgroud)

对于WWW,创建一个Rack中间件自己.

# lib/rack/www.rb
class Rack::Www
  def initialize(app)
    @app = app
  end
  def call(env)
    if env['SERVER_NAME'] =~ /^www\./
      @app.call(env)
    else
      [ 307, { 'Location' => 'https://www.my-domain-name.com/' }, '' ]
    end
  end
end

# config/environments/production.rb
MyApp::Application.configure do
  config.middleware.use Rack::Www
  # the rest of the production config....
end
Run Code Online (Sandbox Code Playgroud)

要在浏览器中对此进行测试,您可以编辑 /etc/hosts在本地开发计算机上文件

# /etc/hosts
# ...
127.0.0.1 my-domain-name.com
127.0.0.1 www.my-domain-name.com
Run Code Online (Sandbox Code Playgroud)

在本地开发计算机上以生产模式运行应用程序

$ RAILS_ENV=production rails s -p 80
Run Code Online (Sandbox Code Playgroud)

并浏览到 http://my-domain-name.com/并查看会发生什么.

在测试期间,您可能想要注释掉重定向到HTTPS站点的行.

可能还有一些方法可以使用许多Rails项目使用的标准单元测试和集成测试工具来测试它,例如Test::UnitRSpec.