web-dev-qa-db-ja.com

正規表現を使用したApache 2.4 <Directory>-代替演算子は壊れていますか、混乱していますか?

/opt/lampp/htdocs/proj1パスワードで保護されている/opt/lampp/proj2AuthType Basicなどのドキュメントルートディレクトリがいくつかあります。 uploadsサブディレクトリツリーにパスワードを要求しないようにします。 privateuploadsサブディレクトリツリーは、アクセスを一切許可しないことを除きます。 http://httpd.Apache.org/docs/current/mod/core.html#directory によると:

正規表現は、通常のセクションがすべて適用されるまで考慮されません。次に、すべての正規表現は、構成ファイルに出現した順序でテストされます。

そこで、これらのディレクティブを使用しました。

#==========================================================
# regexp enables access to images without login (needed for wp_sideload_image)
<Directory ~ "/opt/lampp/htdocs/[^/]*/public/(uploads|wp/wp-content/uploads)">
    Require all granted
</Directory>

#==========================================================
# regexp protects private uploads unconditionally
# regexps processed in source order, so MUST BE AFTER ENABLING IMAGES
<Directory ~ "/opt/lampp/htdocs/[^/]*/public/uploads/private">
    Require all denied
</Directory>

私が見つけたのは、Require all deniedディレクティブは有効ではなく、アップロードの下にあるものはすべて、パスワードなしでアクセスできることです。楽しみのために、最初のブロックを作成して、代替表現を削除してみました。

<Directory ~ "/opt/lampp/htdocs/[^/]*/public/uploads">
    Require all granted
</Directory>

そして、驚いたことに(そして嬉しかったことですが)、物事は私が望んだ通りに機能しました。したがって、別の<Directory>を追加することで、元の正規表現の効果を得ることができます。

<Directory ~ "/opt/lampp/htdocs/[^/]*/public/wp/wp-content/uploads">
    Require all granted
</Directory>

それは機能しますが、htdocsの下のレベルに '<Directory>'ワイルドカードを使用して通常の*ブロックを使用することもできます。正規表現形式を使用する方が簡潔だと思いました。ただし、アクセスを許可するディレクティブの後に処理する必要があるため、プライベートセクションには正規表現を引き続き使用します。

元のコードが機能しない理由を誰でも説明できますか? Apacheのドキュメントでは、PCREを使用しており、代替を使用した式はegrepで正常に機能すると述べています。加えて、これらの表現が後続のRequire all deniedにどのように影響するかはわかりません。どちらも正規表現であり、ソースの順序で処理されることになっているためです。したがって、拒否されたディレクティブは、何があってもオーバーライドする必要があります。これは、代替を2つの別個の正規表現ディレクティブに置き換えたときに発生します。私は何が欠けていますか?

編集:私がこれを投稿したとき、"shortest path first"の非正規表現ルールは"Require all denied"が処理されることを保証するために正規表現を使用する必要があることを意味することを考えていた十分遅く。しかし明らかに、"uploads"の下のパスは"uploads/private"の下のパスよりも長い可能性がありますが、その場合は"uploads/private"に一致しないため、これらのパスは禁止されません。したがって、私の実際の状況に対する「最良の」解決策は、単に"regexp"マッチングの使用を完全に排除し、上記の正規表現で示されたものと同様のワイルドカードで3つの通常の"<Directory>"ディレクティブを使用することであると考えていますが、 "[^/]*"シェルワイルドカード付きの正規表現"*"。それはうまく機能し、おそらくマイクロ秒より高速です:-)

ただし、元のコードが機能しなかった理由を知りたい。 "|" regexp演算子を含むディレクティブのApacheの扱いは間違っていたようです。

3
sootsnoot

その質問は、私にかなりのことを混ぜさせました。これは、|演算子を使用して、Apache 2.4で行末として$記号を使用する可能性を利用して、テストしたとおりに期待どおりに機能します。

<DirectoryMatch "/opt/lampp/htdocs/[^/]*/public/(uploads(/[^/]*)?|(wp/wp-content/uploads(/[^/]*)?))$">
    Require all granted
</DirectoryMatch>
<DirectoryMatch "/opt/lampp/htdocs/[^/]*/public/uploads/private">
    Require all denied
</DirectoryMatch>

この振る舞いの理由の一部は理解できたと思いましたが、実際には理解できませんでした。これは、Apacheメーリングリストに尋ねることになると思います。

1
Zimmi

私の唯一の提案は、正規表現に括弧を追加してみることです。

<Directory ~ "/opt/lampp/htdocs/[^/]*/public/(uploads|(wp/wp-content/uploads))">

|/を使用した操作の順序が問題の一部である可能性があります。

0