Баг try_files + valid_referers

Андрей Василишин a.vasilishin at kpi.ua
Thu Aug 29 11:47:01 UTC 2013


         location / {
             index  index.php index.htm index.html;
             root   /var/www/site.com;
             try_files $uri
                 $uri/
                 /index.php?q=$uri&$args
                 @backend;
                 rewrite 
"^/([^\/]+/[^\/]+)/((s[\d]+)?(e[\d]+){1}(\-[\d]+)*)$" /$1.html?serie=$2;
                 rewrite ([^\/]+/[^\/]+.html)/$ /$1 permanent;
                 rewrite (tag/[^\/]+)/$ /$1 permanent;
                 valid_referers none server_names 
~(yandex|google|yahoo|bing|facebook|fbcdn|mail.ru|rambler|nigma|vk.com);
                 if ($invalid_referer) {
                         access_log  /var/log/nginx/site.com.invalid.log 
  main;
                 }
                 if ($a) {
                         access_log 
/var/log/nginx/a.site.com.access.log  main;
                 }

         }


Почему-тоЮ, если приходит запрос с реферером, которого нет в 
valid_referers, try_files почему-то проверяет только $uri и потом 
возвращает сразу 404:

2013/08/29 11:06:34 [debug] 7188#0: *1851357643 http script var
2013/08/29 11:06:34 [debug] 7188#0: *1851357643 http script var: "1"
2013/08/29 11:06:34 [debug] 7188#0: *1851357643 http script if
2013/08/29 11:06:34 [debug] 7188#0: *1851357643 http script var
2013/08/29 11:06:34 [debug] 7188#0: *1851357643 http geo started: 
176.104.57.123
2013/08/29 11:06:34 [debug] 7188#0: *1851357643 http geo:
2013/08/29 11:06:34 [debug] 7188#0: *1851357643 http script var: ""
2013/08/29 11:06:34 [debug] 7188#0: *1851357643 http script if
2013/08/29 11:06:34 [debug] 7188#0: *1851357643 http script if: false
2013/08/29 11:06:34 [debug] 7188#0: *1851357643 post rewrite phase: 4
2013/08/29 11:06:34 [debug] 7188#0: *1851357643 generic phase: 5
2013/08/29 11:06:34 [debug] 7188#0: *1851357643 generic phase: 6
2013/08/29 11:06:34 [debug] 7188#0: *1851357643 generic phase: 7
2013/08/29 11:06:34 [debug] 7188#0: *1851357643 access phase: 8
2013/08/29 11:06:34 [debug] 7188#0: *1851357643 access phase: 9
2013/08/29 11:06:34 [debug] 7188#0: *1851357643 post access phase: 10

2013/08/29 11:06:34 [debug] 7188#0: *1851357643 try files phase: 11
2013/08/29 11:06:34 [debug] 7188#0: *1851357643 content phase: 12
2013/08/29 11:06:34 [debug] 7188#0: *1851357643 content phase: 13
2013/08/29 11:06:34 [debug] 7188#0: *1851357643 content phase: 14
2013/08/29 11:06:34 [debug] 7188#0: *1851357643 http filename: 
"/var/www/site.com/series/univer-novaya-obschaga-serial.html"
2013/08/29 11:06:34 [debug] 7188#0: *1851357643 add cleanup: 
00000000019C3E58
2013/08/29 11:06:34 [error] 7188#0: *1851357643 open() 
"/var/www/site.com/series/univer-novaya-obschaga-serial.html" failed (2: 
No such file or directory), client: 176.104.57.123, server: site.com, 
request: "GET /series/univer-novaya-obschaga-serial.html HTTP/1.1", 
host: "site.com", referrer: 
"http://www.top-page.ru/ya/?q=%D0%BD%D0%BE%D0%B2%D0%B0%D1%8F+%D0%BE%D0%B1%D1%89%D0%B0%D0%B3%D0%B0+%D0%BD%D0%BE%D0%B2%D1%8B%D0%B5+%D1%81%D0%B5%D1%80%D0%B8%D0%B8+%D1%81%D0%BC%D0%BE%D1%82%D1%80%D0%B5%D1%82%D1%8C+%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD"
2013/08/29 11:06:34 [debug] 7188#0: *1851357643 http finalize request: 
404, "/series/univer-novaya-obschaga-serial.html?" a:1, c:1
2013/08/29 11:06:34 [debug] 7188#0: *1851357643 http special response: 
404, "/series/univer-novaya-obschaga-serial.html?"
2013/08/29 11:06:34 [debug] 7188#0: *1851357643 internal redirect: 
"/errors/404.html?"


Если закомментировать строки:
                 valid_referers none server_names 
~(yandex|google|yahoo|bing|facebook|fbcdn|mail.ru|rambler|nigma|vk.com);
                 if ($invalid_referer) {
                         access_log  /var/log/nginx/site.com.invalid.log 
  main;

  все идет как надо, то есть доходит до /index.php?q=$uri&$args

# nginx -V
nginx version: nginx/1.2.4
configure arguments: --prefix=/etc/nginx 
--conf-path=/etc/nginx/nginx.conf 
--error-log-path=/var/log/nginx/error.log 
--http-client-body-temp-path=/var/lib/nginx/body 
--http-fastcgi-temp-path=/var/lib/nginx/fastcgi 
--http-log-path=/var/log/nginx/access.log 
--http-proxy-temp-path=/var/lib/nginx/proxy 
--lock-path=/var/lock/nginx.lock --pid-path=/var/run/nginx.pid 
--with-debug --with-file-aio --with-http_flv_module 
--with-http_geoip_module --with-http_mp4_module 
--with-http_realip_module --with-http_secure_link_module 
--with-http_stub_status_module --without-http_scgi_module 
--without-http_split_clients_module --without-http_ssi_module 
--without-http_userid_module --without-http_uwsgi_module

Ну, и чтоб два раза не вставать: какой альтернативный способ писать 
отдельный лог для invalid_referer?



Подробная информация о списке рассылки nginx-ru