Баг с location в nginx-devel-0.7.42 ?

Igor Sysoev is at rambler-co.ru
Wed Mar 18 09:03:20 MSK 2009


On Wed, Mar 18, 2009 at 12:12:22AM +0200, Konstantin Belov wrote:

> Igor Sysoev wrote:
> >On Tue, Mar 17, 2009 at 05:56:39PM +0200, Konstantin Belov wrote:
> >
> >  
> >>Борис Долгов wrote:
> >>    
> >>>Судя по всему, баг с определением директорий, в 0.7.40 было изменение.
> >>>
> >>>17 марта 2009 г. 18:19 пользователь Konstantin Belov 
> >>><belov1985 at gmail.com <mailto:belov1985 at gmail.com>> написал:
> >>>
> >>>   Борис Долгов wrote:
> >>>
> >>>       А 0.7.39 работает?
> >>>
> >>>       17 марта 2009 г. 17:39 пользователь Konstantin Belov
> >>>       <belov1985 at gmail.com <mailto:belov1985 at gmail.com>
> >>>       <mailto:belov1985 at gmail.com <mailto:belov1985 at gmail.com>>>
> >>>       написал:
> >>>
> >>>
> >>>          Борис Долгов wrote:
> >>>
> >>>              А какая ФС?
> >>>
> >>>          Система FreeBSD 7.0, fs - UFS.
> >>>
> >>>          Только не думаю, что проблема в ней. Т. к. на nginx 0.6.35 и
> >>>          0.7.33 (да и на всех старых версиях)
> >>>          работает нормально. Никаких правок в движок сайта (DLE) и в
> >>>       конфиг
> >>>          nginx не вносилось уже давно.
> >>>          Появилось именно при обновлении до 0.7.42.
> >>>
> >>>
> >>>
> >>>
> >>>       -- 
> >>>       С уважением, Борис Долгов.
> >>>       icq 77556665
> >>>       e-mail boris at dolgov.name <mailto:boris at dolgov.name>
> >>>       <mailto:boris at dolgov.name <mailto:boris at dolgov.name>>
> >>>
> >>>   telnet 80.93.57.177 80
> >>>   Trying 80.93.57.177...
> >>>   Connected to gr3.p8.ru <http://gr3.p8.ru>.
> >>>   Escape character is '^]'.
> >>>   GET /img/topbox_01.gif HTTP/1.0
> >>>   host: news.ereality.ru <http://news.ereality.ru>
> >>>
> >>>   HTTP/1.1 200 OK
> >>>   Server: nginx/0.7.39
> >>>   Date: Tue, 17 Mar 2009 15:17:21 GMT
> >>>
> >>>   Content-Type: image/gif
> >>>   Content-Length: 67
> >>>   Last-Modified: Mon, 18 Aug 2008 16:44:25 GMT
> >>>   Connection: close
> >>>   Expires: Thu, 16 Apr 2009 15:17:21 GMT
> >>>
> >>>   Cache-Control: max-age=2592000
> >>>   Accept-Ranges: bytes
> >>>
> >>>   GIF89????????????????!?H???";
> >>>   Connection closed by foreign host.
> >>>
> >>>
> >>>   Да, все отлично работает.
> >>>
> >>>
> >>>   /usr/local/sbin/nginx739 -V
> >>>   nginx version: nginx/0.7.39
> >>>   built by gcc 4.2.1 20070719  [FreeBSD]
> >>>
> >>>   configure arguments: --prefix=/usr/local/etc/nginx
> >>>   --with-cc-opt=-I/usr/local/include --with-ld-opt=-L/usr/local/lib
> >>>   --conf-path=/usr/local/etc/nginx/nginx.conf
> >>>   --sbin-path=/usr/local/sbin/nginx --pid-path=/var/run/nginx.pid
> >>>   --error-log-path=/var/log/nginx-error.log --user=www --group=www
> >>>   --http-client-body-temp-path=/var/tmp/nginx/client_body_temp
> >>>   --http-proxy-temp-path=/var/tmp/nginx/proxy_temp
> >>>   --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi_temp
> >>>   --http-log-path=/var/log/nginx-access.log --with-http_ssl_module
> >>>   --with-http_stub_status_module --with-http_sub_module
> >>>   --add-module=/usr/ports/www/nginx-devel/work/nginx_upload_module-2.0.8
> >>>   --add-module=/usr/ports/www/nginx-devel/work/ngx_http_upstream_keepalive-0.1
> >>>
> >>>
> >>>
> >>>
> >>>-- 
> >>>С уважением, Борис Долгов.
> >>>icq 77556665
> >>>e-mail boris at dolgov.name <mailto:boris at dolgov.name>
> >>>      
> >>Igor Sysoev wrote:
> >>    
> >>>Изменения в nginx 0.7.40                                          
> >>>09.03.2009
> >>>
> >>>   *) Изменение: модуль ngx_http_autoindex_module не показывал последний 
> >>>      слэш для каталогов на файловой системе XFS; ошибка появилась в 
> >>>      0.7.15.
> >>>      Спасибо Дмитрию Кузьменко.
> >>> 
> >>>      
> >>Да, возможно в этом и есть ошибка :)
> >>    
> >
> >А 0.7.40 не работает ? Я пока не могу воспроизвести.
> >
> >
> >  
> Собрал nginx 0.7.42 дома под Mac OS X
> Ошибка появляется при использовании переменных в root и location с 
> regex  (location ~* \.(foo|bar)$ {)
> 
> Конфиг:
> server {
>        listen 127.0.0.1:81;
> 
>        location ~* \.(var)$ {
>            root /usr/home/www;
>            expires      30d;
>        }
> 
> }
> 
> 
> $ telnet 127.0.0.1 81
> Trying 127.0.0.1...
> Connected to macbook.home.
> Escape character is '^]'.
> GET /test.var HTTP/1.0
> 
> HTTP/1.1 200 OK
> Server: nginx/0.7.42
> Date: Tue, 17 Mar 2009 21:56:00 GMT
> Content-Type: application/octet-stream
> Content-Length: 5
> Last-Modified: Tue, 17 Mar 2009 21:52:38 GMT
> Connection: close
> Expires: Thu, 16 Apr 2009 21:56:00 GMT
> Cache-Control: max-age=2592000
> Accept-Ranges: bytes
> 
> test
> Connection closed by foreign host.
> 
> 
> 
> 
> А вот при таком конфиге получаем ошибку:
> 
> 
> Конфиг:
> server {
>        listen 127.0.0.1:81;
> 
>        set $var "/usr/home/www";
> 
>        location ~* \.(var)$ {
>            root         $var;
>            expires      30d;
>        }
> 
> }
> 
> 
> $ telnet 127.0.0.1 81
> Trying 127.0.0.1...
> Connected to macbook.home.
> Escape character is '^]'.
> GET /test.var HTTP/1.0
> 
> HTTP/1.1 404 Not Found
> Server: nginx/0.7.42
> Date: Tue, 17 Mar 2009 21:53:57 GMT
> Content-Type: text/html
> Content-Length: 169
> Connection: close
> 
> <html>
> <head><title>404 Not Found</title></head>
> <body bgcolor="white">
> <center><h1>404 Not Found</h1></center>
> <hr><center>nginx/0.7.42</center>
> </body>
> </html>
> Connection closed by foreign host.
> 
> 
> В логе ошибок:
> 2009/03/17 23:53:57 [error] 6063#0: *9 open() "/usr/home/www/te" failed 
> (2: No such file or directory), client: 127.0.0.1, server: macbook.home, 
> request: "GET /test.var HTTP/1.0"
> 
> Правда под макосью nginx возвращает 404, а не 301 :)

