mod_rewriteを使用して、任意のレベルのURLパス内の文字列を特定のファイルにマッチさせるには?

2
2022.01.04

どのように表現したらいいのかわからないので、すでに答えを見落としているかもしれませんが、ここに書いておきます...。

ヘルスチェック用の仮想的な何か「ファイル」を作成しようとしています。これにより、アドレスが.../checkのようなもので終わっている場合、サーバーレベルの設定ファイルの特定の場所にある.htmlファイルが提供され、バーチャルホストに関係なく、また/checkの前のパッチにあるもの(この例では)が存在するかどうかに関係なく、マッチします。

https://dns/non-existentPath/moreRandom/check → /var/www/html/someFile.html
http://dns/check → /var/www/html/someFile.html
http://dns/virtualHostThatExists/check → /var/www/html/someFile.html

エラーページやその他のドメイン全体のリソースに使用されるファイルが常に同じ場所にあるように、任意のレベルで照合される擬似的なユニバーサル・アセット・ディレクトリのためにこれを管理しています。

AliasMatch "(.*)/specialDirExample/([^.].*)" "/var/www/html/someLocation/domainWide/assets/$2"

これは完璧に動作します。しかし、/checkの場合は、ディレクトリではなく、ファイルを提供しようとしているので、私の知る限りでは、AliasMatchではなく、書き換えルールが必要になります。ドキュメントを読み始めたところ、書き換え方法は理解できましたが、一定のポイントのみで、どのように「任意のレベル」の部分が入ってくるのか、もしかしたらエイリアスディレクティブの1つが混ざっているべきなのか、理解できませんでした。初心者向けのドキュメントでは、リダイレクトについても言及されていて、ちょっとわかりにくいですね。

どのようにすればいいのか、例を挙げて教えていただけますか?リバースプロキシを使えば簡単に解決できますが、これはプロキシのためのものです。

回答
2
2022.01.04

これは、サーバーのメイン設定(<VirtualHost>コンテナの外)でmod_rewriteを使って行うことができます。

RewriteEngine On

RewriteRule /check$ /var/www/html/someFile.html [L]

/checkで終わる (example.com/check を含む) すべての URL パスは、内部的にファイルパス/var/www/html/someFile.html に書き換えられます。

これはAlias(またはAliasMatch) ディレクティブの前に処理されます。

ただし、子の<VirtualHost>コンテナ(<Directory>コンテナではなく、別の(ディレクトリ)コンテキストで動作します)にも直接mod_rewriteディレクティブがある場合は、サーバ/vHostレベルでのmod_rewrite継承を有効にする必要があります。そうしないと、vHost(子)のmod_rewriteディレクティブがサーバ(親)コンテキストのディレクティブを完全に上書きしてしまいます(そして、上記のルールは決して処理されません)。

例えば、メインサーバーのコンフィグで、上記のRewriteEngineディレクティブの直後。

RewriteOptions InheritDownBefore

これは、子の vHost コンテナ内の mod_rewrite ディレクティブよりも先に、サーバ設定内の mod_rewrite ディレクティブを処理します。(Apache 2.4.8+が必要)

参考までに