nginx - 有条件地提供文件而无需重定向

时间:2012-12-13 17:54:16

标签: nginx passenger

我目前正在rails中构建一个多域cms。由于此内容在下一次更改之前是相同的,因此我希望通过静态文件进行缓存。

包含foo.com和baz.com的一些缓存页面的公共目录(两种情况下都是/和/ asdf):

public/
   assets/
      cms.css
   sites/
      foo.com/
         assets/
            screen-some-hash.min.css
         index.html
         asdf/
            index.html
      baz.com/
         assets/
            screen-some-hash.min.css
         index.html
         asdf/
            index.html

我想做的是以下内容:

将www重定向到非www(作品)

如果请求包含子域(cms,admin,等等): 如果路径包含/ assets在public / assets中提供文件,则将过期内容设置为30d左右。这里没问题,因为/ assets = public / assets和public /是乘客根。 其他所有:通过rails处理它,没有特殊的缓存或任何需要的东西。

对于所有其他请求(表示没有子域): 如果路径包含/ assets在public / sites / $ host $ request_uri中提供文件,则将过期内容设置为30d左右。其他所有:检查公共/ sites / $ host $ request_uri或回退到rails app。

我从未使用过www / non-www重定向以外的nginx条件,并且我不知道我必须为上述条件做些什么。如果可能的话,我不想对缓存的东西使用重定向(即重定向到/sites/foo.com/asdf),而是希望在转到{{3}时让nginx直接提供此文件}。

此外:我不想对主机名进行硬编码,因为我想处理未知数量的域名。我也不想为此使用多个rails应用程序。

2 个答案:

答案 0 :(得分:1)

有一些有用的东西,不是100%但现在足够好了。

server {
  listen   80;
  server_name  *IP*;

  if ($host ~* www\.(.*)) {
    set $host_without_www $1;
    rewrite ^(.*)$ http://$host_without_www$1 permanent;
  }

  location ~ ^/(assets)/  {
    try_files /sites/$host$uri $uri @passenger;

    root /home/cms/app/current/public;
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  location / {
    try_files /sites/$host$uri/index.html /sites/$host$uri $uri @passenger;
    root   /home/cms/app/current/public;
  }

  location @passenger {
   access_log  /home/cms/app/shared/log/access.log;
   error_log  /home/cms/app/shared/log/error.log;
   root   /home/cms/app/current/public;
   passenger_enabled on;
  }
}

答案 1 :(得分:0)

对于子域名,这应该可以解决问题:

server {
    server_name ~^(?<subdomain>.+)\.example\.com$;
    access_log /var/log/nginx/$subdomain/access.log;
    location /assets {
        expires max;
    }
    location / {
        proxy_pass http://your_rails_app;
    }
}

不确定proxy_pass设置,因为我对Ruby应用程序的唯一体验是Gitlab,我正在以这种方式运行。我希望这至少有一点帮助。

server {
    server_name example.com;

    location /assets {
        root /public/sites/$hostname/$request_uri;
        expires max;
    }
}

你必须添加自己的设置并稍微玩一下,因为我现在没有机会对它进行实际测试。但它应该告诉你的方式。