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