Added a "fallback" option to be used with the "share" action.
It allows proceeding to another action if a file isn't available.
An example:
{
"share": "/data/www/",
"fallback": {
"pass": "applications/php"
}
}
In the example above, an attempt is made first to serve a request with
a file from the "/data/www/" directory. If there's no such file, the
request is passed to the "php" application.
Fallback actions may be nested:
{
"share": "/data/www/",
"fallback": {
"share": "/data/cache/",
"fallback": {
"proxy": "http://127.0.0.1:9000"
}
}
}
This commit is contained in:
@@ -49,6 +49,10 @@ nxt_http_static_handler(nxt_task_t *task, nxt_http_request_t *r,
|
||||
if (nxt_slow_path(!nxt_str_eq(r->method, "GET", 3))) {
|
||||
|
||||
if (!nxt_str_eq(r->method, "HEAD", 4)) {
|
||||
if (action->u.fallback != NULL) {
|
||||
return action->u.fallback;
|
||||
}
|
||||
|
||||
nxt_http_request_error(task, r, NXT_HTTP_METHOD_NOT_ALLOWED);
|
||||
return NULL;
|
||||
}
|
||||
@@ -123,6 +127,10 @@ nxt_http_static_handler(nxt_task_t *task, nxt_http_request_t *r,
|
||||
break;
|
||||
}
|
||||
|
||||
if (level == NXT_LOG_ERR && action->u.fallback != NULL) {
|
||||
return action->u.fallback;
|
||||
}
|
||||
|
||||
if (status != NXT_HTTP_NOT_FOUND) {
|
||||
nxt_log(task, level, "open(\"%FN\") failed %E", f->name, f->error);
|
||||
}
|
||||
@@ -222,8 +230,13 @@ nxt_http_static_handler(nxt_task_t *task, nxt_http_request_t *r,
|
||||
nxt_file_close(task, f);
|
||||
|
||||
if (nxt_slow_path(!nxt_is_dir(&fi))) {
|
||||
if (action->u.fallback != NULL) {
|
||||
return action->u.fallback;
|
||||
}
|
||||
|
||||
nxt_log(task, NXT_LOG_ERR, "\"%FN\" is not a regular file",
|
||||
f->name);
|
||||
|
||||
nxt_http_request_error(task, r, NXT_HTTP_NOT_FOUND);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user