Почему NGinX не перенаправляет на мои кэшированные файлы? - PullRequest
0 голосов
/ 23 апреля 2011

У меня есть приложение rails с поддоменами.

Я изменил расположение кэширования по умолчанию в своем приложении, чтобы шаблоны записывались в:

[app_dir] / public / cache / [поддомен] / [путь]

Итак, запрос к:

http://france.mysite.com/recipes.html

записывает:

[my_app]/public/cache/france/recipes.html

Это работает нормально, файлы записываютсяв правильное место на сервере.

Моя проблема в том, что NGinx не обслуживает эти кэшированные файлы.

Я добавил следующее в свою конфигурацию NGinx:

    # catch requests to www and remove the 'www'
    server {
      server_name www.mysite.com;
      rewrite ^ $scheme://mysite.com$request_uri permanent;
    }


    server {
      server_name mysite.com *.mysite.com;

      access_log /home/deploy/mysite/staging/current/log/access.log;
      error_log /home/deploy/mysite/staging/current/log/error.log;

      root   /home/deploy/mysite/staging/current/public;

      passenger_enabled on;
      rails_env staging;

      client_max_body_size 400M;
      client_body_buffer_size 128k;

        if (-f $request_filename) {
          break;
        }

        # Check / files with index.html
        if (-f $document_root/cache/$host/$uri/index.html) {
          rewrite (.*) /cache/$host/$1/index.html break;
        }

        # Check the path + .html
        if (-f $document_root/cache/$host/$uri.html) {
          rewrite (.*) /cache/$host/$1.html break;
        }

        # Check directly
        if (-f $document_root/cache/$host/$uri) {
          rewrite (.*) /cache/$host/$1 break;
        }


    }

Может кто-нибудь указать, где я ошибся?: /

1 Ответ

0 голосов
/ 25 апреля 2011

Таким образом, я смог решить эту проблему ...

переменная $ host в NGinx относится ко всему хосту (я ошибочно воспринял это как просто поддомен: /)

Два обходных пути:

a) Измените каталог кэша, чтобы он соответствовал полному имени хоста: http://france.mysite.com => /public/cache/france.mysite.com

b) Захватитесубдомен от хоста и используйте его в блоках if:

server {
  server_name www.mysite.com;
  rewrite ^ $scheme://mysite.com$request_uri permanent;
}


server {
  server_name mysite.com *.mysite.com;

  access_log /home/deploy/mysite/staging/current/log/access.log;
  error_log /home/deploy/mysite/staging/current/log/error.log;

  root   /home/deploy/mysite/staging/current/public;

  passenger_enabled on;
  rails_env staging;

  client_max_body_size 400M;
  client_body_buffer_size 128k;

  # if the maintenance file exists, redirect all requests to it
  if (-f $document_root/system/maintenance.html) {
    rewrite ^(.*)$ /system/maintenance.html break;
  }

  # if the host has a subdomain, set $subdomain
  if ($host ~* "(.*)\.mysite.com"){
    set $subdomain $1;
  }

  # Rewrite index.html.
  if (-f $document_root/cache/$subdomain/$uri/index.html) {
    rewrite ^(.*)$ /cache/$subdomain/$uri/index.html break;
  }

  # Rewrite other *.html requests.
  if (-f $document_root/cache/$subdomain/$uri.html) {
    rewrite ^(.*)$ /cache/$subdomain/$uri.html break;
  }

  # Rewrite everything else.
  if (-f $document_root/cache/$subdomain/$uri) {
    rewrite ^(.*)$ /cache/$subdomain/$uri break;
  }
}

Я выбрал вариант b), так как я чувствую, что он лучше

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...