1. ホーム
  2. regex

[解決済み] Apache LocationMatch Regex

2022-02-17 22:12:29

質問

私の問題

Apache HTTP Server (v2.4.10) に、Tomcat のパスと一致しないだけでなく、互いに類似したパスを持つ動的なアプリケーションのリクエストを Tomcat にプロキシさせる必要があります。例えば、以下のようなものです。

/products/<category>/<sub-category>/<sub-sub-category>/<product-id>.html へのプロキシです。 http://mycluster/pf/<product-id>.html

...そして...

/products/<category>/<sub-category>/<sub-sub-category>/<anything-not-ending-in-html> へのプロキシです。 http://mycluster/search/<anything-not-ending-in-html>

私の試行錯誤

LocationMatch regexを使って処理しようとしていますが、完全には成功しません。以下の LocationMatch regex はそれ自体で動作します (プロキシとして *.html リクエストを <tomcat>/pf/*.html ):

<LocationMatch ^/products/(?<cat>.+)/(?<subcat>.+)/(?<subsubcat>.+)/(?<partnum>.+).html>
ProxyPass balancer://mycluster/pf/%{env:MATCH_PARTNUM}.html
ProxyPassReverse balancer://mycluster/pf/%{env:MATCH_PARTNUM}.html
</LocationMatch>

これは、次の例のようなパスを使ってURLを渡します。 /products/aaa/bbb/ccc/ddd3456.html (これは正しい)

しかし、以下の正規表現も有効にすると。

<LocationMatch ^(?!.*\.html$)/products/(?<cat>.+)/(?<subcat>.+)/(?<subsubcat>.+)((/?)|(./*))$>
ProxyPass balancer://mycluster/search/
ProxyPassReverse balancer://mycluster/search/
</LocationMatch>

アクセスしようとする /products/aaa/bbb/ccc/ の結果、404ページが表示されます。 ここで私は、.htmlで終わらない"/products/aaa/bbb/ccc/"へのすべてのリクエストが、/search/に渡されることを期待しています(含まれるべきその後のパス情報を含む:例えば .../search/compare )。

質問

何が問題なのか、よくわからないのですが。というのも ルビュラー は、提供された正規表現が正しいです。

何が足りないのでしょうか?

これを解決するためのアドバイスがあれば、ぜひお願いします

解決方法は?

正規表現が少し寛容すぎるようです。 .+ の中で、cat/subcat/subsubcat を少し制限する必要があります。また、最終的な表現に若干の誤りがあります。 ("./*") であるべきで、これは ("/.*") :

Working LocationMatchです。

<LocationMatch ^(?!.*\.html$)/products/(?<cat>([A-Za-z0-9\-\_])+)/(?<subcat>([A-Za-z0-9\-\_])+)/(?<subsubcat>([A-Za-z0-9\-\_])+)((/?)|(/.*))$>
ProxyPass balancer://mycluster/search/
ProxyPassReverse balancer://mycluster/search/
</LocationMatch>