📄 mod_rewrite.c
字号:
ctx->r = r; ap_destroy_sub_req(rr); rewritelog((r, 5, ctx->perdir, "lookahead: path=%s var=%s " "-> val=%s", path, var+5, result)); return (char *)result; } } } } /* well, do it the hard way */ else { char *p; apr_time_exp_t tm; /* can't do this above, because of the getenv call */ for (p = var; *p; ++p) { *p = apr_toupper(*p); } switch (varlen) { case 4: if (!strcmp(var, "TIME")) { apr_time_exp_lt(&tm, apr_time_now()); result = apr_psprintf(r->pool, "%04d%02d%02d%02d%02d%02d", tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); rewritelog((r, 1, ctx->perdir, "RESULT='%s'", result)); return (char *)result; } break; case 5: if (!strcmp(var, "HTTPS")) { int flag = rewrite_is_https && rewrite_is_https(r->connection); return apr_pstrdup(r->pool, flag ? "on" : "off"); } break; case 8: switch (var[6]) { case 'A': if (!strcmp(var, "TIME_DAY")) { apr_time_exp_lt(&tm, apr_time_now()); return apr_psprintf(r->pool, "%02d", tm.tm_mday); } break; case 'E': if (!strcmp(var, "TIME_SEC")) { apr_time_exp_lt(&tm, apr_time_now()); return apr_psprintf(r->pool, "%02d", tm.tm_sec); } break; case 'I': if (!strcmp(var, "TIME_MIN")) { apr_time_exp_lt(&tm, apr_time_now()); return apr_psprintf(r->pool, "%02d", tm.tm_min); } break; case 'O': if (!strcmp(var, "TIME_MON")) { apr_time_exp_lt(&tm, apr_time_now()); return apr_psprintf(r->pool, "%02d", tm.tm_mon+1); } break; } break; case 9: switch (var[7]) { case 'A': if (var[8] == 'Y' && !strcmp(var, "TIME_WDAY")) { apr_time_exp_lt(&tm, apr_time_now()); return apr_psprintf(r->pool, "%d", tm.tm_wday); } else if (!strcmp(var, "TIME_YEAR")) { apr_time_exp_lt(&tm, apr_time_now()); return apr_psprintf(r->pool, "%04d", tm.tm_year+1900); } break; case 'E': if (!strcmp(var, "IS_SUBREQ")) { result = (r->main ? "true" : "false"); } break; case 'F': if (!strcmp(var, "PATH_INFO")) { result = r->path_info; } break; case 'P': if (!strcmp(var, "AUTH_TYPE")) { result = r->ap_auth_type; } break; case 'S': if (!strcmp(var, "HTTP_HOST")) { result = lookup_header("Host", ctx); } break; case 'U': if (!strcmp(var, "TIME_HOUR")) { apr_time_exp_lt(&tm, apr_time_now()); return apr_psprintf(r->pool, "%02d", tm.tm_hour); } break; } break; case 11: switch (var[8]) { case 'A': if (!strcmp(var, "SERVER_NAME")) { result = ap_get_server_name(r); } break; case 'D': if (*var == 'R' && !strcmp(var, "REMOTE_ADDR")) { result = r->connection->remote_ip; } else if (!strcmp(var, "SERVER_ADDR")) { result = r->connection->local_ip; } break; case 'E': if (*var == 'H' && !strcmp(var, "HTTP_ACCEPT")) { result = lookup_header("Accept", ctx); } else if (!strcmp(var, "THE_REQUEST")) { result = r->the_request; } break; case 'I': if (!strcmp(var, "API_VERSION")) { return apr_psprintf(r->pool, "%d:%d", MODULE_MAGIC_NUMBER_MAJOR, MODULE_MAGIC_NUMBER_MINOR); } break; case 'K': if (!strcmp(var, "HTTP_COOKIE")) { result = lookup_header("Cookie", ctx); } break; case 'O': if (*var == 'S' && !strcmp(var, "SERVER_PORT")) { return apr_psprintf(r->pool, "%u", ap_get_server_port(r)); } else if (var[7] == 'H' && !strcmp(var, "REMOTE_HOST")) { result = ap_get_remote_host(r->connection,r->per_dir_config, REMOTE_NAME, NULL); } else if (!strcmp(var, "REMOTE_PORT")) { return apr_itoa(r->pool, r->connection->remote_addr->port); } break; case 'S': if (*var == 'R' && !strcmp(var, "REMOTE_USER")) { result = r->user; } else if (!strcmp(var, "SCRIPT_USER")) { result = "<unknown>"; if (r->finfo.valid & APR_FINFO_USER) { apr_uid_name_get((char **)&result, r->finfo.user, r->pool); } } break; case 'U': if (!strcmp(var, "REQUEST_URI")) { result = r->uri; } break; } break; case 12: switch (var[3]) { case 'I': if (!strcmp(var, "SCRIPT_GROUP")) { result = "<unknown>"; if (r->finfo.valid & APR_FINFO_GROUP) { apr_gid_name_get((char **)&result, r->finfo.group, r->pool); } } break; case 'O': if (!strcmp(var, "REMOTE_IDENT")) { result = ap_get_remote_logname(r); } break; case 'P': if (!strcmp(var, "HTTP_REFERER")) { result = lookup_header("Referer", ctx); } break; case 'R': if (!strcmp(var, "QUERY_STRING")) { result = r->args; } break; case 'V': if (!strcmp(var, "SERVER_ADMIN")) { result = r->server->server_admin; } break; } break; case 13: if (!strcmp(var, "DOCUMENT_ROOT")) { result = ap_document_root(r); } break; case 14: if (*var == 'H' && !strcmp(var, "HTTP_FORWARDED")) { result = lookup_header("Forwarded", ctx); } else if (!strcmp(var, "REQUEST_METHOD")) { result = r->method; } break; case 15: switch (var[7]) { case 'E': if (!strcmp(var, "HTTP_USER_AGENT")) { result = lookup_header("User-Agent", ctx); } break; case 'F': if (!strcmp(var, "SCRIPT_FILENAME")) { result = r->filename; /* same as request_filename (16) */ } break; case 'P': if (!strcmp(var, "SERVER_PROTOCOL")) { result = r->protocol; } break; case 'S': if (!strcmp(var, "SERVER_SOFTWARE")) { result = ap_get_server_banner(); } break; } break; case 16: if (!strcmp(var, "REQUEST_FILENAME")) { result = r->filename; /* same as script_filename (15) */ } break; case 21: if (!strcmp(var, "HTTP_PROXY_CONNECTION")) { result = lookup_header("Proxy-Connection", ctx); } break; } } return apr_pstrdup(r->pool, result ? result : "");}/* * +-------------------------------------------------------+ * | | * | Expansion functions * | | * +-------------------------------------------------------+ *//* * Bracketed expression handling * s points after the opening bracket */static APR_INLINE char *find_closing_curly(char *s){ unsigned depth; for (depth = 1; *s; ++s) { if (*s == RIGHT_CURLY && --depth == 0) { return s; } else if (*s == LEFT_CURLY) { ++depth; } } return NULL;}static APR_INLINE char *find_char_in_curlies(char *s, int c){ unsigned depth; for (depth = 1; *s; ++s) { if (*s == c && depth == 1) { return s; } else if (*s == RIGHT_CURLY && --depth == 0) { return NULL; } else if (*s == LEFT_CURLY) { ++depth; } } return NULL;}/* perform all the expansions on the input string * putting the result into a new string * * for security reasons this expansion must be performed in a * single pass, otherwise an attacker can arrange for the result * of an earlier expansion to include expansion specifiers that * are interpreted by a later expansion, producing results that * were not intended by the administrator. */static char *do_expand(char *input, rewrite_ctx *ctx, rewriterule_entry *entry){ result_list *result, *current; result_list sresult[SMALL_EXPANSION]; unsigned spc = 0; apr_size_t span, inputlen, outlen; char *p, *c; apr_pool_t *pool = ctx->r->pool; span = strcspn(input, "\\$%"); inputlen = strlen(input); /* fast exit */ if (inputlen == span) { return apr_pstrdup(pool, input); } /* well, actually something to do */ result = current = &(sresult[spc++]); p = input + span; current->next = NULL; current->string = input; current->len = span; outlen = span; /* loop for specials */ do { /* prepare next entry */ if (current->len) { current->next = (spc < SMALL_EXPANSION) ? &(sresult[spc++]) : (result_list *)apr_palloc(pool, sizeof(result_list)); current = current->next; current->next = NULL; current->len = 0; } /* escaped character */ if (*p == '\\') { current->len = 1; ++outlen; if (!p[1]) { current->string = p; break; } else { current->string = ++p; ++p; } } /* variable or map lookup */ else if (p[1] == '{') { char *endp; endp = find_closing_curly(p+2); if (!endp) { current->len = 2; current->string = p; outlen += 2; p += 2; } /* variable lookup */ else if (*p == '%') { p = lookup_variable(apr_pstrmemdup(pool, p+2, endp-p-2), ctx); span = strlen(p); current->len = span; current->string = p; outlen += span; p = endp + 1; } /* map lookup */ else { /* *p == '$' */ char *key; /* * To make rewrite maps useful, the lookup key and * default values must be expanded, so we make * recursive calls to do the work. For security * reasons we must never expand a string that includes * verbatim da
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -