Rails Link Generation/Caching 问题

Rails Link Generation/Caching Issue

我正在使用通过 Cloud 66 部署的 Spree Commerce 和 Digital Ocean 服务器上的 运行。 Nginx 是我的网络服务器。

如果有人通过其中一个服务器的 IP 地址而不是域名访问我的站点,那么缓存链接似乎会变成 "infected" 和 IP 地址。今后,缓存链接使用 IP 地址作为基础 URL 而不是站点的 FQDN。

例如,假设我网站的 FQDN 是 "store.mystore.com",它的 IP 地址是 45.5.5.235。某人(或某些机器人)通过 IP 地址而不是 FQDN 访问产品索引。他们访问“https://45.5.5.555/products". Going forward, the cached links that used to show "https://store.mystore.com/products/product-1" now show up as "https://45.5.5.235/products/product-1”。

我使用的是与我的 FQDN 相关联的站点级 SSL,因此用户浏览器中会出现一个严重的警告,警告他们他们将要单击的站点不是他们认为的站点这是。显然不利于电子商务。

如果我手动清除缓存,问题就会得到纠正,直到另一个 bot/crawler 通过 ip 地址访问该站点。

我正在使用 memcached 和 Dalli,如果这有什么不同的话。我正在 Spree 的管理面板中设置站点 URL。

我能做些什么来确保 Rails 生成的链接总是 使用 FQDN 而不是服务器的 IP 地址?

编辑

Eirikir 的回答非常正确,但是我有一个 HAProxy 负载平衡器在两个不同的服务器之间切换。我在 nginx 配置的末尾放置了两个服务器块,一个在端口 80 上侦听 http,一个在 443 上侦听 https。

server {
        listen 80;
        server_name haproxy_ip rails_server_ip;
        return 301 $scheme://store.mystore.com$request_uri;
}

    server {
        listen 443;
        server_name haproxy_ip rails_server_ip;
        return 301 $scheme://store.mystore.com$request_uri;
}

不确定这是否是最好的方法,但到目前为止它似乎有效。

link 缓存问题取决于您的站点可通过多个域(包括 IP)访问这一事实。这对 SEO 来说很糟糕,因为搜索引擎可能会将您的规范域视为备用域的副本。

您没有提及您使用的是 Apache、Nginx 还是其他服务器,但那将是 301 重定向到规范生产域的最佳位置。一些 DNS 服务还将此功能封装为某种 DNS 记录类型。您需要在 server/DNS 配置中找到如何执行此操作。

如果您无法在 DNS 或服务器级别执行重定向,您可以在 application_controller.rb 中的 before_filter 中实现重定向:

before_filter :redirect_to_canonical_host if Rails.env.production?

private
CANONICAL_HOST = "store.mystore.com"
def redirect_to_canonical_host
  unless request.host == CANONICAL_HOST
    redirect_to "https://#{CANONICAL_HOST}#{request.fullpath unless request.fullpath == '/'}", status: :moved_permanently
  end
end

同样,这不是最佳选择,因为 Apache 或 Nginx 重定向会快得多,我担心服务器管理员会为此投票反对我,但在某些情况下无法避免。

ETA:无论如何我都不是 Nginx 专家,但我不相信 server_name 可以使用通配符,因此您必须编写带有重定向的 server 块对于每个可能的 IP 或备用主机名,例如:

server {
        server_name 45.5.5.555;
        return 301 $scheme://store.mystore.com$request_uri;
}