2015-07-21 46 views
0

我有一个单独的页面应用程序,我想让它可以抓取,因此我生成了快照。我的应用程序堆栈是rails + unicorn + nginx(作为反向代理)。根据某些查询参数的存在来选择服务器块

现在,Aws Opsworks从this cookbook生成一个nginx配置。我ssh-ED成&修改默认的配置包括以下行重定向从搜索引擎机器人的所有请求如下的系统(它们将包含#! &网址查询参数发送一个新的请求与_escaped_fragment_):

if ($args ~ "_escaped_fragment_=(.+)") { 
    rewrite^/snapshots$uri$1?; 
} 

当我在浏览器中加载网址时,一切正常。我面临的问题是使用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_来定义要由nginx选择的server块?

东西如下(我知道,因为正则表达式这是不行的不匹配查询参数)

server { 
    listen 80; 
    server_name example.com(.+)_escaped_fragment_=(.+); 

    ... 
} 
+0

退一步,你真的需要快照吗?大多数主要的搜索引擎(包括谷歌)都在呈现他们从网站收到的内容,在我们的(谷歌)案例中,接近无头浏览器的东西,所以无论你为用户做什么,搜索引擎也会得到它。 – methode

+0

这也是我最初的计划,但现在我没有基础结构带宽来做到这一点。我想使用https://github.com/prerender/prerender_rails,但是我只有一个microinstance在免费aws计划中,我不想通过运行phantomJS实例来增加CPU负载。这是我MVP的临时解决方案。 –

回答