私はウェブサーバーに関しては非常に初心者です。私は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以降では、式に一致するディレクトリのみが、囲まれたディレクティブの影響を受けます。
それを超えて、私は知りたい:
<DirectoryMatch>
と<Directory "~">
は同じです マージレベル<Directory "~">
は、<DirectoryMatch>
と同様に、名前付きグループと後方参照を使用できます。違いは、許可されるパラメータータイプにあります。
<Directory directory-path> ... </Directory>
対
<DirectoryMatch regex> ... </DirectoryMatch>
DirectoryMatch
は、任意のパスを正規表現としてコーディングできるため、機能的に賢いスーパーセットです。その反対は真実ではありません。
Directory ~
はおそらく追加が遅れるでしょう。リポジトリで見つかったコミット(コミット07b82419b59d1bb7ba8860b86a2d381d5d1090bc、1996年11月)に基づいて、このケースはApache 1.2で追加されました。
その後、DirectoryMatch
がApache 1.3に追加され(1997年7月にa318749e61fda612e883a9ea594459a4517166b8をコミット)、より豊富な機能セットが追加されました。
そして、そのコミットで更新されたドキュメントは、正規表現を使用する場合は一致バージョンを優先する必要があることを明確に述べています:
<Directory ~ "^/www/.*/[0-9]{3}">
</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"><DirectoryMatch></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);
の呼び出しはまったく同じです。
Matchディレクティブとnon-Matchディレクティブの間に他の違いはありますか?
2つの正規表現バージョン(<Directory ~
と<DirectoryMatch
)の厳密な違いではありませんが、AllowOverride
とAllowOverrideList
などの一部のディレクティブはプレーンでのみ許可されます(非regex)<Directory>
コンテナ。そのため、<Directory ~
と<DirectoryMatch
の両方が除外されます。
参照:
https://httpd.Apache.org/docs/2.4/mod/core.html#allowoverride
<Directory>
セクションでのみ使用可能AllowOverride
は、<Directory>
、<Location>
、または<DirectoryMatch>
セクションではなく、正規表現なしで指定された<Files>
セクションでのみ有効です。