Игорь, можно ли в 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
--- 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);
+ }
}
}