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

Igor Sysoev is at rambler-co.ru
Mon Jul 11 20:07:14 MSD 2005


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)...

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


Игорь Сысоев
http://sysoev.ru
-------------- next part --------------
--- 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	Mon Jul 11 20:01:54 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,37 @@
         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 = uri.data;
+
+                p = ngx_palloc(r->pool, len);
+                if (p == NULL) {
+                    return NGX_HTTP_SSI_ERROR;
+                }
+
+                uri.len = len;
+                uri.data = p;
+
+                p = ngx_cpymem(p, r->uri.data, prefix);
+                p = ngx_cpymem(p, data, len);
+            }
         }
     }
 


More information about the nginx-ru mailing list