2017-09-08 7 views
0

Apache 4でホストされている4角形Webアプリケーションがあります。このアプリケーションでは、nodejs javascriptで書かれたAPIを使用しています。ウェブサイトとAPIサービスは、同じマシン上で異なるポート上で実行されています。ウェブサイトはポート80にあり、APIサービスはポート9000でリッスンしています。Apache用のregexの書き方ProxyPassMatchをリバースプロキシAPIコールに変換する

すべてのAPIコールに対してリバースプロキシを実行するようにapacheを設定します。

たとえば、/ api /が含まれているURLはすべてapacheによってAPI url:portを指すように書き換えます。私は次の行のようなProxyPassディレクティブを使用する場合は、リダイレクトが正常に動作します:私は方法がわからない何

ProxyPass  "/api/V1/systeminfo" "http://localhost:9000/api/V1/systeminfo" 
ProxyPassReverse "/api/V1/systeminfo" "http://localhost:9000/api/V1/systeminfo" 

は、ProxyPassMatchディレクティブを使用してように、正規表現を作成することである/ APIが含まれている任意のURL /私は次のことを試してみましたが、それは動作しませんhttp://localhost:9000/api/ .....

にリダイレクトされます。

ProxyPassMatch "^/api.*$" "http://localhost:9000/$1" 
ProxyPassReverse "^/api.*$" "http://localhost:9000/$1" 

どちらも以下のん:

ProxyPassMatch "^/.*?/api.*?/v[0-9]+/(.*)$" "http://localhost:9000/$1" 
ProxyPassReverse "^/.*?/api.*?/v[0-9]+/(.*)$" "http://localhost:9000/$1" 

ご協力いただければ幸いです。私の正規表現のスキルは欠けている!

注:明示的に「localhost」はIPアドレスまたはドメインにすることができますが、わかりやすくするために例で使用しています。

多くの感謝!

編集:アレックスのコメントによると*の代わりに。*を使用する最初の例を修正しました。

+0

私は最初の正規表現について気づいたことが2つあります。私はあなたが '^/api。* $'ではなく '^/api * $'を意味すると思います。この期間を出ると、繰り返しiを探していることを意味します。 スラッシュは私が使った正規表現のフレーバーで必要とされるようにバックスラッシュでエスケープされません。私はバックスラッシュもエスケープする必要があると思いますが、私はあなたが扱っているシステムに精通していません。 –

+0

ありがとう、私はあなたが意味することを理解しています。正規表現は現在動作しているようですが、リダイレクトはありません。おそらく、私はProxyPassMatchパラメータの2番目の部分に間違ったことをしています。私は$ 1が表現していることを理解しているかわかりません。 – Dreamlord

答えて

0

私はこの問題を解決しました。上記の例ではApacheでリバースプロキシを行うための正しい方法は以下の通りです:

ProxyPassMatch "/api(.*)" "http://localhost:9000/api$1" 
ProxyPassReverse "/api(.*)" "http://localhost:9000/api$1" 

私はhttps://regex101.com/でそれらをテストしていたとして、私がしようとしていた複数の正規表現の例は、正しい知っていたが、私はハードコーディングされました第2の部分が正しくないという問題を排除するために、特定の経路の第2の部分であるが、それは何らかの理由でそれを好まない。正規表現の(。*)部分が最初のキャプチャグループであり、2番目の部分で$ 1として使用されていることを理解すると、それはすべて機能しました。

私は十分な答えを明確にして他の誰かにとって役に立ちたいと思っています。

関連する問題