В Птн, 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@xxxxxxxxxxxx
------------------------------------------------------------------------
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);