Index: server/config.c =================================================================== --- server/config.c (revision 408092) +++ server/config.c (working copy) @@ -1855,6 +1855,7 @@ s->process = main_server->process; s->server_admin = NULL; s->server_hostname = NULL; + s->server_scheme = NULL; s->error_fname = NULL; s->timeout = 0; s->keep_alive_timeout = 0; @@ -1940,6 +1941,7 @@ s->port = 0; s->server_admin = DEFAULT_ADMIN; s->server_hostname = NULL; + s->server_scheme = NULL; s->error_fname = DEFAULT_ERRORLOG; s->loglevel = DEFAULT_LOGLEVEL; s->limit_req_line = DEFAULT_LIMIT_REQUEST_LINE; Index: server/core.c =================================================================== --- server/core.c (revision 408092) +++ server/core.c (working copy) @@ -2306,20 +2306,40 @@ return NULL; } +/* + * The ServerName directive takes one argument with format + * [scheme://]fully-qualified-domain-name[:port], for instance + * ServerName www.example.com + * ServerName www.example.com:80 + * ServerName https://www.example.com:443 + */ + static const char *server_hostname_port(cmd_parms *cmd, void *dummy, const char *arg) { const char *err = ap_check_cmd_context(cmd, NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT); - const char *portstr; + const char *portstr, *part; + char *scheme; int port; if (err != NULL) { return err; } - portstr = ap_strchr_c(arg, ':'); + part = ap_strstr_c(arg, "://"); + + if (part) { + scheme = apr_pstrmemdup(cmd->pool, arg, part - arg); + ap_str_tolower(scheme); + cmd->server->server_scheme = scheme; + part += 3; + } else { + part = arg; + } + + portstr = ap_strchr_c(part, ':'); if (portstr) { - cmd->server->server_hostname = apr_pstrndup(cmd->pool, arg, - portstr - arg); + cmd->server->server_hostname = apr_pstrmemdup(cmd->pool, part, + portstr - part); portstr++; port = atoi(portstr); if (port <= 0 || port >= 65536) { /* 65536 == 1<<16 */ @@ -2329,7 +2349,7 @@ } } else { - cmd->server->server_hostname = apr_pstrdup(cmd->pool, arg); + cmd->server->server_hostname = apr_pstrdup(cmd->pool, part); port = 0; } Index: CHANGES =================================================================== --- CHANGES (revision 408092) +++ CHANGES (working copy) @@ -1,6 +1,15 @@ -*- coding: utf-8 -*- Changes with Apache 2.2.3 + *) Add optional 'scheme://' prefix to ServerName directive, + allowing correct determination of the canonical server URL + for use behind a proxy or offload device handling SSL; fixing + redirect generation in those cases. PR 33398 (for this version + of httpd) [Sander Temme] + + *) Added server_scheme field to server_rec for above. Minor MMN bump. + [Sander Temme] + *) mod_charset_lite: Bypass translation when the source and dest charsets are the same. [Jeff Trawick] Index: modules/http/http_core.c =================================================================== --- modules/http/http_core.c (revision 408092) +++ modules/http/http_core.c (working copy) @@ -99,11 +99,23 @@ static const char *http_scheme(const request_rec *r) { + /* + * The http module shouldn't return anything other than + * "http" (the default) or "https". + */ + if (r->server->server_scheme && + (strcmp(r->server->server_scheme, "https") == 0)) + return "https"; + return "http"; } static apr_port_t http_port(const request_rec *r) { + if (r->server->server_scheme && + (strcmp(r->server->server_scheme, "https") == 0)) + return DEFAULT_HTTPS_PORT; + return DEFAULT_HTTP_PORT; } Index: include/ap_mmn.h =================================================================== --- include/ap_mmn.h (revision 408092) +++ include/ap_mmn.h (working copy) @@ -110,6 +110,7 @@ * 20051115.1 (2.2.1) flush_packets and flush_wait members added to * proxy_server (minor) * 20051115.2 (2.2.2) added inreslist member to proxy_conn_rec (minor) + * 20051115.3 (2.2.3) Added server_scheme member to server_rec (minor) */ #define MODULE_MAGIC_COOKIE 0x41503232UL /* "AP22" */ @@ -117,7 +118,7 @@ #ifndef MODULE_MAGIC_NUMBER_MAJOR #define MODULE_MAGIC_NUMBER_MAJOR 20051115 #endif -#define MODULE_MAGIC_NUMBER_MINOR 2 /* 0...n */ +#define MODULE_MAGIC_NUMBER_MINOR 3 /* 0...n */ /** * Determine if the server's current MODULE_MAGIC_NUMBER is at least a Index: include/httpd.h =================================================================== --- include/httpd.h (revision 408092) +++ include/httpd.h (working copy) @@ -1193,6 +1193,9 @@ int limit_req_fieldsize; /** limit on number of request header fields */ int limit_req_fields; + + /** The server request scheme for redirect responses */ + const char *server_scheme; }; typedef struct core_output_filter_ctx {