我正在尝试确保应用程序控制器before_filter
中的规范域(Rails 3.2)。如果GET
请求来自受支持的域,而不是规范域,那么我们应该重定向到确切的路径和协议,但是在交换的域上。
before_filter :ensure_correct_domain
def ensure_correct_domain
if Rails.env.production? && request.get? && request.host != Settings.domain
redirect_to host: Settings.domain
end
end
这段代码大部分都有用,但我发现它在格式化路径上失败了。这是发生的事情:
可悲的是,我失去了延期,我不知道为什么。我也担心有更多边缘情况我没有偶然发现。如何干净地替换当前请求的URL的仅的主机并使其在所有案例中工作?
答案 0 :(得分:2)
当您将哈希值传递给redirect_to
时,它会使用哈希值调用url_for
。看起来您需要为格式化路径的哈希添加format: "xml"
(或其他)。或许更清晰(相对而言)的替代方案是使用规范域构建URL并使用该字符串发出redirect_to
。如果以字符串开头,该字符串将无需进一步处理即可使用。
对于3.2以后,我认为这应该有效,但我没有测试过。
if Rails.env.production? && request.get? && request.host != Settings.domain
redirect_to "#{request.protocol}#{Settings.domain}#{request.fullpath}"
end