<Directory>と<DirectoryMatch>(およびその他の<* Match>ディレクティブ)の明示的な違い


8

序文

私はウェブサーバーに関しては初心者です。私は、Apache2サーバーをセットアップして、現在、ドキュメントを熟読しています。

私は気づいた<Directory><Location><Files>ディレクティブそれぞれ持って対応<*Match>:ディレクティブ<DirectoryMatch><LocationMatch>および<FilesMatch>それぞれ。表面上の違いは十分に明らかです:

  • <*Match> ディレクティブは引数として正規表現を使用します
  • 非一致ディレクティブは、引数としてプレーンな文字列またはシェルスタイルのグロブを取ります。

奇妙なことに、非マッチディレクティブの前に「〜」が付いている場合、引数として正規表現を指定することできます。したがって、次の2行は同一である必要があります。

# From the Apache2 docs
<Directory ~ "^/www/[0-9]{3}"> ... </Directory>
<DirectoryMatch "^/www/[0-9]{3}"> ... </DirectoryMatch>

ご質問

私が知りたいのは、Apacheのcoreドキュメントで言及されていないことを知っておくべき微妙な違いや重要な違いがあるかどうかです。この<DirectoryMatch>セクションでは、1つの微妙な違いについて説明しています。

互換性

2.3.9より前のバージョンでは、このディレクティブはサブディレクトリ(など<Directory>)に暗黙的に適用され、行末記号($)と一致できませんでした。2.3.9以降では、式に一致するディレクトリのみが囲まれたディレクティブの影響を受けます。

それを超えて、私は知りたいです:

  • MatchディレクティブとNon-Matchディレクティブの間に他の違いはありますか?
  • 正規表現が必要な場合、どのディレクティブがより望ましいですか?
  • 他にあなたが適切だと思う情報はありますか?

ノート

  • <DirectoryMatch>そして、<Directory "~">同じであるマージレベル
  • 明示的に言及されていませんが、のように、<Directory "~">名前付きグループと後方参照を使用できます<DirectoryMatch>

回答:


2

違いは、許可されるパラメータタイプにあります。

<Directory directory-path> ... </Directory>

<DirectoryMatch regex> ... </DirectoryMatch>

DirectoryMatch正規表現として任意のパスをコーディングできるようになるため、機能的にはスーパーセットです。反対は真実ではありません。

Directory ~おそらく追加が遅いです。リポジトリで見つかったコミット(commit 07b82419b59d1bb7ba8860b86a2d381d5d1090bc on 1996年11月)に基づいて、このケースはApache 1.2で追加されました

DirectoryMatch その後、Apache 1.3に追加され(1997年7月にコミットa318749e61fda612e883a9ea594459a4517166b8)、より豊富な機能セットが追加されました。

そして、そのコミットで更新されたドキュメントは、正規表現を使用する場合は一致バージョンを優先する必要があることを明確に述べています:

    &lt;Directory ~ &quot;^/www/.*/[0-9]{3}&quot;&gt;
 </pre>

-would match directories in /www/ that consisted of three numbers.<p>
+would match directories in /www/ that consisted of three numbers. In
+Apache 1.3 and later, it is reccomended to use
+<a href="#directorymatch">&lt;DirectoryMatch&gt;</a> instead.<p>

(この「DirectoryMatchを使用することをお勧めします」ステートメントは、1997年8月のコミットで後で削除されました)

DirectoryMatchDirectory ~「通常の」Directoryステートメントの後でのみ処理され、DirectoryMatch後で使用できるデータをキャプチャできるため、依然として優れています。

正規表現を使用しているMatch場合は、一致しないバリアントの特定のケースではなく、正規表現を使用していることが明確になるため、バリアントを使用します。上記の小さな違いの他に、大きな違いはありません。

UPDATEコードが同じことを行いますので、実際には、おそらく何の結果では変化しません。

static const char *dirsection(cmd_parms *cmd, void *mconfig, const char *arg)
{

...

    if (!strcmp(cmd->path, "~")) {
        cmd->path = ap_getword_conf(cmd->pool, &arg);
        if (!cmd->path)
            return "<Directory ~ > block must specify a path";
        r = ap_pregcomp(cmd->pool, cmd->path, AP_REG_EXTENDED|USE_ICASE);
        if (!r) {
            return "Regex could not be compiled";
        }
    }
    else if (thiscmd->cmd_data) { /* <DirectoryMatch> */
        r = ap_pregcomp(cmd->pool, cmd->path, AP_REG_EXTENDED|USE_ICASE);
        if (!r) {
            return "Regex could not be compiled";
        }
    }

したがってr = ap_pregcomp(cmd->pool, cmd->path, AP_REG_EXTENDED|USE_ICASE);、どちらの場合もまったく同じ呼び出しです。


2
「DirectoryMatchはスーパーセットです」-OPは具体的に比較<Directory ~しますが<DirectoryMatch、ではありません<Directory。Apache 2.3.9まで<Directory ~は、$正規表現アンカーをサポートしていたため、おそらくスーパーセットでしたが、サポートして<DirectoryMatchいませんでした。(これもDirectoryMatch、以前のドキュメントで使用の推奨が削除された理由である可能性がありますか?)
MrWhite

2
" 「通常の」ステートメントの後でのみ処理されるDirectoryMatchためDirectory ~、依然として優れておりDirectoryDirectoryMatch後で使用できるデータをキャプチャできます。" -しかし、OPによって指摘されているように、これらのディレクティブはこれらの両方の点で同じです。
MrWhite 2018年

1
私はそれDirectoryMatchが読みやすく、したがって好ましい(以上Directory ~)ことに同意します。ドキュメントはこれを明示的に述べていませんDirectoryMatchが、最近のすべての例(たとえば、構成セクションページ)で使用されDirectory ~、言及されることはありません。ただし、ドキュメントには、同様の名前が付けられてLocationMatchおり、これらのディレクティブのFilesMatch対応する~バージョンよりも望ましいと明記されています。
MrWhite 2018年

@MrWhite DirectoryMatch$Apache 2.3.9以前のアンカーをサポートしていませんでしたか?私が見つけたコミットは、これまでのところ、Apache 1.2 / 1.3に関連しています。
Patrick Mevzek 2018年

1
はい、OPで述べられているように(2.4 docsから)、初期の例には<Directory ~文字列の終わりのアンカーも含まれていました。はい、これらのコミットは1.2 / 1.3からのものです。:) が導入されたときに、Apache 1.3のドキュメントにも記載DirectoryMatchされています。また、Apache 1.3には(1.2から)正規表現コンテナ(つまり<Directory ~、導入されたばかりの<DirectoryMatch)がどのようにマージされるかに関しても変更がありました。
MrWhite 2018年

1

MatchディレクティブとNon-Matchディレクティブの間に他の違いはありますか?

2つの正規表現バージョン(<Directory ~および<DirectoryMatch)の厳密な違いではありませんが、AllowOverrideand などの一部のディレクティブAllowOverrideListは、プレーン(非正規表現)<Directory>コンテナでのみ許可されます。だから、その除外の両方<Directory ~<DirectoryMatch

リファレンス:https :
//httpd.apache.org/docs/2.4/mod/core.html#allowoverride

<Directory>セクションでのみ使用可能は、正規表現なしで指定さ
AllowOverrideれた<Directory>セクションでのみ有効であり<Location><DirectoryMatch>または<Files>セクションでは無効です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.