mod_rewrite

daz daz at uriit.ru
Sat Apr 23 09:02:37 MSD 2005


Спасибо, будем посмотреть


Andrei Nigmatulin wrote:

>В Птн, 22.04.2005, в 15:51, Alexey Bestciokov пишет:
>  
>
>>нет, этого функционанала на данный момент нет
>>но - можно обрабатывать 404 ошибку с =302 :)
>>и получать такой же результат
>>
>>d> Здравствуйте!
>>
>>d> Можно ли в nginx сделать аналог апачевского
>>
>>d> RewriteCond %{REQUEST_FILENAME} !-f
>>d> RewriteRule ^dir/(\d+).gif$ bin/script.cgi?$1 [L,QSA]
>>
>>d> т.е. Если картинки нет- она генерится скриптом, если есть - отдается с диска
>>    
>>
>
>на самом деле можно, но только с патчем, see attachment
>
>я использую это примерно в такой конфигурации :
>
>location / {
>    root /html;
>
>    if ($file_not_exists) {
>        rewrite ^/(.*)$ /proxied/$1 last;
>    }
>}
>
>location /proxied/ {
>    proxy_pass ...
>    ...
>}
>
>"it works for me" и никаких гарантий на этот хак не даю ;-)
>
>  
>
>>d> Заленский Дмитрий
>>
>>
>>
>>
>>
>>Алексей БещЈков.
>>proforg at maloletka.ru
>>    
>>
>>------------------------------------------------------------------------
>>
>>diff -burp nginx-0.1.28/src/http/modules/ngx_http_rewrite_module.c nginx-0.1.28.my/src/http/modules/ngx_http_rewrite_module.c
>>--- nginx-0.1.28/src/http/modules/ngx_http_rewrite_module.c	2005-04-08 17:59:44.000000000 +0400
>>+++ nginx-0.1.28.my/src/http/modules/ngx_http_rewrite_module.c	2005-04-17 19:45:09.000000000 +0400
>>@@ -805,6 +805,52 @@ ngx_http_rewrite_invalid_referer_code(ng
>> 
>> 
>> static void
>>+ngx_http_rewrite_file_not_exists_code(ngx_http_rewrite_engine_t *e)
>>+{
>>+    ngx_http_request_t           *r;
>>+	ngx_http_core_loc_conf_t     *clcf;
>>+	ngx_file_info_t			     fi;
>>+	ngx_str_t					 name;
>>+	u_char*						 last;
>>+
>>+	r = e->request;
>>+	clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
>>+
>>+	name.data = ngx_palloc(r->pool, clcf->root.len + r->uri.len + 2);
>>+	if (name.data == NULL) {
>>+	    e->sp->value = 1;
>>+	    e->sp->text.len = 1;
>>+	    e->sp->text.data = (u_char *) "1";
>>+	    e->sp++;
>>+
>>+		return;
>>+	}
>>+
>>+	last = ngx_cpymem(name.data, clcf->root.data, clcf->root.len);
>>+	last = ngx_cpystrn(last, r->uri.data, r->uri.len + 1);
>>+
>>+	name.len = last - name.data;
>>+
>>+	if (ngx_file_info(name.data, &fi) == NGX_FILE_ERROR) {
>>+	    e->sp->value = 1;
>>+	    e->sp->text.len = 1;
>>+	    e->sp->text.data = (u_char *) "1";
>>+	    e->sp++;
>>+	}
>>+	else {
>>+	    e->sp->value = 0;
>>+	    e->sp->text.len = 0;
>>+	    e->sp->text.data = (u_char *) "";
>>+	    e->sp++;
>>+	}
>>+
>>+	ngx_pfree(r->pool, name.data);
>>+
>>+    e->ip += sizeof(uintptr_t);
>>+}
>>+
>>+
>>+static void
>> ngx_http_rewrite_nop_code(ngx_http_rewrite_engine_t *e)
>> {
>>     e->ip += sizeof(uintptr_t);
>>@@ -953,6 +999,11 @@ ngx_http_rewrite_merge_loc_conf(ngx_conf
>>             continue;
>>         }
>> 
>>+        if (*code == (uintptr_t) &ngx_http_rewrite_file_not_exists_code) {
>>+            code++;
>>+            continue;
>>+        }
>>+
>>         if (*code == (uintptr_t) &ngx_http_rewrite_nop_code) {
>>             code++;
>>             continue;
>>@@ -1503,6 +1554,18 @@ ngx_http_rewrite_variable(ngx_conf_t *cf
>> 
>>         *code = ngx_http_rewrite_invalid_referer_code;
>> 
>>+	} else if (value->len == sizeof("file_not_exists") - 1
>>+		&& ngx_strncmp(value->data, "file_not_exists",
>>+						sizeof("file_not_exists") - 1) == 0)
>>+	{
>>+        code = ngx_http_rewrite_start_code(cf->pool, &lcf->codes,
>>+                                           sizeof(ngx_http_rewrite_code_pt));
>>+        if (code == NULL) {
>>+            return NGX_CONF_ERROR;
>>+        }
>>+
>>+        *code = ngx_http_rewrite_file_not_exists_code;
>>+
>>     } else {
>>         var = ngx_http_add_variable(cf, value, 0);
>> 
>>    
>>






More information about the nginx-ru mailing list