Ruby on rails nginx try_文件:在尝试添加扩展名并退回到乘客/轨道时为404

Ruby on rails nginx try_文件:在尝试添加扩展名并退回到乘客/轨道时为404,ruby-on-rails,nginx,passenger,Ruby On Rails,Nginx,Passenger,我正在为正确的nginx声明而挣扎。 我想做的事情相当简单:对于*.public.domain.com的任何请求,我想查找一个缓存文件,如果一个文件不可用,请将请求发送给乘客/Rails进行处理 缓存文件(如果存在)附加了.html,以防止目录/文件冲突,因此/test应查找/test.html,/test/2应查找/test/2.html 缓存文件特定于子域,因此abc.public.domain.com应查看/sites/abc文件夹 以下是相关的nginx代码: server {

我正在为正确的
nginx
声明而挣扎。
我想做的事情相当简单:对于
*.public.domain.com
的任何请求,我想查找一个缓存文件,如果一个文件不可用,请将请求发送给乘客/Rails进行处理

缓存文件(如果存在)附加了
.html
,以防止目录/文件冲突,因此
/test
应查找
/test.html
/test/2
应查找
/test/2.html

缓存文件特定于子域,因此
abc.public.domain.com
应查看
/sites/abc
文件夹

以下是相关的nginx代码:

    server {
      # listen/SSL stuff removed for brevity

      server_name *.public.domain.com;

      location ~ "^(.*)\.public\.domain\.com" {
        root /var/applications/app/current/sites/$1;
        try_files $request_uri.html $request_uri/index.html @passenger;
      }

      location @passenger {
          root /var/applications/app/current/public;
          passenger_enabled on;
          passenger_user www-data;
      }
    }
在我的日志文件中,我看到nginx正在尝试加载扩展名为.html的文件。例如,我看到:
/var/applications/app/current/sites/abc/test”失败(2:没有这样的文件或目录)
,但没有尝试加载
test.html
。因此,子域正则表达式和根声明似乎工作正常;添加扩展名则不行

这就是问题1

问题2是,在找不到文件时,nginx并没有退回到
@passenger;
它抛出了一个404,而不是让Rails处理请求并提供文件本身


有没有关于我做错了什么的想法?我已经读了很多关于
nginx
配置的书,但不知道哪里出了错。

好的,看起来在做了很多修改之后,我已经成功地让它工作了。下面是更新的代码:

server {
  # listen/SSL stuff removed for brevity

  server_name *.public.domain.com;

  #location ~ "^(.*)\.public\.domain\.com" {
  #  root /var/applications/app/current/sites/$1;
  #  try_files $request_uri.html $request_uri/index.html @passenger;
  #}

  if ($host ~ "^(.*)\.public\.domain\.com" ) { set $subdomain $1; }
  root /var/applications/app/current/sites/$subdomain/;
  try_files $request_uri.html $request_uri/index.html @passenger;

  location @passenger {
      root /var/applications/app/current/public;
      passenger_enabled on;
      passenger_user www-data;
  }
}
我已经注释掉了旧代码,以便于参考,以防这对其他人有用。两个更改似乎已经完成了这一任务:

  • 我在
    root
    中添加了一个尾随斜杠。我在阅读的任何(许多)示例中都没有看到这样做,但在这里似乎是必要的。(这也很奇怪,因为在nginx找到正确的位置之前,减去扩展名,所以我不确定它为什么会有不同,但我不会看一个礼物马的嘴。)
  • 我删除了位置块。我无法确定发生了什么,但nginx似乎会在处理位置块中的
    try\u文件
    之前尝试加载与$request\u uri匹配的文件,但在该块之外,它会在尝试加载不存在的文件之前处理
    try\u文件
  • 作为记录,我正在反向代理此服务器,这可能与我的问题有关。之前的版本中有一个nginx bug,它与
    try\u files
    中的
    request\u uri
    有关(如果与您相关,请查看更改日志)但它们应该在最新版本中修复,我现在正在运行

    有可能我在这里犯了一些基本的错误,我很幸运地得到了一个可用的版本,但我想我会记录下来,以防它对其他人有用