我的Nginx的重写规则应该是什么Rails与乘客的页面caching在一个子目录?

我使用的是Nginx 0.7.64,Passenger 2.2.9,Rails 2.3.5。 我有我的页面caching目录设置为/公共/caching,我希望能够提供caching页面时,通过HTTP请求,但总是击中Rails应用程序通过HTTPS请求时。

我的configuration大部分是这样的:

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 。 显然我误解了一些东西!

这有点简单,因为我也有一个caching在地方的XML API(大概重写规则将是相同的,除了.html部分),以及我将需要public/cache/index.htmlwebsite.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,并及时地发送barfs。 它看起来翻倍了,是的! 但是,如果我重写只是/cache$1它发送/cache/cache/about Rails和$1.html发送/about.html.html到Rails,只是$1简单地发送到Rails,并没有打到caching。 显然这是不正确的行为是Nginx重写它,然后乘客也重写它呢?

答案是在这里find: https : //stackoverflow.com/questions/1177979/nginx-rewrite-rules-with-passenger

configuration结束了:

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

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

请注意,它可能会或可能不会与乘客工作。 不过,我相信它可以和独angular兽,杂种等一起使用。