Nginx + пассажир + рельсы: ошибка 405 по запросу - PullRequest
2 голосов
/ 24 марта 2011

У меня ошибка 405, когда я вызываю пост-запрос к действию контроллера rails.Запрос post используется для получения файла json, а запрос get доставляет стандартную HTML-страницу.Проблема в том, что html кэшируется.

Я видел решение этой проблемы на http://millarian.com/programming/ruby-on-rails/nginx-405-not-allowed-error/

if ($request_method != GET) {
  proxy_pass http://foobar;
  break;
}

URL-адрес в proxy_pass обычно является URL-адресом для сервера mongrel,Есть ли подобное решение для пассажира?

Я полный новичок nginx, пытаюсь перейти с apache.

1 Ответ

2 голосов
/ 25 марта 2011

Я наконец нашел способ обойти. У меня был набор условий перезаписи для работы с каталогом кэша, который использует моя конфигурация Rails.

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

...

Эти переписывания были применены, даже если запрос был POST, что привело к ошибке 405.

Мне удалось применить переписать, только если запрос является GET. Я не уверен, что это самое эффективное решение, но, похоже, оно работает. Научиться справляться с множественными условиями в Nginx было самой сложной задачей. (источник: http://wiki.nginx.org/RewriteMultiCondExample)

set $dest "";

if ($request_method = GET) {
    set $dest "/cache";
}
# Check / files with index.html
if (-f $document_root/cache/$uri/index.html) {
  set $dest $dest/$uri/index.html ;
}

# Check the path + .html
if (-f $document_root/cache/$uri.html) {
  set $dest $dest/$uri.html ;
}

# Check directly
if (-f $document_root/cache/$uri) {
  set $dest $dest/$uri ;
}

if ($dest ~* ^/cache/(.*)$) {
    rewrite (.*) $dest break;
}

Есть ли лучшее решение?

...