Index: docs/manual/mod/mod_proxy.xml =================================================================== --- docs/manual/mod/mod_proxy.xml (Revision 1386723) +++ docs/manual/mod/mod_proxy.xml (Arbeitskopie) @@ -1060,6 +1060,12 @@ and url encoded id (like servlet containers) use | to to separate them. The first part is for the cookie the second for the path. + sessionsep + "." + Same backend application server do not use the '.' as split symbol + in the session cookie. For example the Oracle Weblogic server uses the + '!'. The correct symbol can set in this option. + scolonpathdelim Off If set to On the semi-colon character ';' will be Index: modules/proxy/mod_proxy_balancer.c =================================================================== --- modules/proxy/mod_proxy_balancer.c (Revision 1386723) +++ modules/proxy/mod_proxy_balancer.c (Arbeitskopie) @@ -296,7 +296,7 @@ * If we found a value for sticksession, find the first '.' within. * Everything after '.' (if present) is our route. */ - if ((*route) && ((*route = strchr(*route, '.')) != NULL )) + if ((*route) && (balancer->s->sticky_separator != 0) && ((*route = strchr(*route, balancer->s->sticky_separator)) != NULL )) (*route)++; if ((*route) && (**route)) { ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(01161) "Found route %s", *route); Index: modules/proxy/proxy_util.c =================================================================== --- modules/proxy/proxy_util.c (Revision 1386723) +++ modules/proxy/proxy_util.c (Arbeitskopie) @@ -1180,6 +1180,8 @@ (*balancer)->hash = bshared->hash; bshared->forcerecovery = 1; + + bshared->sticky_separator = '.'; /* Retrieve a UUID and store the nonce for the lifetime of * the process. */ Index: modules/proxy/mod_proxy.c =================================================================== --- modules/proxy/mod_proxy.c (Revision 1386723) +++ modules/proxy/mod_proxy.c (Arbeitskopie) @@ -287,6 +287,19 @@ PROXY_STRNCPY(balancer->s->sticky_path, path); } } + else if (!strcasecmp(key, "sessionsep")) { + /* separator/delimiter for sessionid and route, + * normally '.' + */ + if (strlen(val) != 1) { + if (!strcasecmp(val, "off")) + balancer->s->sticky_separator = 0; + else + return "sessionsep must be a single character or OFF"; + } + else + balancer->s->sticky_separator = *val; + } else if (!strcasecmp(key, "nofailover")) { /* If set to 'on' the session will break * if the worker is in error state or Index: modules/proxy/mod_proxy.h =================================================================== --- modules/proxy/mod_proxy.h (Revision 1386723) +++ modules/proxy/mod_proxy.h (Arbeitskopie) @@ -406,6 +406,7 @@ typedef struct { char sticky_path[PROXY_BALANCER_MAX_STICKY_SIZE]; /* URL sticky session identifier */ char sticky[PROXY_BALANCER_MAX_STICKY_SIZE]; /* sticky session identifier */ + char sticky_separator; /* separator for sessionid/route */ char lbpname[PROXY_MAX_PROVIDER_NAME_SIZE]; /* lbmethod provider name */ char nonce[APR_UUID_FORMATTED_LENGTH + 1]; char name[PROXY_BALANCER_MAX_NAME_SIZE];