try_files и индексы

Алексей Бондарь alexey.bondar at gmail.com
Mon Jan 19 01:39:05 MSK 2009


Доброй ночи,

Решил обновится с версии 0.6.34 до 0.7.30 и  
попутно избавится от кучи if'ов в пользу  
try_files. Nginx проксирует apache с passenger (mod_rails).

Получился следующий конфиг:

server {
   listen 80;
   server_name host.ru;
   root /home/user/public;
   access_log /home/user/log/access.log;
   error_log /home/user/log/error.log debug;
   error_page   500 502 503 504 /500.html;
   client_max_body_size 50M;
   log_not_found on;

location / {
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     proxy_set_header Host $http_host;
     proxy_max_temp_file_size 0;

     try_files      /system/maintenance.html
                    $uri  $uri/index.html  $uri.html
                    @apache;
}

location @apache {
proxy_pass http://127.0.0.1:8080;
}
}

И теперь, в случае если клиент заходит  
по адресу http://host.ru/, а в root нет  
индексного файла, он получает 403. То-же  
самое происходит если в root есть  
директория, но в ней так-же нет  
индексного файла (http://host.ru/some/). Что  
несколько ломает файловое кеширование  
в Rails.

В логи при уровне debug пишется следующее:
2009/01/18 14:03:16 [error] 16996#0: *413520 directory index of "/home/ 
user/public/" is forbidden

Если после try_files добавить условие:

if (!-f $request_filename) {
         proxy_pass http://127.0.0.1:8080;
         break;
}

Всё работает как надо и запрос в этом  
случае проксируется к бэкэнду.

Так и должно быть? В документации  
сказано что try_files в случае если файл  
найден небыл должен делать редирект на  
последний параметр, по логике это  
должно относится и к индексам.

Спасибо.




More information about the nginx-ru mailing list