1

让我尽可能彻底地解释情况如何。

我有一个 Rails 应用程序,它为网站的特定部分使用页面缓存。在浏览 Google Analytics 时,我注意到我自己的域作为引荐来源,我觉得这很奇怪。经过进一步调查,我发现当我以我的域作为引荐来源网址访问其中一个页面时,链接指向不同的域名,但呈现页面正常。例如:

我在 domain.com 上。我转到 domain.com/someones_profile,当我将鼠标悬停在任何链接上时,它会显示 anotherdomain.com/someones_profile/about。现在,如果我单击该链接,它将带我到 anotherdomain.com/someones_profile/about 但这是我的页面在我的服务器上被访问(日志验证它。)

我通过使用我未使用的域名之一并将 A 记录更改为我的服务器的 IP 来测试这一点。然后我清除了页面缓存目录并使用我刚刚设置的域 domain2.com/someones_profile 访问了一个可缓存页面,并将链接缓存为 domain2.com/someones_profile。

希望这个解释是有道理的。“渗透”我的缓存的域属于我不认识的人,其意图似乎没有任何恶意,但我想知道 Rails 是否有任何内置方法来规避这样的事情。诸如强制 page_cache 链接使用特定域而不是引用域是什么。

任何帮助将不胜感激,我更喜欢使用内置的 Rails 方法而不是自己写东西,也许/也许不是因为我很懒。

4

2 回答 2

1

好的,我想我明白你的问题了。您如何在使用 xxx_path 而不是 xxx_url 的页面中创建链接?这应该只导致生成相对路径。不会将域名写入 html 文档。我会通过 _url 的视图进行搜索和替换,并将它们更改为 _path。

例如,如果您认为这是:

<%= link_to "View all posts", posts_url %>

您将其更改为:

<%= link_to "View all posts", posts_path %>

顺便说一句,这个答案假设您是通过使用路由来创建链接,而不是通过将 URL 直接放入视图中!

于 2010-12-08T02:08:01.147 回答
0

尝试使用折射 gem 将所有不去单个已定义主机的访问重定向到该单个已定义主机。这也将提高页面排名,因为它会删除重复的内容:

# config/initializers/refraction_rules.rb
Refraction.configure do |req|
  if req.host == "www.you-like-this-host.com"
    # configure other redirects here
    # eg. I'm using this to migrate URLs from the legacy application
    # to this new application (eg when migrated from PHP to Rails)
  else
    # this is not your hostname, redirect!
    req.permanent! :host => "www.you-like-this-host.com"
  end
end

折射在机架堆栈中较早运行,因此非常轻巧。例如,Apache 的 mod_rewrite 不能可靠地与乘客一起工作,所以我更喜欢折射。

确保作为中间件插件加载:

# config/environments/production.rb
config.middleware.insert_before ::Rack::Lock, ::Refraction, {}

带有主机名的链接永远不应出现在页面缓存中。您确定生成没有主机名的站点内 URL 吗?也许您尝试以这种方式创建唯一链接(通过将当前主机名传递给link_toor url_for),最好使用折射并清理您的代码。

于 2010-12-08T00:23:21.093 回答