【发布时间】:2015-10-10 15:06:43
【问题描述】:
我有一个单页应用程序,我想让它可以抓取,所以我生成了快照。我的应用栈是 rails + unicorn + nginx(作为反向代理)。
现在,Aws Opsworks 从 this cookbook 生成一个 nginx 配置。我通过 ssh 进入系统并修改了默认配置以包含以下行来重定向来自搜索引擎机器人的所有请求,如下所示(它们转换包含 #! 的 url 并在查询参数中发送带有 _escaped_fragment_ 的新请求) :
if ($args ~ "_escaped_fragment_=(.+)") {
rewrite ^ /snapshots$uri$1?;
}
当我在浏览器中加载 url 时,一切都很好。我面临的问题是使用chef 自动化相同的事情。由于我添加的代码位于 opsworks 使用默认说明书生成的配置文件中,因此我需要一种方法来定义 nginx server 块来实现此目的。所以,我定义了以下服务器块。
server {
listen 80;
server_name example.com;
if ($args ~ "_escaped_fragment_=(.+)") {
set $foo $1;
rewrite ^ /snapshots$uri$foo?;
}
}
但是 nginx 永远不会选择这个块,因为已经存在另一个具有相同 server_name 的服务器块。那么,有没有一种方法可以根据$args 中_escaped_fragment_ 的存在来定义一个server 块以供nginx 选择?
如下(我知道这行不通,因为正则表达式与查询参数不匹配)
server {
listen 80;
server_name example.com(.+)_escaped_fragment_=(.+);
...
}
【问题讨论】:
-
退一步说,你真的需要快照吗?大多数主要的搜索引擎(包括谷歌)都在渲染他们从网站接收到的内容,在我们(谷歌的)案例中,使用接近无头浏览器的东西,所以无论你为用户做什么,搜索引擎也会得到它。
-
这也是我最初的计划,但现在我没有基础设施带宽来做到这一点。我想使用github.com/prerender/prerender_rails,但我在免费 aws 计划中只有一个微实例,并且我不想通过运行 phantomJS 实例来增加 CPU 负载。这是我的 MVP 的临时解决方案。
标签: nginx seo chef-infra aws-opsworks