代码之家  ›  专栏  ›  技术社区  ›  Ian Terrell

对于在子目录中进行页面缓存的带有乘客的Rails,我的Nginx重写规则应该是什么?

  •  3
  • Ian Terrell  · 技术社区  · 16 年前

    我的大部分配置如下所示:

    server {
      listen 80;
      server_name website.com www.website.com;
      proxy_set_header X-Forwarded-Proto http;
      root /home/deploy/website/current/public;
      passenger_enabled on;
    
      if (-f $document_root/cache/$request_filename.html) { 
        rewrite (.*) $document_root/cache/$1.html break;
      }
    }
    
    server {
      listen       443;
      server_name website.com www.website.com;
      root /home/deploy/website/current/public;
      passenger_enabled on;
      proxy_set_header X-Forwarded-Proto https;
    
      ssl                  on;
      ssl_certificate      /home/deploy/website/shared/ssl/www.website.com.combined.crt;
      ssl_certificate_key  /home/deploy/website/shared/ssl/www.website.com.key;
    }
    

    我预计,当我请求website.com/about时,应该向我提供/public/cache/about.html,但我点击了Rails服务器(跟踪日志显示)。

    认为我可能有一个不适当的斜杠(并且没有看到) $document_root 在大多数示例中),我还尝试了以下所有变体,但均无效:

    if (-f cache$request_filename.html) { 
      rewrite (.*) cache$1.html break;
    }
    
    if (-f /cache$request_filename.html) { 
      rewrite (.*) /cache$1.html break;
    }
    
    if (-f cache/$request_filename.html) { 
      rewrite (.*) cache/$1.html break;
    }
    
    if (-f /cache/$request_filename.html) { 
      rewrite (.*) /cache/$1.html break;
    }
    

    root , passenger_enabled ,并将规则重写为单独的 location / 块,但这也不起作用。我还对语句进行了重新排序,以便 已启用乘客信息单元 最后会来的。我也试过使用 $uri . 很明显我误解了什么!

    这有点简化,因为我还有一个XML api,它被缓存在不同的地方(除了 .html 零件),以及我需要的服务 public/cache/index.html 当 website.com 请求。我只想让它的任何一部分都能正常工作。:)

    感谢您的帮助!

    有条件的

    if (-f $document_root/cache$request_uri.html)
    

    if (-f $document_root/cache$request_uri.html) {
      rewrite (.*) /cache$1.html break;
      break;
    }
    

    将URL重写为 /cache/cache/about.html.html 并将其发送到Rails,Rails会立即呕吐。看起来加倍了,是的!但如果我改写成 /cache$1 它发出 /cache/cache/about 到轨道,以及 $1.html /about.html.html 到栏杆,然后 $1 简单地发送 /about 它会转到Rails,不会命中缓存。显然,这是不正确的行为,Nginx重写了它,然后乘客也重写了它?

    1 回复  |  直到 16 年前
        1
  •  4
  •   Community Mohan Dere    9 年前

    答案就在这里: nginx rewrite rules with Passenger

    配置结果是:

    # root
    if (-f $document_root/cache/$uri/index.html) {
      rewrite (.*) /cache/$1/index.html break;
    }
    
    # pages like /about, cached with .html but accessed without
    if (-f $document_root/cache/$uri.html) {
      rewrite (.*) /cache/$1.html break;
    }
    
    # pages like /api/v1/something.xml, cached as xml
    if (-f $document_root/cache/$uri) {
      rewrite (.*) /cache/$1 break;
    }