地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【Apache】httpd 2.2と2.4で微妙に違うrewrite rule

適当なrewrite ruleを使ってproxyする設定を書いた。以下の挙動が2.2と2.4で微妙に違うことに気づいたのでメモ

config

<VirtualHost *:80>
    ServerName www.test.com
    SSLProxyEngine On
    RewriteEngine on
    RewriteRule ^/(.*) $1 [P,L,QSA]
</VirtualHost>

vhostのwww.test.comへのアクセス時にhttp://www.test.com/https://www.google.comみたいな感じのリクエスト時にRewriteRuleを元にgoogleのtopが表示されるのが期待動作。

2.2 -> 200

< HTTP/1.1 200 OK
< Date: Thu, 01 Apr 2021 14:17:03 GMT
< Server: gws
< Expires: -1
< Cache-Control: private, max-age=0
< Content-Type: text/html; charset=ISO-8859-1
< P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
< X-XSS-Protection: 0
< X-Frame-Options: SAMEORIGIN
< Alt-Svc: h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
< Accept-Ranges: none
< Vary: Accept-Encoding
< Set-Cookie: 1P_JAR=2021-04-01-14; expires=Sat, 01-May-2021 14:17:03 GMT; path=/; domain=.google.com; Secure
< Set-Cookie: NID=212=HzIcDm6x02fFuJ5dT_0LD_Rmwc6YiZCxfz8o-4h0cbQhY4ZvB_A8PBgRL6fh8GVRJCzhRDrI0xqWvmh0h5S1QiwODURn92C8A9NVjTPSOaxJdOojbql5s8DVgqOpJd5uWRfZ0DDZVa_39-zTS0LjegvPM00WGiOHHacnacRGIJI; expires=Fri, 01-Oct-2021 14:17:03 GMT; path=/; domain=.google.com; HttpOnly
< Transfer-Encoding: chunked

2.4 -> 301

< HTTP/1.1 301 Moved Permanently
< Date: Thu, 01 Apr 2021 14:20:39 GMT
< Server: nginx/1.18.0
< Content-Type: text/html; charset=UTF-8
< X-DIS-Request-ID: c9ea127df498f905de72f58aca50d697
< Location: https://www.test.com/https:/www.google.com
< Transfer-Encoding: chunked

2.4の方が301になっているがこれはPフラグがうまく機能していない模様。ログをdebugで起動してみると確かにproxyがうまくいっていない。

[Thu Apr 01 14:23:34.393360 2021] [proxy:debug] [pid 9:tid 140575798086456] proxy_util.c(2392): [client 172.17.0.1:61890] AH00944: connecting http://www.test.com/https:/www.google.com to www.test.com:80
[Thu Apr 01 14:23:34.395300 2021] [proxy:debug] [pid 9:tid 140575798086456] proxy_util.c(2615): [client 172.17.0.1:61890] AH00947: connected /https:/www.google.com to www.test.com:80

動作が違う理由は良くわかっていない。ただセキュリティ的に言えば2.2の動作はクライアントの動き次第ではproxy先への攻撃に加担するような形になってしまうので2.4のような動きが正しいのかもしれない。

2.4で同じようなことをするなら一旦キャプチャして改めてフルぱすでproxyするようなconfignになると思う。