Прилагаемый патч должен исправить эту ошибку, и возможно, редирект.

> Кстати, при ручной сборке nginx740 -V
> nginx version: nginx/0.7.40
> built by gcc 4.2.1 20070719  [FreeBSD]
> configure arguments: --prefix=/usr/local/etc/nginx 
> --with-cc-opt=-I/usr/local/include --with-ld-opt=-L/usr/local/lib 
> --conf-path=/usr/local/etc/nginx/nginx740.conf 
> --sbin-path=/usr/local/sbin/nginx740 --pid-path=/var/run/nginx740.pid 
> --error-log-path=/var/log/nginx-error.log --user=www --group=www 
> --http-client-body-temp-path=/var/tmp/nginx/client_body_temp 
> --http-proxy-temp-path=/var/tmp/nginx/proxy_temp 
> --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi_temp 
> --http-log-path=/var/log/nginx-access.log --with-http_ssl_module 
> --with-http_stub_status_module --with-http_sub_module 
> --add-module=/usr/ports/www/nginx-devel/work/nginx_upload_module-2.0.8 
> --add-module=/usr/ports/www/nginx-devel/work/ngx_http_upstream_keepalive-0.1
> 
> я явно указал конфиг /usr/local/etc/nginx/nginx740.conf, но в итоге 
> после make install у меня перезаписался /usr/local/etc/nginx/nginx.conf :(

Спасибо, посмотрю.

> P. S. рут задается переменными, потому что так легче управлять 
> конфигурацией при большом кол-ве шаблоных хостов.


-- 
Игорь Сысоев
http://sysoev.ru
-------------- next part --------------
Index: src/http/ngx_http_core_module.c
===================================================================
--- src/http/ngx_http_core_module.c	(revision 1891)
+++ src/http/ngx_http_core_module.c	(working copy)
@@ -1688,7 +1688,9 @@
         last = ngx_copy(path->data, clcf->root.data, clcf->root.len);
 
     } else {
-        if (ngx_http_script_run(r, path, clcf->root_lengths->elts, ++reserved,
+        reserved += alias ? 1 : r->uri.len + 1;
+
+        if (ngx_http_script_run(r, path, clcf->root_lengths->elts, reserved,
                                 clcf->root_values->elts)
             == NULL)
         {


More information about the nginx-ru mailing list