mirror of
https://github.com/nginx/nginx.git
synced 2025-06-11 20:53:30 +08:00
optimize regex location search
This commit is contained in:
parent
bf15d70e10
commit
c915106f20
@ -29,7 +29,7 @@ typedef struct {
|
|||||||
|
|
||||||
|
|
||||||
static ngx_int_t ngx_http_core_find_location(ngx_http_request_t *r,
|
static ngx_int_t ngx_http_core_find_location(ngx_http_request_t *r,
|
||||||
ngx_array_t *locations, size_t len);
|
ngx_array_t *locations, ngx_uint_t regex_start, size_t len);
|
||||||
|
|
||||||
static ngx_int_t ngx_http_core_preconfiguration(ngx_conf_t *cf);
|
static ngx_int_t ngx_http_core_preconfiguration(ngx_conf_t *cf);
|
||||||
static void *ngx_http_core_create_main_conf(ngx_conf_t *cf);
|
static void *ngx_http_core_create_main_conf(ngx_conf_t *cf);
|
||||||
@ -629,7 +629,7 @@ ngx_http_core_find_config_phase(ngx_http_request_t *r,
|
|||||||
|
|
||||||
cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);
|
cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);
|
||||||
|
|
||||||
rc = ngx_http_core_find_location(r, &cscf->locations, 0);
|
rc = ngx_http_core_find_location(r, &cscf->locations, cscf->regex_start, 0);
|
||||||
|
|
||||||
if (rc == NGX_HTTP_INTERNAL_SERVER_ERROR) {
|
if (rc == NGX_HTTP_INTERNAL_SERVER_ERROR) {
|
||||||
ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
|
ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
|
||||||
@ -930,7 +930,7 @@ ngx_http_update_location_config(ngx_http_request_t *r)
|
|||||||
|
|
||||||
static ngx_int_t
|
static ngx_int_t
|
||||||
ngx_http_core_find_location(ngx_http_request_t *r,
|
ngx_http_core_find_location(ngx_http_request_t *r,
|
||||||
ngx_array_t *locations, size_t len)
|
ngx_array_t *locations, ngx_uint_t regex_start, size_t len)
|
||||||
{
|
{
|
||||||
ngx_int_t n, rc;
|
ngx_int_t n, rc;
|
||||||
ngx_uint_t i, found, noregex;
|
ngx_uint_t i, found, noregex;
|
||||||
@ -1009,7 +1009,8 @@ ngx_http_core_find_location(ngx_http_request_t *r,
|
|||||||
clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
|
clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
|
||||||
|
|
||||||
if (clcf->locations.nelts) {
|
if (clcf->locations.nelts) {
|
||||||
rc = ngx_http_core_find_location(r, &clcf->locations, len);
|
rc = ngx_http_core_find_location(r, &clcf->locations,
|
||||||
|
clcf->regex_start, len);
|
||||||
|
|
||||||
if (rc != NGX_OK) {
|
if (rc != NGX_OK) {
|
||||||
return rc;
|
return rc;
|
||||||
@ -1025,11 +1026,7 @@ ngx_http_core_find_location(ngx_http_request_t *r,
|
|||||||
|
|
||||||
/* regex matches */
|
/* regex matches */
|
||||||
|
|
||||||
for (/* void */; i < locations->nelts; i++) {
|
for (i = regex_start; i < locations->nelts; i++) {
|
||||||
|
|
||||||
if (!clcfp[i]->regex) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (clcfp[i]->noname) {
|
if (clcfp[i]->noname) {
|
||||||
break;
|
break;
|
||||||
@ -1553,14 +1550,15 @@ ngx_http_cleanup_add(ngx_http_request_t *r, size_t size)
|
|||||||
static char *
|
static char *
|
||||||
ngx_http_core_server(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)
|
ngx_http_core_server(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)
|
||||||
{
|
{
|
||||||
char *rv;
|
char *rv;
|
||||||
void *mconf;
|
void *mconf;
|
||||||
ngx_uint_t m;
|
ngx_uint_t i, m;
|
||||||
ngx_conf_t pcf;
|
ngx_conf_t pcf;
|
||||||
ngx_http_module_t *module;
|
ngx_http_module_t *module;
|
||||||
ngx_http_conf_ctx_t *ctx, *http_ctx;
|
ngx_http_conf_ctx_t *ctx, *http_ctx;
|
||||||
ngx_http_core_srv_conf_t *cscf, **cscfp;
|
ngx_http_core_srv_conf_t *cscf, **cscfp;
|
||||||
ngx_http_core_main_conf_t *cmcf;
|
ngx_http_core_loc_conf_t **clcfp;
|
||||||
|
ngx_http_core_main_conf_t *cmcf;
|
||||||
|
|
||||||
ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));
|
ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));
|
||||||
if (ctx == NULL) {
|
if (ctx == NULL) {
|
||||||
@ -1644,6 +1642,16 @@ ngx_http_core_server(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)
|
|||||||
ngx_sort(cscf->locations.elts, (size_t) cscf->locations.nelts,
|
ngx_sort(cscf->locations.elts, (size_t) cscf->locations.nelts,
|
||||||
sizeof(ngx_http_core_loc_conf_t *), ngx_http_core_cmp_locations);
|
sizeof(ngx_http_core_loc_conf_t *), ngx_http_core_cmp_locations);
|
||||||
|
|
||||||
|
cscf->regex_start = cscf->locations.nelts;
|
||||||
|
clcfp = cscf->locations.elts;
|
||||||
|
|
||||||
|
for (i = 0; i < cscf->locations.nelts; i++) {
|
||||||
|
if (clcfp[i]->regex) {
|
||||||
|
cscf->regex_start = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1652,7 +1660,7 @@ static char *
|
|||||||
ngx_http_core_location(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)
|
ngx_http_core_location(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)
|
||||||
{
|
{
|
||||||
char *rv;
|
char *rv;
|
||||||
ngx_int_t m;
|
ngx_uint_t i, m;
|
||||||
ngx_str_t *value;
|
ngx_str_t *value;
|
||||||
ngx_conf_t save;
|
ngx_conf_t save;
|
||||||
ngx_http_module_t *module;
|
ngx_http_module_t *module;
|
||||||
@ -1816,6 +1824,16 @@ ngx_http_core_location(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)
|
|||||||
ngx_sort(clcf->locations.elts, (size_t) clcf->locations.nelts,
|
ngx_sort(clcf->locations.elts, (size_t) clcf->locations.nelts,
|
||||||
sizeof(ngx_http_core_loc_conf_t *), ngx_http_core_cmp_locations);
|
sizeof(ngx_http_core_loc_conf_t *), ngx_http_core_cmp_locations);
|
||||||
|
|
||||||
|
clcf->regex_start = clcf->locations.nelts;
|
||||||
|
clcfp = clcf->locations.elts;
|
||||||
|
|
||||||
|
for (i = 0; i < clcf->locations.nelts; i++) {
|
||||||
|
if (clcfp[i]->regex) {
|
||||||
|
clcf->regex_start = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,6 +117,9 @@ typedef struct {
|
|||||||
*/
|
*/
|
||||||
ngx_array_t locations;
|
ngx_array_t locations;
|
||||||
|
|
||||||
|
unsigned regex_start:16;
|
||||||
|
unsigned wildcard:1;
|
||||||
|
|
||||||
/* array of the ngx_http_listen_t, "listen" directive */
|
/* array of the ngx_http_listen_t, "listen" directive */
|
||||||
ngx_array_t listen;
|
ngx_array_t listen;
|
||||||
|
|
||||||
@ -138,8 +141,6 @@ typedef struct {
|
|||||||
|
|
||||||
ngx_flag_t optimize_server_names;
|
ngx_flag_t optimize_server_names;
|
||||||
ngx_flag_t ignore_invalid_headers;
|
ngx_flag_t ignore_invalid_headers;
|
||||||
|
|
||||||
ngx_uint_t wildcard; /* unsigned wildcard:1 */
|
|
||||||
} ngx_http_core_srv_conf_t;
|
} ngx_http_core_srv_conf_t;
|
||||||
|
|
||||||
|
|
||||||
@ -210,6 +211,8 @@ struct ngx_http_core_loc_conf_s {
|
|||||||
ngx_regex_t *regex;
|
ngx_regex_t *regex;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
unsigned regex_start:16;
|
||||||
|
|
||||||
unsigned noname:1; /* "if () {}" block */
|
unsigned noname:1; /* "if () {}" block */
|
||||||
|
|
||||||
unsigned exact_match:1;
|
unsigned exact_match:1;
|
||||||
|
Loading…
Reference in New Issue
Block a user