DocumentRoot をプレフィックスとする Apache 書き換えルール

DocumentRoot をプレフィックスとする Apache 書き換えルール

VirtualHost の設定は次の通りです:

<VirtualHost *:80>
    DocumentRoot /srv/emptywebroot
    <Directory /srv/emptywebroot>
        Require all denied
    </Directory>

    # Dashboard proxy
    RewriteEngine on
    LogLevel alert rewrite:trace6
    RewriteCond %{HTTP:Upgrade} =websocket
    RewriteRule /dashboard/(.*) ws://dashboard:3838/dashboard/$1 [P,L]
    RewriteCond %{HTTP:Upgrade} !=websocket
    RewriteRule /dashboard/(.*) http://dashboard:3838/dashboard/$1 [P,L]
    ProxyPreserveHost on
    ProxyPassReverse /dashboard http://dashboard:3838/dashboard
</VirtualHost>

アクセスすると、http://myurl/dashboardダッシュボードのバックエンドから 404 が表示されます。

書き換えログを検査すると、次のようになります。

[Wed Mar 21 14:04:08.051070 2018] [rewrite:trace2] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] init rewrite engine with requested uri /dashboard/
[Wed Mar 21 14:04:08.051114 2018] [rewrite:trace1] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] pass through /dashboard/
[Wed Mar 21 14:04:08.051176 2018] [rewrite:trace3] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] [perdir /dashboard/] add path info postfix: /srv/emptywebroot/dashboard -> /srv/emptywebroot/dashboard/
[Wed Mar 21 14:04:08.051186 2018] [rewrite:trace3] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] [perdir /dashboard/] applying pattern '(.*)' to uri '/srv/emptywebroot/dashboard/'
[Wed Mar 21 14:04:08.051199 2018] [rewrite:trace4] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] [perdir /dashboard/] RewriteCond: input='' pattern='=websocket' => not-matched
[Wed Mar 21 14:04:08.051208 2018] [rewrite:trace3] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] [perdir /dashboard/] add path info postfix: /srv/emptywebroot/dashboard -> /srv/emptywebroot/dashboard/
[Wed Mar 21 14:04:08.051216 2018] [rewrite:trace3] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] [perdir /dashboard/] applying pattern '(.*)' to uri '/srv/emptywebroot/dashboard/'
[Wed Mar 21 14:04:08.051225 2018] [rewrite:trace4] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] [perdir /dashboard/] RewriteCond: input='' pattern='!=websocket' => matched
[Wed Mar 21 14:04:08.051234 2018] [rewrite:trace2] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] [perdir /dashboard/] rewrite '/srv/emptywebroot/dashboard/' -> 'http://dashboard:3838//srv/emptywebroot/dashboard/'
[Wed Mar 21 14:04:08.051243 2018] [rewrite:trace2] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] [perdir /dashboard/] escaped URI in per-dir context for proxy, http://dashboard:3838//srv/emptywebroot/dashboard/ -> http://dashboard:3838//srv/emptywebroot/dashboard/
[Wed Mar 21 14:04:08.051264 2018] [rewrite:trace2] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] [perdir /dashboard/] forcing proxy-throughput with http://dashboard:3838//srv/emptywebroot/dashboard/
[Wed Mar 21 14:04:08.051272 2018] [rewrite:trace1] [pid 1548:tid 140453800191744] mod_rewrite.c(476): [client 10.174.120.65:59506] 10.174.120.65 - - [idisrv.sivsa.com/sid#7fbdfdd1ed20][rid#7fbdf018f0a0/initial] [perdir /dashboard/] go-ahead with proxy request proxy:http://dashboard:3838//srv/emptywebroot/dashboard/ [OK]

したがって、/srv/emptywebrootURI をプロキシに渡す前にプレフィックスが付けられます。プレフィックスを付けないようにしたいと思います。RewriteBase /いくつか他のことを試してみましたが、意味がわかりません。

このコンテキストで DocumentRoot が URI の先頭に付かないようにするにはどうすればよいですか?

編集1: dashboard:3838 のダッシュボードバックエンドは Apache によって提供されているのではなく、shiny サーバーによって提供されています (https://shiny.rstudio.com/ダッシュボードのホストでtcpdumpを実行したところ、上記のように表示されました。DocumentRootはApacheのプロキシ仮想ホストによってプレフィックスされるため、バックエンドはhttp://ダッシュボード:3838//srv/emptywebroot/ダッシュボード、 の代わりにhttp://ダッシュボード:3838/ダッシュボード必要に応じて。これで状況が明確になればと思うので、質問を言い換えます。mod_rewrite にローカル パス (DocumentRoot のプレフィックス) を解決しないように指示するにはどうすればよいでしょうか。私の場合、これは mod_rewrite プロキシです (書き換えルールの [P] を確認してください)。したがって、ローカル パスのプレフィックスは、望ましい動作ではありません。

答え1

書き換えログによると、ルールセットのこれらの行がヒットしました

RewriteCond %{HTTP:Upgrade} !=websocket
RewriteRule /dashboard/(.*) http://dashboard:3838/dashboard/$1 [P,L]

RewriteRuleフラグがあるため、[L]次の行はチェックされません。

これで、このリクエストは次の書き換えラウンドに入ります。URI<VirtualHost dashboard:3838>/dashboard/HTTP エラー 404 になる理由を確認するには、そこを確認してください。

  • このディレクトリは存在しますか?
  • これを解決できる RewriteRule はありますか?

答え2

事前に REQUEST_URI に書き換え条件を追加して、書き換えルールを REQUEST_URI と一致させるように強制すると問題が解決することがわかったので、次の方法が効果的です。

<VirtualHost *:80>
    DocumentRoot /srv/emptywebroot
    <Directory /srv/emptywebroot>
        Require all denied
    </Directory>

    # Dashboard proxy
    RewriteEngine on
    LogLevel alert rewrite:trace6
    RewriteCond %{HTTP:Upgrade} =websocket
    RewriteCond %{REQUEST_URI} ^/dashboard
    RewriteRule /dashboard/(.*) ws://dashboard:3838/dashboard/$1 [P,L]
    RewriteCond %{HTTP:Upgrade} !=websocket
    RewriteCond %{REQUEST_URI} ^/dashboard
    RewriteRule /dashboard/(.*) http://dashboard:3838/dashboard/$1 [P,L]
    ProxyPreserveHost on
    ProxyPassReverse /dashboard http://dashboard:3838/dashboard
</VirtualHost>

ドキュメントは以下で見つかりましたhttp://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriterule少し混乱しますが、「VirtualHost コンテキストでは、パターンは最初にホスト名とポートの後、クエリ文字列の前の部分 (例: 「/app1/index.html」) の URL と照合されます。これは (% デコードされた) URL パスです。」とありますが、私のケースでは、代わりにローカルで解決されたパスと一致するようです。そのため、RewriteRule が書き換えるもの (私のケースでは REQUEST_URI) を変更するために RewriteCond を追加すると、機能するようです。

関連情報