根据某些查询参数的存在选择服务器块

时间:2015-07-21 08:49:27

标签: nginx seo chef aws-opsworks

我有一个单页面应用程序,我想让它可以抓取,所以我生成了快照。我的应用程序堆栈是rails + unicorn + nginx(作为反向代理)。

现在,Aws Opsworks从this cookbook生成一个nginx配置。我抨击了系统&修改了默认配置以包含以下行以重定向来自搜索引擎机器人的所有请求,如下所示(它们转换包含#!的网址并在查询参数中发送带_escaped_fragment_的新请求):

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

当我在浏览器中加载网址时,一切都运行良好。我面临的问题是使用chef自动执行相同的操作。由于我添加的代码是在opsworks使用默认cookbook生成的配置文件中,我需要一种方法来定义一个nginx server块来实现这一点。所以,我定义了以下服务器块。

server {
    listen 80;
    server_name example.com;

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

但是nginx将永远不会选择此块,因为已存在具有相同server_name的另一个服务器块。那么,有没有一种方法可以根据server_escaped_fragment_的存在来定义nginx要选择的$args块?

如下所示(我知道这不起作用,因为正则表达式与查询参数不匹配)

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

    ...
}

1 个答案:

答案 0 :(得分:0)

为了在chef中执行此操作,您需要创建一个自定义cookbook(如果您还没有),并且其中包含一个配方,该配方将使用您的首选文件覆盖opsworks生成的文件。在食谱中你需要2个文件,nginx模板和一个配方来用自定义模板覆盖默认模板:

  1. mycookbook - >模板 - >默认 - > custom_nginx.erb
  2. mycookbook - >食谱 - > customise_nginx.rb
  3. (1)的内容:

    无论你想要什么nginx配置文件,所以:

    template "/etc/nginx/sites-enabled/<nginx file name>" do
      source "custom_nginx.erb"
      user "root"
      group "root"
      mode "644"
    end
    
    service "nginx" do
      action :reload
    end
    

    (2)的内容:

    $compile

    然后将mycookbook :: customise_nginx添加到图层设置中的自定义设置配方部分。

    如果您还没有自定义食谱,则需要进行更多设置: https://www.digitalocean.com/community/tutorials/how-to-create-simple-chef-cookbooks-to-manage-infrastructure-on-ubuntu http://docs.aws.amazon.com/opsworks/latest/userguide/workingcookbook-installingcustom-enable.html

    编辑: 如果你想保留opsworks配置文件,你有两个选择:采取opsworks正在使用的模板,我猜这个? https://github.com/aws/opsworks-cookbooks/blob/release-chef-11.10/nginx/templat‌​es/default/site.erb,创建副本并将更改放在文件1中,如上所示。或者使用chef来修改现有文件内容 - 例如使用FileEdit库(查看此question的第二个答案)