15

テスト目的で社内マシンに Apache 2.4.6 サーバーをセットアップしています。Apache サーバーが行うべきことの 1 つは、localhost:3030 で見つかった別のサーバーのリバース プロキシとして機能することです。

localhost:3030 上のサーバーは、最初のパス レベルでいくつかのデータセット名のうちの 1 つを想定しています (現時点では、セットは dataset のみで構成されていexperimentalますが、後で追加される予定です)。要求されたパス。

私の仮想ホストでは、これは機能します:

<Location /experimental/>
    ProxyPass http://localhost:3030/experimental/
    ProxyPassReverse /
</Location>

experimental追加のデータセットについては、それをコピーして他のデータセット名に置き換えることができます。明らかに、これは多くのコードの重複/冗長性につながり、エラーの原因とメンテナンスの恐怖の両方になります。

したがって、私はもう少し柔軟になり、複数のデータセットを 1 つのブロックで扱いたいと考えています。LocationMatchこれは、ディレクティブで可能になるはずです。

このコメントこのページで示されているように、ブロック内で使用する場合は置き換える必要があります。基本的に、ドキュメントは同じことを述べています:ProxyPass ProxyPassMatchLocationMatch

同じことが LocationMatch セクション内で発生しますが、ProxyPass は正規表現をそのように解釈しないため、代わりにこの状況では ProxyPassMatch を使用する必要があります。

LocationMatchドキュメントは次のように説明しています。

2.4.8 以降では、名前付きグループと後方参照がキャプチャされ、対応する名前の先頭に「MATCH_」と大文字が付けられて環境に書き込まれます。これにより、mod_rewrite などの式やモジュール内から URL の要素を参照できます。混乱を避けるために、番号付けされた (名前のない) 後方参照は無視されます。代わりに名前付きグループを使用してください。

その情報は Apache 2.4.8 の時点でのみ有効です。これがおそらく、私の 2.4.6 インストールで以下が機能しない理由です。

<LocationMatch /(?<dataset>experimental)/>
    ProxyPassMatch http://localhost:3030/%{env:MATCH_DATASET}/
    ProxyPassReverse /
</LocationMatch>

一方、このページその投稿は、数値グループ インデックス ( ) を使用できることを暗示しています ($1ヘルプ テキストは httpd 2.4.8 の時点でのみ有効であるため、数値参照は 2.4.8 より前で機能するのではないかと疑っています/希望しています)。 (?)

いずれにせよ、私はこれを試しました:

<LocationMatch "/(experimental)/">
    ProxyPassMatch http://localhost:3030/$1/
    ProxyPassReverse /
</LocationMatch>

ただし、ログによると、vhost URLのパスを要求するときではhttp://localhost:3030/$1/なく、内部呼び出しが呼び出されます。http://localhost:3030/experimental/experimental

ProxyPassMatchドキュメントは次のように言うだけです:

LocationMatch セクション内で使用する場合、最初の引数は省略され、正規表現は LocationMatch から取得されます。

LocationMatchただし、このテキストでは、とを組み合わせる方法の例をあえて提供していませんProxyPassMatch私は何を間違っていますか?

4

2 に答える 2

4

ドキュメントにも記載When the URL parameter doesn't use any backreferences into the regular expression, the original URL will be appended to the URL parameter.されていますが、これはあなたのケースのようです。さらに、 ProxyPassReverseディレクティブにホストがありません。

これはうまくいくはずです:

<LocationMatch "^/experimental/.*$">
    ProxyPassMatch http://localhost:3030
    ProxyPassReverse http://localhost:3030
</LocationMatch>
于 2018-07-07T19:11:23.420 に答える