The patch below adds a "$REQUEST_SCHEME" macro to those available in
block rules in httpd.conf
Justification: when redirecting from a (virtual) server which supports
both http and https to a (virtual) server which also supports both
schemes, it make sense to be able to respect (preserve) the scheme of
the original request rather than having to hard-code "http" or "https".
Patch is against -current, but has been tested (only) against
5.9-stable.
Ross
Index: src/usr.sbin/httpd/httpd.conf.5
===================================================================
RCS file: /cvs/src/usr.sbin/httpd/httpd.conf.5,v
retrieving revision 1.73
diff -u -p -u -r1.73 httpd.conf.5
--- src/usr.sbin/httpd/httpd.conf.5 9 May 2016 19:36:54 -0000 1.73
+++ src/usr.sbin/httpd/httpd.conf.5 22 Jun 2016 11:16:01 -0000
@@ -202,7 +202,7 @@ The
.Ar uri
may contain predefined macros that will be expanded at runtime:
.Pp
-.Bl -tag -width $DOCUMENT_URI -offset indent -compact
+.Bl -tag -width $REQUEST_SCHEME -offset indent -compact
.It Ic $DOCUMENT_URI
The request path.
.It Ic $QUERY_STRING
@@ -213,6 +213,14 @@ The IP address of the connected client.
The TCP source port of the connected client.
.It Ic $REMOTE_USER
The remote user for HTTP authentication.
+.It Ic $REQUEST_SCHEME
+The scheme
+.Po
+.Dq http
+or
+.Dq https
+.Pc
+of the request.
.It Ic $REQUEST_URI
The request path and optional query string.
.It Ic $SERVER_ADDR
Index: src/usr.sbin/httpd/server_http.c
===================================================================
RCS file: /cvs/src/usr.sbin/httpd/server_http.c,v
retrieving revision 1.108
diff -u -p -u -r1.108 server_http.c
--- src/usr.sbin/httpd/server_http.c 27 May 2016 11:24:13 -0000 1.108
+++ src/usr.sbin/httpd/server_http.c 22 Jun 2016 11:16:01 -0000
@@ -1011,6 +1011,12 @@ server_expand_http(struct client *clt, c
if (ret != 0)
return (NULL);
}
+ if (strstr(val, "$REQUEST_SCHEME") != NULL) {
+ ret = expand_string(buf, len, "$REQUEST_SCHEME",
+ clt->clt_tls_ctx != NULL ? "https" : "http");
+ if (ret != 0)
+ return (NULL);
+ }
if (strstr(val, "$SERVER_") != NULL) {
if (strstr(val, "$SERVER_ADDR") != NULL) {
if (print_host(&srv_conf->ss,