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;
+ }
}
}