¿Cuáles deberían ser mis reglas de reescritura de Nginx para Rails with Passenger para el almacenamiento en caché de páginas en un subdirectorio?

¿Cuáles deberían ser mis reglas de reescritura de Nginx para Rails with Passenger para el almacenamiento en caché de páginas en un subdirectorio?

Estoy usando Nginx 0.7.64, Passenger 2.2.9, Rails 2.3.5. Tengo el directorio de almacenamiento en caché de mi página configurado en /public/cache y me gustaría poder servir páginas en caché cuando se solicitan a través de HTTP, pero siempre accedo a la aplicación Rails cuando se solicita a través de HTTPS.

La mayor parte de mi configuración se ve así:

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

Anticipo que cuando solicito website.com/about, debería recibir /public/cache/about.html, pero en lugar de eso accedo al servidor Rails (el seguimiento del registro lo muestra).

Pensando que podría tener una barra diagonal inapropiada (y no la veo $document_rooten la mayoría de los ejemplos), también probé todas las siguientes variaciones, ninguna de las cuales funciona:

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

También he incluido las reglas root, passenger_enabledy reescritura en un location /bloque separado, pero eso tampoco funciona. También reordené las declaraciones para que passenger_enabledaparecieran al final. También intenté usar $uri. ¡Claramente estoy entendiendo mal algo!

Esto está un poco simplificado, ya que también tengo una API XML que se almacena en caché en algunos lugares (presumiblemente, la regla de reescritura será la misma excepto por las .htmlpartes), y también tendré que servir cuando se solicite public/cache/index.htmlla raíz . website.comSolo quiero que funcione cualquier pieza. :)

¡Cualquier ayuda es apreciada!

Actualizar

El condicional

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

¡Parece funcionar! Sin embargo, lo que creo que sería la reescritura no funciona. Intentando

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

Reescribe la URL /cache/cache/about.html.htmly la envía a Rails, que rápidamente vomita. Parece duplicado, ¡sí! Pero si reescribo solo /cache$1lo envía /cache/cache/abouta Rails, y $1.htmllo envía /about.html.htmla Rails, y simplemente $1envía /aboutlo que va a Rails y no llega al caché. Obviamente, este no es un comportamiento correcto. ¿Nginx lo está reescribiendo y luego Passenger también lo está reescribiendo?

Respuesta1

La respuesta se encontró aquí: https://stackoverflow.com/questions/1177979/nginx-rewrite-rules-with-passenger

La configuración terminó siendo:

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

Respuesta2

try_filesversión:

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

tenga en cuenta que podría funcionar o no con el pasajero. Sin embargo, estoy seguro de que funciona con unicornios, mestizos, etc.

información relacionada