web-dev-qa-db-ja.com

Apache構成(httpd.conf)で複数の<Directory>セクションはどのように機能しますか?

たとえば、私の '/etc/Apache2/httpd.conf'が次のようになっている場合:

<Directory />
    AllowOverride None
</Directory>

<Directory /home>
    AllowOverride FileInfo
</Directory>

後者のAllowOverrideルールは、/homeディレクトリの前のルールをオーバーライドします。その部分は明らかです。

しかし、httpd.confファイルが次のようになっているとどうなりますか?

<Directory /var/www/example.com/public>

    AllowOverride None
    Options -MultiViews

    <IfModule mod_rewrite.c>

        RewriteEngine On
        RewriteBase /

        [...]

    </IfModule>

    [...]

</Directory>

<Directory /var/www/example.com/public/wp-content/cache/minify>
    <IfModule mod_rewrite.c>

        # WHY IS 'RewriteEngine On' REQUIRED?
        RewriteEngine On

        RewriteBase /wp-content/cache/minify/
        RewriteRule [...]

    </IfModule>
</Directory>

質問:

  1. 最初のRewriteEngine Onセクションの<Directory>は、後者がサブディレクトリであることを考えると、2番目の<Directory>セクションにも適用されるはずではありませんか?しかし、2番目のRewriteEngine Onセクションにも<Directory>ルールを追加する必要があることに気付きました。

  2. これは、すべての一般的なルールを最初の<Directory>セクションから2番目の<Directory>セクションにもコピーする必要があることを意味しますか?たとえば、AllowOverride NoneOptions -MultiViewsなどです。

3
its_me

1.最初のRewriteEngine Onセクションの<Directory>は、2番目の<Directory>セクションにも適用されるはずではありませんか?後者はサブディレクトリであると考えられますか?しかし、2番目のRewriteEngine Onセクションにも<Directory>ルールを追加する必要があることに気付きました。

Jon Linによるこの回答RewriteOptions Inheritディレクティブの機能は目を見張るものであり、間接的にこの質問に回答します。

"通常、特定のサブディレクトリに.htaccessファイルがある場合、親ディレクトリの[mod_rewrite構成設定]は置き換えられ、適用されません。"

関連リンク:

2.これは、すべての共通ルールを最初の<Directory>セクションから2番目の<Directory>セクションにもコピーする必要があることを意味しますか?たとえば、AllowOverride NoneOptions -MultiViewsなどです。

いいえ、「/ var/www/example.com/public」(<Directory /var/www/example.com/public>セクションで設定)のすべてのルールがそのサブディレクトリにも適用されるため、それらを<Directory /var/www/example.com/public/wp-content/cache/minify>セクションに再度コピーする必要はありません。 。

これを見つけるのは簡単でした。

これをhttpd.confの<Directory /var/www/example.com/public>セクション内に追加しました。

<IfModule mod_headers.c>    
    # Set noindex header for robots.txt
    <FilesMatch "robots.txt">
        Header set X-Robots-Tag "noindex"
    </FilesMatch>
</IfModule>

次に、robots.txtファイルを「/var/www/example.com/public」および「/var/www/example.com/public/wp-content/cache/minify」ディレクトリにドロップしました。どちらもnoindexHTTPヘッダーで提供されました。

2
its_me