60#if !APR_VERSION_AT_LEAST(2,0,0)
70#define APR_WANT_MEMFUNC
71#define APR_WANT_STRFUNC
79#if APR_HAVE_SYS_TYPES_H
91#if APR_HAVE_NETINET_IN_H
92#include <netinet/in.h>
109#include "test_char.h"
124#ifdef APLOG_MAX_LOGLEVEL
125#if APLOG_MAX_LOGLEVEL < APLOG_TRACE1
126#ifndef REWRITELOG_DISABLED
127#define REWRITELOG_DISABLED
132#ifndef REWRITELOG_DISABLED
134#define rewritelog(x) do_rewritelog x
135#define REWRITELOG_MODE ( APR_UREAD | APR_UWRITE | APR_GREAD | APR_WREAD )
136#define REWRITELOG_FLAGS ( APR_WRITE | APR_APPEND | APR_CREATE )
145#define REWRITE_FORCED_MIMETYPE_NOTEVAR "rewrite-forced-mimetype"
146#define REWRITE_FORCED_HANDLER_NOTEVAR "rewrite-forced-handler"
148#define ENVVAR_SCRIPT_URL "SCRIPT_URL"
149#define REDIRECT_ENVVAR_SCRIPT_URL "REDIRECT_" ENVVAR_SCRIPT_URL
150#define ENVVAR_SCRIPT_URI "SCRIPT_URI"
152#define CONDFLAG_NONE (1<<0)
153#define CONDFLAG_NOCASE (1<<1)
154#define CONDFLAG_NOTMATCH (1<<2)
155#define CONDFLAG_ORNEXT (1<<3)
156#define CONDFLAG_NOVARY (1<<4)
158#define RULEFLAG_NONE (1<<0)
159#define RULEFLAG_FORCEREDIRECT (1<<1)
160#define RULEFLAG_LASTRULE (1<<2)
161#define RULEFLAG_NEWROUND (1<<3)
162#define RULEFLAG_CHAIN (1<<4)
163#define RULEFLAG_IGNOREONSUBREQ (1<<5)
164#define RULEFLAG_NOTMATCH (1<<6)
165#define RULEFLAG_PROXY (1<<7)
166#define RULEFLAG_PASSTHROUGH (1<<8)
167#define RULEFLAG_QSAPPEND (1<<9)
168#define RULEFLAG_NOCASE (1<<10)
169#define RULEFLAG_NOESCAPE (1<<11)
170#define RULEFLAG_NOSUB (1<<12)
171#define RULEFLAG_STATUS (1<<13)
172#define RULEFLAG_ESCAPEBACKREF (1<<14)
173#define RULEFLAG_DISCARDPATHINFO (1<<15)
174#define RULEFLAG_QSDISCARD (1<<16)
175#define RULEFLAG_END (1<<17)
176#define RULEFLAG_ESCAPENOPLUS (1<<18)
177#define RULEFLAG_QSLAST (1<<19)
178#define RULEFLAG_QSNONE (1<<20)
179#define RULEFLAG_ESCAPECTLS (1<<21)
180#define RULEFLAG_UNSAFE_PREFIX_STAT (1<<22)
181#define RULEFLAG_UNSAFE_ALLOW3F (1<<23)
182#define RULEFLAG_UNC (1<<24)
187#define ACTION_NORMAL (1<<0)
188#define ACTION_NOESCAPE (1<<1)
189#define ACTION_STATUS (1<<2)
190#define ACTION_STATUS_SET (1<<3)
192#define MAPTYPE_TXT (1<<0)
193#define MAPTYPE_DBM (1<<1)
194#define MAPTYPE_PRG (1<<2)
195#define MAPTYPE_INT (1<<3)
196#define MAPTYPE_RND (1<<4)
197#define MAPTYPE_DBD (1<<5)
198#define MAPTYPE_DBD_CACHE (1<<6)
200#define ENGINE_DISABLED (1<<0)
201#define ENGINE_ENABLED (1<<1)
203#define OPTION_NONE (1<<0)
204#define OPTION_INHERIT (1<<1)
205#define OPTION_INHERIT_BEFORE (1<<2)
206#define OPTION_NOSLASH (1<<3)
207#define OPTION_ANYURI (1<<4)
208#define OPTION_MERGEBASE (1<<5)
209#define OPTION_INHERIT_DOWN (1<<6)
210#define OPTION_INHERIT_DOWN_BEFORE (1<<7)
211#define OPTION_IGNORE_INHERIT (1<<8)
212#define OPTION_IGNORE_CONTEXT_INFO (1<<9)
213#define OPTION_LEGACY_PREFIX_DOCROOT (1<<10)
214#define OPTION_UNSAFE_PREFIX_STAT (1<<12)
217#define RAND_MAX 32767
222#define MAX_COOKIE_LEN 4096
225#ifndef REWRITE_MAX_TXT_MAP_LINE
226#define REWRITE_MAX_TXT_MAP_LINE 1024
230#ifndef REWRITE_PRG_MAP_BUF
231#define REWRITE_PRG_MAP_BUF 1024
235#define LEFT_CURLY '{'
236#define RIGHT_CURLY '}'
243#define SMALL_EXPANSION 5
251#define subreq_ok(r) (!r->main || \
252 (r->main->uri && r->uri && strcmp(r->main->uri, r->uri)))
254#ifndef REWRITE_MAX_ROUNDS
255#define REWRITE_MAX_ROUNDS 32000
429module AP_MODULE_DECLARE_DATA rewrite_module;
458#ifndef REWRITELOG_DISABLED
460 const char *
fmt, ...)
494 r->
main ?
"subreq" :
"initial",
495 redir ?
"/redir#" :
"",
497 perdir ?
"[perdir " :
"",
498 perdir ? perdir :
"",
542 if (*
uri ==
'/' || strlen(
uri) <= 5) {
650 return (
uri[4] ==
'/' &&
uri[5] ==
'/') ? 7 : 5;
659#ifndef CASE_BLIND_FILESYSTEM
660 return (
path[0] ==
'/');
670 unsigned char *
where)
672#if APR_CHARSET_EBCDIC
690 const unsigned char *
s = (
const unsigned char *)
path;
691 unsigned char *
d = (
unsigned char *)copy;
703 else if (
c ==
' ' && !
noplus) {
730 if (!scheme || strlen(
uri) < scheme) {
739 while (*cp && *cp !=
'/') {
744 if (!*cp || !*++cp) {
762 while (*cp &&
c < 4) {
772 (
c >= 1) ?
"?" :
NULL,
774 (
c >= 2) ?
"?" :
NULL,
776 (
c >= 3) ?
"?" :
NULL,
778 (
c >= 4) ?
"?" :
NULL,
802 rewritelog((
r, 2,
NULL,
"discarding query string, no parse from substitution"));
876 cp =
host = scratch + l + 3;
877 while (*cp && *cp !=
'/' && *cp !=
':') {
884 while (*cp && *cp !=
'/') {
895 else if (*cp ==
'/') {
999 rewritelog((
r, 3,
NULL,
"prefix_stat compare statpath %s and lastsub output %s STATOK %d ",
1046 slen = strlen(subst);
1047 if (
slen && subst[
slen - 1] !=
'/') {
1056 output[
slen-1] =
'/';
1109 else if (map->
mtime !=
t) {
1267 const char *user,
const char *group,
1343 "mod_rewrite: could not start RewriteMap "
1374 "mod_rewrite: can't open text RewriteMap file %s",
file);
1424 const char *dbmtype,
char *
key)
1426#if APU_MAJOR_VERSION > 1 || (APU_MAJOR_VERSION == 1 && APU_MINOR_VERSION >= 7)
1436#if APU_MAJOR_VERSION > 1 || (APU_MAJOR_VERSION == 1 && APU_MINOR_VERSION >= 7)
1440 "mod_rewrite: can't load DBM library '%s': %s",
1447 "mod_rewrite: can't open DBM RewriteMap %s",
file);
1455 "mod_rewrite: can't open DBM RewriteMap %s",
file);
1487 "rewritemap: No db handle available! "
1488 "Check your database access");
1499 "rewritemap: error %s querying for %s", errmsg,
key);
1519 "rewritemap: error %s looking up %s", errmsg,
key);
1569 "apr_global_mutex_lock(rewrite_mapr_lock_acquire) "
1584 iova[0].iov_len = strlen(
key);
1585 iova[1].iov_base =
"\n";
1586 iova[1].iov_len = 1;
1623 else if (
c ==
'\n') {
1683 "apr_global_mutex_unlock(rewrite_mapr_lock_acquire) "
1726 "mod_rewrite: can't access text RewriteMap file %s",
1734 "cache lookup FAILED, forcing new map lookup"));
1767 "mod_rewrite: can't access DBM RewriteMap file %s",
1770 else if(
s->checkfile2 !=
NULL) {
1776 "mod_rewrite: can't access DBM RewriteMap "
1777 "file %s",
s->checkfile2);
1779 else if(
st2.mtime >
st.mtime) {
1780 st.mtime =
st2.mtime;
1790 "cache lookup FAILED, forcing new map lookup"));
1807 rewritelog((
r, 5,
NULL,
"cache lookup OK: map=%s[dbm] key=%s -> val=%s",
1834 "cache lookup FAILED, forcing new map lookup"));
1851 rewritelog((
r, 5,
NULL,
"cache lookup OK: map=%s[SQL] key=%s, val=%s",
1900 ctx->vary_this =
ctx->vary_this
1917 if (*
ctx->uri ==
'/') {
1945 if (
var[3] ==
':') {
1962 else if (
var[4] ==
':') {
1988 if (
ctx->perdir && *
path ==
'/') {
2048 rewritelog((
r, 1,
ctx->perdir,
"IPV6='off' (IPv6 is not enabled)"));
2183 else if (
var[7] ==
'H' && !
strcmp(
var,
"REMOTE_HOST")) {
2261 else if (*
var ==
'C' && !
strcmp(
var,
"CONTEXT_PREFIX")) {
2264 else if (
var[8] ==
'M' && !
strcmp(
var,
"REQUEST_METHOD")) {
2267 else if (!
strcmp(
var,
"REQUEST_SCHEME")) {
2304 else if (!
strcmp(
var,
"REQUEST_FILENAME")) {
2310 if (!
strcmp(
var,
"HTTP_PROXY_CONNECTION")) {
2313 else if (!
strcmp(
var,
"CONTEXT_DOCUMENT_ROOT")) {
2340 for (depth = 1; *
s; ++
s) {
2356 for (depth = 1; *
s; ++
s) {
2357 if (*
s ==
c && depth == 1) {
2390 inputlen = strlen(
input);
2393 if (inputlen ==
span) {
2414 current = current->
next;
2434 else if (
p[1] ==
'{') {
2446 else if (*
p ==
'%') {
2494 if (!
key && dflt && *dflt) {
2517 &&
bri->regmatch[
n].rm_eo >
bri->regmatch[
n].rm_so) {
2518 span =
bri->regmatch[
n].rm_eo -
bri->regmatch[
n].rm_so;
2555 current = current->
next;
2565 }
while (
p <
input+inputlen);
2637 const char *
sep =
":";
2640 if (
s && *
s ==
';') {
2649 if (
var &&
val && domain) {
2654 while (rmain->
main) {
2655 rmain = rmain->
main;
2678 "%.2d:%.2d:%.2d GMT",
2690 "; domain=", domain,
2691 expires ? (
exp_time ?
"; expires=" :
"")
2704 "; HttpOnly" :
NULL,
2729 cookie = cookie->
next;
2742 if (
uri && *
uri ==
'/' &&
uri[1] ==
'~') {
2746 while (*
p && *
p !=
'/') {
2758 if (user >=
homedir && *user ==
'/') {
2952 base->rewriteconds);
2954 base->rewriterules);
2996 a->directory =
NULL;
3039 base->rewriteconds);
3041 base->rewriterules);
3070 sconf->state_set = 1;
3100 else if(!
strcasecmp(w,
"inheritdownbefore")) {
3111 "RewriteOptions: MaxRedirects option has been "
3112 "removed in favor of the global "
3113 "LimitInternalRecursion directive and will be "
3122 else if (!
strcasecmp(w,
"ignorecontextinfo")) {
3125 else if (!
strcasecmp(w,
"legacyprefixdocroot")) {
3128 else if (!
strcasecmp(w,
"UnsafePrefixStat")) {
3132 return apr_pstrcat(
cmd->pool,
"RewriteOptions: unknown option '",
3144 sconf->options |= options;
3145 sconf->options_set = 1;
3161 const char *
a2,
const char *
a3)
3174 return apr_pstrcat(
cmd->pool,
"RewriteMap: bad path to txt map: ",
3182 (
void *)
cmd->server,
a1);
3186 return apr_pstrcat(
cmd->pool,
"RewriteMap: bad path to rnd map: ",
3194 (
void *)
cmd->server,
a1);
3202 (
void *)
cmd->server,
a1);
3205 newmap->dbmtype =
"default";
3208 else if (
a2[3] ==
'=') {
3225 return apr_pstrcat(
cmd->pool,
"RewriteMap: bad path to dbm map: ",
3240 return "RewriteMap types dbd and fastdbd require mod_dbd!";
3242 if ((
a2[0] ==
'd') || (
a2[0] ==
'D')) {
3250 (
void *)
cmd->server,
a1);
3261 return apr_pstrcat(
cmd->pool,
"RewriteMap: bad path to prg map: ",
3280 return apr_pstrcat(
cmd->pool,
"RewriteMap: internal map not found:",
3286 return apr_pstrcat(
cmd->pool,
"RewriteMap: bad path to txt map: ",
3294 (
void *)
cmd->server,
a1);
3301 "RewriteMap: file for map ",
a1,
3316 return "RewriteBase: only valid in per-directory config files";
3318 if (
a1[0] ==
'\0') {
3319 return "RewriteBase: empty URL not allowed";
3322 return "RewriteBase: argument is not a valid URL";
3344 endp =
key + strlen(
key) - 1;
3345 if (*
key !=
'[' || *endp !=
']') {
3346 return "bad flag delimiters";
3472 else if (*
a2 &&
a2[1]) {
3494 else if (
a2[2] ==
'e') {
3505 else if (
a2[2] ==
'e') {
3531 case '>':
if (*++
a2 ==
'=')
3537 case '<':
if (*++
a2 ==
'=')
3545 if (*++
a2 ==
'"' &&
a2[1] ==
'"' && !
a2[2])
3556 "RewriteCond: NoCase option for non-regex pattern '%s' "
3557 "is not supported and will be ignored. (%s:%d)",
a2,
3558 cmd->directive->filename,
cmd->directive->line_num);
3570 return apr_pstrcat(
cmd->pool,
"RewriteCond: cannot compile regular "
3571 "expression '",
a2,
"'",
NULL);
3582 "expression \"%s\": %s",
a2,
err);
3608 return "flag 'BNE' wants a list of characters (i.e. [BNE=...])";
3626 else if (((*
key ==
'O' || *
key ==
'o') && !
key[1])
3724 if (((*
key ==
'E' || *
key ==
'e') && !
key[1])
3735 else if (((*
key ==
'S' || *
key ==
's') && !
key[1])
3739 else if (((*
key ==
'C' || *
key ==
'c') && !
key[1])
3753 else if (((*
key ==
'T' || *
key ==
't') && !
key[1])
3803 "response code '%s' for "
3924 "RewriteRule: cannot compile regular expression '",
3933 if (*
a2 ==
'-' && !
a2[1]) {
3937 if (*(
a2_end-1) ==
'?') {
3994 return ((
unsigned char)
a[
i] > (
unsigned char)
b[
i]) ? 1 : -1;
4061 if (
rsub->status < 400) {
4073 if (
rsub->status < 300 &&
4137 if (
rc < 0 ||
err) {
4139 "RewriteCond: expr='%s' evaluation failed: %s",
4140 p->pattern -
p->pskip,
err));
4146 memcpy(
ctx->briRC.regmatch, regmatch,
sizeof(regmatch));
4157 memcpy(
ctx->briRC.regmatch, regmatch,
sizeof(regmatch));
4166 rewritelog((
r, 4,
ctx->perdir,
"RewriteCond: input='%s' pattern='%s'%s "
4167 "=> %s",
input,
p->pattern -
p->pskip,
4169 rc ?
"matched" :
"not-matched"));
4180 if (
p->forced_mimetype) {
4194 if (
p->forced_handler) {
4201 "Content-handler '%s'",
ctx->r->filename,
expanded));
4238 rewritelog((
r, 3,
ctx->perdir,
"add path info postfix: %s -> %s%s",
4258 rewritelog((
r, 3,
ctx->perdir,
"applying pattern '%s' to uri '%s'",
4259 p->pattern,
ctx->uri));
4278 memcpy(
ctx->briRR.regmatch, regmatch,
sizeof(regmatch));
4287 rewriteconds =
p->rewriteconds;
4290 for (
i = 0;
i < rewriteconds->
nelts; ++
i) {
4321 if (
ctx->vary_this) {
4339 "Unsafe URL with %%3f URL rewritten without "
4358 r->
status =
p->forced_responsecode;
4425 rewritelog((
r, 2,
ctx->perdir,
"forcing proxy-throughput with %s",
4440 rewritelog((
r, 2,
ctx->perdir,
"explicitly forcing redirect with %s",
4443 r->
status =
p->forced_responsecode;
4462 rewritelog((
r, 2,
ctx->perdir,
"implicitly forcing redirect (rc=%d) "
4463 "with %s",
p->forced_responsecode,
r->
filename));
4465 r->
status =
p->forced_responsecode;
4505 ctx->perdir = perdir;
4515 for (
i = 0;
i < rewriterules->
nelts;
i++) {
4538 rewritelog((
r, 2, perdir,
"setting lastsub to rule with output %s",
p->output));
4545 "RewriteRule '%s' and URI '%s' "
4546 "exceeded maximum length (%d)",
4588 rewritelog((
r, 2, perdir,
"forcing '%s' to get passed through "
4589 "to next API URI-to-filename handler",
r->
filename));
4597 rewritelog((
r, 8, perdir,
"Rule has END flag, no further rewriting for this request"));
4614 if (++
round >=
p->maxrounds) {
4616 "RewriteRule '%s' and URI '%s' exceeded "
4617 "maximum number of rounds (%d) via the [N] flag",
4618 p->pattern,
r->
uri,
p->maxrounds);
4708 for (;
s;
s =
s->next) {
4727 "mod_rewrite: could not init rewrite_mapr_lock_acquire"
4735 "mod_rewrite: could not init map cache in child");
4798 rewritelog((
r, 8,
NULL,
"Declining, no further rewriting due to END flag"));
4808 rewritelog((
r, 8,
NULL,
"Declining, request-URI '%s' is not a URL-path. "
4809 "Consult the manual entry for the RewriteOptions directive "
4810 "for options and caveats about matching other strings.",
4904 "Rewritten query string contains control "
4905 "characters or spaces");
4927 "attempt to make remote request from mod_rewrite "
4928 "without proxy enabled: %s",
r->
filename);
5121 if (dconf ==
NULL) {
5174 "Options FollowSymLinks and SymLinksIfOwnerMatch are both off, "
5175 "so the RewriteRule directive is also forbidden "
5176 "due to its similar ability to circumvent directory restrictions : "
5218 "Rewritten query string contains control "
5219 "characters or spaces");
5270 "trying to replace prefix %s with %s",
5376 " URL: %s [IGNORING REWRITE]",
r->
filename));
5405 if (
ccp[l-1] ==
'/') {
5432 "context docroot %s with context prefix %s",
5520 "On or Off to enable or disable (default) the whole "
5521 "rewriting engine"),
5523 "List of option strings to set"),
5525 "the base URL of the per-directory context"),
5527 "an input string and a to be applied regexp-pattern"),
5529 "an URL-applied regexp-pattern and a substitution URL"),
5531 "a mapname and a filename and options"),
5545 static const char *
const aszPre[]={
"mod_proxy.c",
NULL };
Symbol export macros and hook functions.
int int const char ** match
const char apr_size_t len
#define AP_REWRITE_LOG(arg0, arg1, arg2, arg3, arg4)
APR Global Locking Routines.
APR general purpose library routines.
apr_size_t const unsigned char unsigned int unsigned int d
apr_array_append(apr_pool_t *p, const apr_array_header_t *first, const apr_array_header_t *second)
APR Thread Mutex Routines.
APR Versioning Interface.
APR Standard Headers Support.
APR-util Versioning Interface.
static apr_pool_t * pconf
#define AP_INIT_TAKE1(directive, func, mconfig, where, help)
#define ap_get_module_config(v, m)
void ap_hook_post_config(ap_HOOK_post_config_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
#define AP_DECLARE_MODULE(foo)
#define AP_INIT_FLAG(directive, func, mconfig, where, help)
#define AP_INIT_ITERATE(directive, func, mconfig, where, help)
char * ap_server_root_relative(apr_pool_t *p, const char *fname)
#define AP_INIT_RAW_ARGS(directive, func, mconfig, where, help)
void ap_hook_handler(ap_HOOK_handler_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
void ap_hook_pre_config(ap_HOOK_pre_config_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
request_rec int int apr_table_t const char * path
void ap_hook_child_init(ap_HOOK_child_init_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
#define AP_INIT_TAKE23(directive, func, mconfig, where, help)
#define ap_default_port(r)
#define ap_http_scheme(r)
#define ap_is_default_port(port, r)
const char * ap_get_server_banner(void)
apr_port_t ap_get_server_port(const request_rec *r)
int ap_state_query(int query_code)
const char * ap_get_server_name(request_rec *r)
#define AP_SQ_MS_CREATE_CONFIG
int ap_core_translate(request_rec *r)
const char * ap_document_root(request_rec *r)
const char * ap_get_remote_logname(request_rec *r)
const char * ap_get_server_name_for_url(request_rec *r)
int ap_allow_options(request_rec *r)
#define APLOG_R_IS_LEVEL(r, level)
const unsigned char * buf
#define MODULE_MAGIC_NUMBER_MAJOR
#define MODULE_MAGIC_NUMBER_MINOR
apr_status_t ap_global_mutex_create(apr_global_mutex_t **mutex, const char **name, const char *type, const char *instance_id, server_rec *server, apr_pool_t *pool, apr_int32_t options)
apr_status_t ap_mutex_register(apr_pool_t *pconf, const char *type, const char *default_dir, apr_lockmech_e default_mech, apr_int32_t options)
int ap_index_of_response(int status)
void ap_set_content_type_ex(request_rec *r, const char *ct, int trusted)
const char * ap_ssl_var_lookup(apr_pool_t *p, server_rec *s, conn_rec *c, request_rec *r, const char *name)
int ap_ssl_conn_is_ssl(conn_rec *c)
void ap_hook_translate_name(ap_HOOK_translate_name_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
request_rec * ap_sub_req_lookup_uri(const char *new_uri, const request_rec *r, ap_filter_t *next_filter)
request_rec * ap_sub_req_lookup_file(const char *new_file, const request_rec *r, ap_filter_t *next_filter)
void ap_hook_fixups(ap_HOOK_fixups_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
void ap_destroy_sub_req(request_rec *r)
void ap_internal_redirect(const char *new_uri, request_rec *r)
const char apr_port_t port
apr_brigade_flush void * ctx
apr_bucket apr_bucket_brigade * a
const char const apr_dbd_driver_t ** driver
apr_pool_t const char apr_dbd_t const char ** error
struct apr_dbd_prepared_t apr_dbd_prepared_t
apr_pool_t apr_dbd_t const char const char * label
apr_pool_t apr_dbd_t apr_dbd_results_t ** res
struct apr_dbd_results_t apr_dbd_results_t
apr_pool_t apr_dbd_results_t apr_dbd_row_t ** row
struct apr_dbd_row_t apr_dbd_row_t
const char apr_ssize_t int flags
const char apr_ssize_t slen
const void apr_size_t int colon
const char apr_ssize_t int quote
const char *const * aszPre
#define APR_RETRIEVE_OPTIONAL_FN(name)
#define APR_OPTIONAL_FN_TYPE(name)
#define APR_REGISTER_OPTIONAL_FN(name)
apr_text_header const char * text
#define AP_EXPR_FLAG_DONT_VARY
#define ap_expr_parse_cmd(cmd, expr, flags, err, lookup_fn)
int ap_expr_exec_re(request_rec *r, const ap_expr_info_t *expr, apr_size_t nmatch, ap_regmatch_t *pmatch, const char **source, const char **err)
#define HTTP_INTERNAL_SERVER_ERROR
#define HTTP_MOVED_TEMPORARILY
#define ap_is_HTTP_REDIRECT(x)
#define HTTP_MOVED_PERMANENTLY
ap_dbd_t * ap_dbd_acquire(request_rec *r)
void ap_dbd_prepare(server_rec *s, const char *query, const char *label)
#define REWRITE_REDIRECT_HANDLER_NAME
char *() rewrite_mapfunc_t(request_rec *r, char *key)
#define STANDARD20_MODULE_STUFF
int ap_cstr_casecmp(const char *s1, const char *s2)
#define ap_escape_uri(ppool, path)
char * ap_strcasestr(const char *s1, const char *s2)
#define ap_strstr_c(s, c)
#define ap_strchr_c(s, c)
const char * ap_context_prefix(request_rec *r)
const char * ap_context_document_root(request_rec *r)
void ap_str_toupper(char *s)
char * ap_make_dirstr_parent(apr_pool_t *p, const char *s)
const char * ap_scan_vchar_obstext(const char *ptr)
int ap_cstr_casecmpn(const char *s1, const char *s2, apr_size_t n)
void ap_str_tolower(char *s)
int ap_unescape_url(char *url)
ap_regex_t * ap_pregcomp(apr_pool_t *p, const char *pattern, int cflags)
apr_uint32_t ap_random_pick(apr_uint32_t min, apr_uint32_t max)
char * ap_getword_conf(apr_pool_t *p, const char **line)
int ap_os_is_path_absolute(apr_pool_t *p, const char *dir)
const char int apr_pool_t * pool
const char apr_int32_t flag
const char apr_file_t * file
#define APR_FILEPATH_NOTRELATIVE
#define APR_FILEPATH_NOTABOVEROOT
#define APR_FILEPATH_TRUENAME
apr_array_header_t ** result
int strcasecmp(const char *a, const char *b)
int strncasecmp(const char *a, const char *b, size_t n)
#define APR_HASH_KEY_STRING
apr_vformatter_buff_t const char * fmt
apr_vformatter_buff_t * c
apr_vformatter_buff_t const char va_list ap
char const *const char const *const ** env
apr_sockaddr_t apr_sockaddr_t apr_sockaddr_t * source
apr_interval_time_t apr_pollcb_cb_t func
const char apr_status_t(*) apr_pool_t *poo __attribute__)((nonnull(2, 4)))
#define apr_pool_create(newpool, parent)
#define apr_pcalloc(p, size)
apr_int32_t apr_int32_t apr_int32_t err
apr_size_t apr_size_t const char apr_time_exp_t * tm
APR_DECLARE_DATA const char apr_month_snames[12][4]
APR_DECLARE_DATA const char apr_day_snames[7][4]
#define apr_time_from_sec(sec)
const char * ap_get_remote_host(conn_rec *conn, void *dir_config, int type, int *str_is_ip)
const char * ap_get_useragent_host(request_rec *req, int type, int *str_is_ip)
Database Access Extension Module for Apache.
static int parse(server_rec *, apr_pool_t *p, char *, int)
static int prefix_stat(request_rec *r, const char *path, apr_pool_t *pool, rewriterule_entry *lastsub)
static void * config_perdir_merge(apr_pool_t *p, void *basev, void *overridesv)
static void set_cache_value(const char *name, apr_time_t t, char *key, char *val)
static int post_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s)
static int hook_uri2file(request_rec *r)
static rule_return_type apply_rewrite_rule(rewriterule_entry *p, rewrite_ctx *ctx)
static const char * really_last_key
static int pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp)
#define RULEFLAG_UNSAFE_ALLOW3F
static char * rewrite_mapfunc_unescape(request_rec *r, char *key)
#define OPTION_UNSAFE_PREFIX_STAT
static const command_rec command_table[]
#define OPTION_IGNORE_CONTEXT_INFO
static int rewrite_lock_needed
static ap_dbd_t *(* dbd_acquire)(request_rec *)
static void do_expand_cookie(data_item *cookie, rewrite_ctx *ctx)
static const char * lookup_header(const char *name, rewrite_ctx *ctx)
#define RULEFLAG_NEWROUND
static APR_INLINE int compare_lexicography(char *a, char *b)
static void rewrite_child_errfn(apr_pool_t *p, apr_status_t err, const char *desc)
static int proxy_available
#define REWRITE_FORCED_MIMETYPE_NOTEVAR
#define RULEFLAG_DISCARDPATHINFO
static char * rewrite_mapfunc_escape(request_rec *r, char *key)
#define REWRITE_MAX_ROUNDS
static const char * rewritemap_mutex_type
static apr_status_t rewritelock_remove(void *data)
static void reduce_uri(request_rec *r)
static char * do_expand(char *input, rewrite_ctx *ctx, rewriterule_entry *entry)
static apr_status_t rewritelock_create(server_rec *s, apr_pool_t *p)
static apr_status_t rewritemap_program_child(apr_pool_t *p, const char *progname, char **argv, const char *user, const char *group, apr_file_t **fpout, apr_file_t **fpin)
static APR_INLINE const char * la_u(rewrite_ctx *ctx)
static const char * cmd_rewritemap(cmd_parms *cmd, void *dconf, const char *a1, const char *a2, const char *a3)
#define RULEFLAG_ESCAPENOPLUS
static APR_INLINE void force_type_handler(rewriterule_entry *p, rewrite_ctx *ctx)
static const char c2x_table[]
static const char * cmd_rewritecond_setflag(apr_pool_t *p, void *_cfg, char *key, char *val)
#define RULEFLAG_ESCAPEBACKREF
static apr_status_t run_rewritemap_programs(server_rec *s, apr_pool_t *p)
#define CONDFLAG_NOTMATCH
static char * select_random_value_part(request_rec *r, char *value)
#define RULEFLAG_FORCEREDIRECT
static char * lookup_map_dbmfile(request_rec *r, const char *file, const char *dbmtype, char *key)
static const char * cmd_parseflagfield(apr_pool_t *p, void *cfg, char *key, const char *(*parse)(apr_pool_t *, void *, char *, char *))
static int parseargline(char *str, char **a1, char **a2, char **a2_end, char **a3)
#define REWRITE_FORCED_HANDLER_NOTEVAR
#define OPTION_IGNORE_INHERIT
static char * get_cache_value(const char *name, apr_time_t t, char *key, apr_pool_t *p)
static void * config_server_merge(apr_pool_t *p, void *basev, void *overridesv)
static APR_INLINE unsigned char * c2x(unsigned what, unsigned char prefix, unsigned char *where)
#define REWRITE_MAX_TXT_MAP_LINE
#define OPTION_INHERIT_DOWN_BEFORE
#define RULEFLAG_ESCAPECTLS
static char * rewrite_mapfunc_tolower(request_rec *r, char *key)
static char * lookup_variable(char *var, rewrite_ctx *ctx)
#define ACTION_STATUS_SET
static char * lookup_map_dbd(request_rec *r, char *key, const char *label)
#define REDIRECT_ENVVAR_SCRIPT_URL
static void * config_server_create(apr_pool_t *p, server_rec *s)
static void register_hooks(apr_pool_t *p)
static const char * cmd_rewriteengine(cmd_parms *cmd, void *in_dconf, int flag)
static int is_absolute_path(const char *path)
static char * lookup_map_program(request_rec *r, apr_file_t *fpin, apr_file_t *fpout, char *key)
static unsigned is_absolute_uri(char *uri, int *supportsqs)
#define ENVVAR_SCRIPT_URL
static const char * cmd_rewriterule_setflag(apr_pool_t *p, void *_cfg, char *key, char *val)
static void(* dbd_prepare)(server_rec *, const char *, const char *)
#define OPTION_INHERIT_DOWN
static apr_hash_t * mapfunc_hash
#define OPTION_INHERIT_BEFORE
#define REWRITE_PRG_MAP_BUF
static int apply_rewrite_list(request_rec *r, apr_array_header_t *rewriterules, char *perdir, rewriterule_entry **lastsub)
static void add_cookie(request_rec *r, char *s)
#define RULEFLAG_UNSAFE_PREFIX_STAT
static int apply_rewrite_cond(rewritecond_entry *p, rewrite_ctx *ctx)
#define RULEFLAG_QSAPPEND
static char * subst_prefix_path(request_rec *r, char *input, const char *match, const char *subst)
static const char * cmd_rewriterule(cmd_parms *cmd, void *in_dconf, const char *in_str)
static void do_expand_env(data_item *env, rewrite_ctx *ctx)
static int init_cache(apr_pool_t *p)
static void fully_qualify_uri(request_rec *r)
static char * escape_absolute_uri(apr_pool_t *p, char *uri, unsigned scheme)
static void splitout_queryargs(request_rec *r, int flags)
#define RULEFLAG_NOTMATCH
static char * lookup_map_txtfile(request_rec *r, const char *file, char *key)
#define RULEFLAG_PASSTHROUGH
#define MAPTYPE_DBD_CACHE
#define RULEFLAG_QSDISCARD
static char * escape_backref(apr_pool_t *p, const char *path, const char *escapeme, const char *noescapeme, int flags)
static int hook_fixup(request_rec *r)
static APR_INLINE char * find_char_in_curlies(char *s, int c)
static apr_global_mutex_t * rewrite_mapr_lock_acquire
#define ENVVAR_SCRIPT_URI
#define RULEFLAG_NOESCAPE
static char * rewrite_mapfunc_toupper(request_rec *r, char *key)
static void ap_register_rewrite_mapfunc(char *name, rewrite_mapfunc_t *func)
static void do_rewritelog(request_rec *r, int level, char *perdir, const char *fmt,...) __attribute__((format(printf
static int hook_mimetype(request_rec *r)
static APR_INLINE char * find_closing_curly(char *s)
#define RULEFLAG_IGNOREONSUBREQ
static const char * cmd_rewritecond(cmd_parms *cmd, void *in_dconf, const char *in_str)
static char * lookup_map(request_rec *r, char *name, char *key)
static const char * cmd_rewriteoptions(cmd_parms *cmd, void *in_dconf, const char *option)
static void * config_perdir_create(apr_pool_t *p, char *path)
#define OPTION_LEGACY_PREFIX_DOCROOT
static void init_child(apr_pool_t *p, server_rec *s)
static int startsWith(request_rec *r, const char *haystack, const char *needle)
static const char * cmd_rewritebase(cmd_parms *cmd, void *in_dconf, const char *a1)
static int handler_redirect(request_rec *r)
#define RULEFLAG_LASTRULE
Rewrite Extension module for Apache.
const apr_dbd_driver_t * driver
ap_regmatch_t regmatch[10]
A structure that represents the current request.
apr_sockaddr_t * useragent_addr
apr_table_t * err_headers_out
apr_table_t * subprocess_env
struct ap_conf_vector_t * per_dir_config
apr_table_t * headers_out
struct result_list * next
apr_array_header_t * rewriterules
apr_array_header_t * rewriteconds
apr_array_header_t * rewriteconds
apr_array_header_t * rewriterules
apr_array_header_t * rewriteconds
A structure to store information for each virtual server.
struct ap_conf_vector_t * module_config
static apr_array_header_t * a1
Apache Mutex support library.
int ap_matches_request_vhost(request_rec *r, const char *host, apr_port_t port)