對於 Rails with Passenger 在子目錄中進行頁面緩存,我的 Nginx 重寫規則應該是什麼?

對於 Rails with Passenger 在子目錄中進行頁面緩存,我的 Nginx 重寫規則應該是什麼?

我正在使用 Nginx 0.7.64、Passenger 2.2.9、Rails 2.3.5。我將頁面快取目錄設定為 /public/cache,並且我希望能夠在透過 HTTP 請求時提供快取頁面,但在透過 HTTPS 請求時始終點擊 Rails 應用程式。

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

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

我還將rootpassenger_enabled和 重寫規則放入單獨的location /區塊中,但這也不起作用。我還對這些陳述進行了重新排序,以便passenger_enabled將其放在最後。我也嘗試過使用$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到 Rails,然後$1.html發送/about.html.html到 Rails,然後僅$1發送/about到 Rails 並且不會命中快取。顯然這不是正確的行為 Nginx 重寫它然後 Passenger 也重寫它嗎?

答案1

答案在這裡找到: https://stackoverflow.com/questions/1177979/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;
}

答案2

try_files版本:

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

請注意,它可能適用於乘客,也可能不適用於乘客。我確信它適用於獨角獸、雜種等。

相關內容