web-dev-qa-db-ja.com

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

序文

私はウェブサーバーに関しては非常に初心者です。私は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 docs 言及しないでください。 <DirectoryMatch>セクションには、微妙な違いが1つあります。

互換性

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

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

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

ノート

  • <DirectoryMatch><Directory "~">は同じです マージレベル
  • 明示的に言及されていませんが、<Directory "~">は、<DirectoryMatch>と同様に、名前付きグループと後方参照を使用できます。
8
ZeroKnight

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

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

<DirectoryMatch regex> ... </DirectoryMatch>

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

Directory ~はおそらく追加が遅れるでしょう。リポジトリで見つかったコミット(コミット07b82419b59d1bb7ba8860b86a2d381d5d1090bc、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月のコミットで削除されました)

Directory ~は「通常の」DirectoryMatchステートメントの後にのみ処理され、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
Patrick Mevzek

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

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

参照:
https://httpd.Apache.org/docs/2.4/mod/core.html#allowoverride

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

1
MrWhite