我使用的是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; }
我也抛出了root , passenger_enabled和重写规则到一个单独的location /块,但这也行不通。 我也重新排列了这个语句,这样passenger_enabled才会到头来。 我也试过使用$uri 。 显然我误解了一些东西!
这有点简单,因为我也有一个caching在地方的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,并及时地发送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兽,杂种等一起使用。