我正在使用Ruby on Rails 3,我正在尝试使用Rack。由于我不是这方面的专家,我想知道一些事情。
以下代码来自here。
require 'rack'
class Rack::ForceDomain
def initialize(app, domain)
@app = app
@domain = domain
end
def call(env)
request = Rack::Request.new(env)
if @domain and request.host != @domain
fake_request = Rack::Request.new(env.merge("HTTP_HOST" => @domain))
Rack::Response.new([], 301, "Location" => fake_request.url).finish
else
@app.call(env)
end
end
end
什么是变量app
以及检索其值的位置?
从domain
方法中传递initialize
变量的位置和方式
答案 0 :(得分:2)
Rack是一个中间件,用于将更高级别的应用程序(如rails)连接到网络服务器(如mongrel)。在rails中,您可以使用以下命令来使用此代码:
# config.middleware.use "Rack::ForceDomain", "mydomain.com"
App是对Rails实例的引用。域名是由您获得该代码的人添加的,它不是标准的Rack初始化。
尽管如此,您无需为了正在进行的操作而进入机架级别。我个人更喜欢通过nginx进行重写,但你可以在rails 3中进行重写。
在config / routes.rb文件中:
constraints(:host => /example.com/) do
root :to => redirect("http://www.example.com")
match '/*path', :to => redirect {|params| "http://www.example.com/#{params[:path]}"}
end
这是http://railsdog.com/blog/2010/10/29/redirect-non-www-requests-the-rails3-way/