Quais devem ser minhas regras de reescrita do Nginx para Rails with Passenger para cache de páginas em um subdiretório?

Quais devem ser minhas regras de reescrita do Nginx para Rails with Passenger para cache de páginas em um subdiretório?

Estou usando Nginx 0.7.64, Passenger 2.2.9, Rails 2.3.5. Eu tenho meu diretório de cache de páginas definido como /public/cache e gostaria de poder servir páginas em cache quando solicitadas por HTTP, mas sempre acesse o aplicativo Rails quando solicitado por HTTPS.

A maior parte da minha configuração é assim:

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;
}

Prevejo que quando eu solicitar website.com/about, eu deveria receber /public/cache/about.html, mas em vez disso, acessei o servidor Rails (a sequência do log mostra isso).

Pensando que poderia ter uma barra inadequada (e não vendo $document_rootna maioria dos exemplos), também tentei todas as variações a seguir, nenhuma das quais funcionou:

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;
}

Também coloquei as regras root, passenger_enablede rewrite em um location /bloco separado, mas isso também não funciona. Também reordenei as declarações para que passenger_enabledaparecessem no final. Eu também tentei usar $uri. Claramente estou entendendo mal alguma coisa!

Isso é um pouco simplificado, pois também tenho uma API XML que é armazenada em cache em alguns lugares (presumivelmente a regra de reescrita será a mesma, exceto para as .htmlpartes), e também precisarei servir public/cache/index.htmlquando a raiz website.comfor solicitada. Eu só quero que qualquer peça funcione. :)

Qualquer ajuda é apreciada!

Atualizar

O condicional

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

Parece funcionar! No entanto, o que eu pensaria que seria a reescrita não funciona! Tentando

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

Reescreve a URL como /cache/cache/about.html.htmle a envia para Rails, que imediatamente vomita. Parece duplicado, sim! Mas se eu reescrever apenas /cache$1ele envia /cache/cache/aboutpara o Rails, e $1.htmlenvia /about.html.htmlpara o Rails, e apenas $1envia simplesmente /abouto que vai para o Rails e não atinge o cache. Obviamente, este não é um comportamento correto. O Nginx está reescrevendo e o Passenger também está reescrevendo?

Responder1

A resposta foi encontrada aqui: https://stackoverflow.com/questions/1177979/nginx-rewrite-rules-with-passenger

A configuração acabou sendo:

# 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;
}

Responder2

try_filesversão:

server {
  listen 80;
  server_name website.com www.website.com;
  location / {
    root /home/deploy/website/current/public;
    try_files $uri /cache/$uri/index.html /cache/$uri.html /cache/$uri @passenger;
  }
  location @passenger {
    root /home/deploy/website/current/public;
    proxy_set_header X-Forwarded-Proto http;
    passenger_enabled on;
  }
}

observe que pode ou não funcionar com o passageiro. Tenho certeza que funciona com unicórnio, vira-lata, etc.

informação relacionada