I noticed that it's currently impossible to use mod_proxy_http2 in conjunction with mod_rewrite's [P] request proxying:
RewriteEngine On RewriteRule ^/foo h2c://hostname/bar [P] mod_proxy_http2 registers on h2:// and h2c:// proxy URLs [1], however, mod_rewrite needs an update to handle these as absolute URIs. Without that, the configuration above is going to produce incorrectly rewritten rewritten URLs, e.g.: http://www.example.org/h2c://hostname/bar I attached the patch with a fix for this issue. The second patch adds the corresponding tests to the mod_http2 testing framework. [1] https://mail-archives.apache.org/mod_mbox/httpd-dev/201602.mbox/%3cccc0ea0e-00ce-430d-a01c-022e7a2ff...@greenbytes.de%3E Regards, Evgeny Kotkov
mod_rewrite: Add handling of 'h2' and 'h2c' schemes for mod_proxy_http2. Index: modules/mappers/mod_rewrite.c =================================================================== --- modules/mappers/mod_rewrite.c (revision 1743495) +++ modules/mappers/mod_rewrite.c (working copy) @@ -568,6 +568,14 @@ static unsigned is_absolute_uri(char *uri, int *su *sqs = 1; return 8; } + else if (!ap_casecmpstrn(uri, "2://", 4)) { /* h2:// */ + *sqs = 1; + return 5; + } + else if (!ap_casecmpstrn(uri, "2c://", 5)) { /* h2c:// */ + *sqs = 1; + return 6; + } break; case 'l':
Cover the mod_rewrite's [P] proxying in mod_proxy_http2 tests. Index: Makefile.am =================================================================== --- Makefile.am (revision 1743495) +++ Makefile.am (working copy) @@ -223,6 +223,8 @@ proxytx: \ h2proxytx: \ $(SERVER_DIR)/.test-setup $(H2LOAD) -c 8 -t 8 -n 1000 -m 1 --npn-list=h2 https://$(HTTPS_AUTH_2)/h2proxy/005.txt + $(H2LOAD) -c 8 -t 8 -n 1000 -m 1 --npn-list=h2 https://$(HTTPS_AUTH_2)/h2proxy-rewrite/005.txt + $(H2LOAD) -c 8 -t 8 -n 1000 -m 1 http://$(HTTP_AUTH)/h2cproxy-rewrite/005.txt $(H2LOAD) -c 8 -t 8 -n 1000 -m 1 http://$(HTTP_AUTH)/h2cproxy/005.txt ################################################################################ Index: conf/sites/test.example.org.conf =================================================================== --- conf/sites/test.example.org.conf (revision 1743495) +++ conf/sites/test.example.org.conf (working copy) @@ -135,8 +135,10 @@ <IfModule proxy_http2_module> ProxyPass "/h2proxy" "balancer://h2-local" ProxyPassReverse "/h2proxy" "balancer://h2-local" + RewriteRule /h2proxy-rewrite(.*) h2://test.example.org:SUBST_PORT_HTTPS_SUBST$1 [P] ProxyPass "/h2cproxy" "balancer://h2c-local" ProxyPassReverse "/h2cproxy" "balancer://h2c-local" + RewriteRule /h2cproxy-rewrite(.*) h2c://test.example.org:SUBST_PORT_HTTP_SUBST$1 [P] </IfModule> <IfVersion >= 2.4.19> @@ -209,8 +211,10 @@ <IfModule proxy_http2_module> ProxyPass "/h2proxy" "balancer://h2-local" ProxyPassReverse "/h2proxy" "balancer://h2-local" + RewriteRule /h2proxy-rewrite(.*) h2://test.example.org:SUBST_PORT_HTTPS_SUBST$1 [P] ProxyPass "/h2cproxy" "balancer://h2c-local" ProxyPassReverse "/h2cproxy" "balancer://h2c-local" + RewriteRule /h2cproxy-rewrite(.*) h2c://test.example.org:SUBST_PORT_HTTP_SUBST$1 [P] </IfModule> <Location "/http2-status"> Index: conf/sites/test2.example.org.conf =================================================================== --- conf/sites/test2.example.org.conf (revision 1743495) +++ conf/sites/test2.example.org.conf (working copy) @@ -10,6 +10,8 @@ DocumentRoot "SUBST_SERVER_ROOT_SUBST/htdocs/test.example.org" Protocols http/1.1 h2 + RewriteEngine on + SSLEngine on SSLCertificateFile conf/ssl/test.example.org.pem SSLCertificateKeyFile conf/ssl/test.example.org.key @@ -29,8 +31,10 @@ <IfModule proxy_http2_module> ProxyPass "/h2proxy" "balancer://h2-local" ProxyPassReverse "/h2proxy" "balancer://h2-local" + RewriteRule /h2proxy-rewrite(.*) h2://test.example.org:SUBST_PORT_HTTPS_SUBST$1 [P] ProxyPass "/h2cproxy" "balancer://h2c-local" ProxyPassReverse "/h2cproxy" "balancer://h2c-local" + RewriteRule /h2cproxy-rewrite(.*) h2c://test.example.org:SUBST_PORT_HTTP_SUBST$1 [P] </IfModule> </VirtualHost> @@ -59,8 +63,10 @@ <IfModule proxy_http2_module> ProxyPass "/h2proxy" "balancer://h2-local" ProxyPassReverse "/h2proxy" "balancer://h2-local" + RewriteRule /h2proxy-rewrite(.*) h2://test.example.org:SUBST_PORT_HTTPS_SUBST$1 [P] ProxyPass "/h2cproxy" "balancer://h2c-local" ProxyPassReverse "/h2cproxy" "balancer://h2c-local" + RewriteRule /h2cproxy-rewrite(.*) h2c://test.example.org:SUBST_PORT_HTTP_SUBST$1 [P] </IfModule> </VirtualHost> Index: test/test_common.sh =================================================================== --- test/test_common.sh (revision 1743495) +++ test/test_common.sh (working copy) @@ -91,13 +91,13 @@ if min_version 2.4.19; then EXP_H1_HTTP2="" EXP_H2_H2PUSH="" ;; - */h2proxy) + */h2proxy|*/h2proxy-rewrite) EXP_HTTP2="on" EXP_H2PUSH="off" EXP_H1_HTTP2="${EXP_HTTP2}" EXP_H1_H2PUSH="${EXP_H2PUSH}" ;; - */h2cproxy) + */h2cproxy|*/h2cproxy-rewrite) EXP_HTTP2="on" EXP_H2PUSH="off" EXP_H1_HTTP2="${EXP_HTTP2}" @@ -116,13 +116,13 @@ case "$URL_PREFIX" in */proxy|*/rewrite) EXP_PROTOCOL="HTTP/1.1" ;; - */h2proxy) + */h2proxy|*/h2proxy-rewrite) EXP_HTTPS="on" EXP_PROTOCOL="${HTTP2_PROTOCOL}" EXP_H1_PROTOCOL="${EXP_PROTOCOL}" EXP_SSL_PROTOCOL="TLSv1.2" ;; - */h2cproxy) + */h2cproxy|*/h2cproxy-rewrite) EXP_HTTPS="" EXP_SSL_PROTOCOL="" EXP_PROTOCOL="${HTTP2_PROTOCOL}" Index: test/test_h2proxy_load.sh =================================================================== --- test/test_h2proxy_load.sh (revision 1743495) +++ test/test_h2proxy_load.sh (working copy) @@ -44,7 +44,7 @@ EOF load_suite() { URL_PREFIX="$1"; shift - local n=10000 + local n="$1"; shift echo "loading $URL_PREFIX $n requests" load_run " 1 connection " $n -c 1 -t 1 -m 100 @@ -58,7 +58,9 @@ load_suite() { if min_version 2.5.0; then -load_suite $HTTPS_AUTH_2/h2proxy -load_suite $HTTPS_AUTH_2/h2cproxy +load_suite $HTTPS_AUTH_2/h2proxy 10000 +load_suite $HTTPS_AUTH_2/h2proxy-rewrite 1000 +load_suite $HTTPS_AUTH_2/h2cproxy 10000 +load_suite $HTTPS_AUTH_2/h2cproxy-rewrite 1000 fi Index: test/test_proxy.sh =================================================================== --- test/test_proxy.sh (revision 1743495) +++ test/test_proxy.sh (working copy) @@ -40,13 +40,23 @@ $URL_PREFIX/h2proxy/004/gophertiles_002.jpg $URL_PREFIX/h2proxy/004/gophertiles_003.jpg $URL_PREFIX/h2proxy/004/gophertiles_004.jpg $URL_PREFIX/h2proxy/004/gophertiles_005.jpg +$URL_PREFIX/h2proxy-rewrite/004.html +$URL_PREFIX/h2proxy-rewrite/004/gophertiles_002.jpg +$URL_PREFIX/h2proxy-rewrite/004/gophertiles_003.jpg +$URL_PREFIX/h2proxy-rewrite/004/gophertiles_004.jpg +$URL_PREFIX/h2proxy-rewrite/004/gophertiles_005.jpg $URL_PREFIX/h2cproxy/004.html $URL_PREFIX/h2cproxy/004/gophertiles_002.jpg $URL_PREFIX/h2cproxy/004/gophertiles_003.jpg $URL_PREFIX/h2cproxy/004/gophertiles_004.jpg $URL_PREFIX/h2cproxy/004/gophertiles_005.jpg +$URL_PREFIX/h2cproxy-rewrite/004.html +$URL_PREFIX/h2cproxy-rewrite/004/gophertiles_002.jpg +$URL_PREFIX/h2cproxy-rewrite/004/gophertiles_003.jpg +$URL_PREFIX/h2cproxy-rewrite/004/gophertiles_004.jpg +$URL_PREFIX/h2cproxy-rewrite/004/gophertiles_005.jpg EOF - h2load_check_requests "loading from 2 proxied locations" \ + h2load_check_requests "loading from 4 proxied locations" \ -i $TMP/urls.txt -n 10000 -c 1 -t 1 -m 100 <<EOF requests: 10000 total, 10000 started, 10000 done, 10000 succeeded, 0 failed, 0 errored, 0 timeout EOF @@ -54,10 +64,18 @@ EOF if min_version 2.5.0; then +$SHELL "$TEST_DIR"/test_nghttp_get.sh $HTTPS_AUTH/h2cproxy-rewrite && +$SHELL "$TEST_DIR"/test_nghttp_post.sh $HTTPS_AUTH/h2cproxy-rewrite && +$SHELL "$TEST_DIR"/test_curl_get.sh $HTTPS_AUTH/h2cproxy-rewrite && +$SHELL "$TEST_DIR"/test_curl_post.sh $HTTPS_AUTH/h2cproxy-rewrite && $SHELL "$TEST_DIR"/test_nghttp_get.sh $HTTPS_AUTH/h2cproxy && $SHELL "$TEST_DIR"/test_nghttp_post.sh $HTTPS_AUTH/h2cproxy && $SHELL "$TEST_DIR"/test_curl_get.sh $HTTPS_AUTH/h2cproxy && $SHELL "$TEST_DIR"/test_curl_post.sh $HTTPS_AUTH/h2cproxy && +$SHELL "$TEST_DIR"/test_nghttp_get.sh $HTTPS_AUTH/h2proxy-rewrite && +$SHELL "$TEST_DIR"/test_nghttp_post.sh $HTTPS_AUTH/h2proxy-rewrite && +$SHELL "$TEST_DIR"/test_curl_get.sh $HTTPS_AUTH/h2proxy-rewrite && +$SHELL "$TEST_DIR"/test_curl_post.sh $HTTPS_AUTH/h2proxy-rewrite && $SHELL "$TEST_DIR"/test_nghttp_get.sh $HTTPS_AUTH/h2proxy && $SHELL "$TEST_DIR"/test_nghttp_post.sh $HTTPS_AUTH/h2proxy && $SHELL "$TEST_DIR"/test_curl_get.sh $HTTPS_AUTH/h2proxy &&