ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: ssi и относительный путь



On Mon, 11 Jul 2005, Roman Veretelnikov wrote:

IS> On Mon, 11 Jul 2005, Roman Veretelnikov wrote:

 Игорь, можно ли в ssi файлах использовать относительный путь в
 <!--#include virtual...-> ?
 Сейчас nginx, судя по логам, ищет эти файлы в /usr/local/nginx/html
 игнорируя root для location
 Кусок конфига:
server {
   listen  8080;
...
   location /ssi/ { root /home/user/site.ru/www; ssi on;}
...
}

при использовании <!--#include virtual="/header.inc"--> все нормально

если же делать <!--#include virtual="../header.inc"--> в файле
/home/user/site.ru/www/ssi/test.shtml

то вместо хеадера вставляется 404 Not Found и в логах:
2005/07/11 17:00:07 [error] 12377#0: *7620624 open()
"/usr/local/nginx/html../header.inc" failed (2: No such file or
directory)...

IS> Есть такая проблема, прилагаемый патч решает её.

После наложения патчей patch.nginx-0.1.38.4.txt и
patch.nginx-0.1.38.5.txt на nginx-0.1.38 в логах стало появляться:

*** glibc detected *** nginx: worker process: corrupted double-linked list: 
0x09df8de0 ***
======= Backtrace: =========
/lib/libc.so.6[0x982548]
/lib/libc.so.6(__libc_free+0x77)[0x98295f]

2005/07/11 22:12:14 [alert] 16413#0: worker process 16684 exited on signal 6

система Fedora Core 4, gcc version 4.0.0 20050519 (Red Hat 4.0.0-8)
грешил на опции оптимизации, но без них все так же
nginx-0.1.37 работает отлично, "чистый" 0.1.38 не пробовал
посмотрел предыдущие патчи: вроде не должны влиять

В patch.nginx-0.1.38.5.txt ошибка. Высылаю patch.nginx-0.1.38.6.txt,
который нужно использовать вместо 5.txt.


Игорь Сысоев
http://sysoev.ru
--- src/http/modules/ngx_http_ssi_filter_module.c       Fri Jun 24 19:42:03 2005
+++ src/http/modules/ngx_http_ssi_filter_module.c       Tue Jul 12 05:43:32 2005
@@ -1373,8 +1373,8 @@
 ngx_http_ssi_include(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx,
     ngx_str_t **params)
 {
-    u_char                      ch, *p, **value;
-    size_t                     *size, len;
+    u_char                      ch, *p, **value, *data;
+    size_t                     *size, len, prefix;
     ngx_uint_t                  i, j, n, bracket;
     ngx_str_t                   uri, args, name;
     ngx_array_t                 lengths, values;
@@ -1385,6 +1385,7 @@
     uri = *params[NGX_HTTP_SSI_INCLUDE_VIRTUAL];
     args.len = 0;
     args.data = NULL;
+    prefix = 0;
 
     n = ngx_http_script_variables_count(&uri);
 
@@ -1497,6 +1498,24 @@
             *value = name.data;
         }
 
+        size = lengths.elts;
+        value = values.elts;
+
+        for (i = 0; i < values.nelts; i++) {
+            if (size[i] != 0) {
+                if (*value[i] != '/') {
+                    for (prefix = r->uri.len; prefix; prefix--) {
+                        if (r->uri.data[prefix - 1] == '/') {
+                            len += prefix;
+                            break;
+                        }
+                    }
+                }
+
+                break;
+            }
+        }
+
         p = ngx_palloc(r->pool, len);
         if (p == NULL) {
             return NGX_HTTP_SSI_ERROR;
@@ -1505,11 +1524,36 @@
         uri.len = len;
         uri.data = p;
 
-        size = lengths.elts;
-        value = values.elts;
+        if (prefix) {
+            p = ngx_cpymem(p, r->uri.data, prefix);
+        }
 
         for (i = 0; i < values.nelts; i++) {
             p = ngx_cpymem(p, value[i], size[i]);
+        }
+
+    } else {
+        if (uri.data[0] != '/') {
+            for (prefix = r->uri.len; prefix; prefix--) {
+                if (r->uri.data[prefix - 1] == '/') {
+                    break;
+                }
+            }
+
+            if (prefix) {
+                len = prefix + uri.len;
+
+                data = ngx_palloc(r->pool, len);
+                if (data == NULL) {
+                    return NGX_HTTP_SSI_ERROR;
+                }
+
+                p = ngx_cpymem(data, r->uri.data, prefix);
+                ngx_memcpy(p, uri.data, uri.len);
+
+                uri.len = len;
+                uri.data = data;
+            }
         }
     }
 


 




Copyright © Lexa Software, 1996-2009.