Apache で「プライベート」ディレクトリにアクセスできない

Apache で「プライベート」ディレクトリにアクセスできない

ディレクトリはprivateDocumentRoot の下にあり、その名前にもかかわらず、他のディレクトリと同じようにアクセスできるはずです。ただし、RewriteRulehttpd.conf に次の内容を追加すると:

RewriteRule ^/([^\.]+)$ /$1.html [L]

Apacheは403を返しますhttp://server/private/2201エラーログには次のように記載されています

client denied by server configuration: /private/2201.html

その後、名前privateを に変更するかfoo、2201.html を直接要求すると、ファイルが提供されます。

127.0.0.1 - - [21/Nov/2011:10:24:45 +0100] "GET /private/2201 HTTP/1.1" 403 214
127.0.0.1 - - [21/Nov/2011:10:24:58 +0100] "GET /foo/2201 HTTP/1.1" 200 3068
127.0.0.1 - - [21/Nov/2011:10:27:39 +0100] "GET /private/2201.html HTTP/1.1" 200 3068

これは混乱を招きます。 という名前のディレクトリには特別なルールがありますかprivate? もしそうなら、なぜ 2201.html への直接リクエストが機能するのでしょうか (少なくともエラー ログ エントリによると、拒否されたリクエストは同じリソースを処理しているように見えますが)?

答え1

私の知る限り、Apache や mod_rewrite には、名前を特別なものにする機能は組み込まれていませんprivate。しかし、設定によっては、その名前を別の方法で扱うデフォルトのルールが設定されている可能性があります。設定で という単語を grep してみてくださいprivate。例:

grep private /etc/httpd/httpd.conf  # RedHat, CentOS
grep -r private /etc/apache2        # Debian, Ubuntu, etc.

一致する RewriteRule が見つかった場合、それが原因です。

privateログ エントリを見ると、問題の原因となっているのは特に名前であり、リクエストが拒否される原因は RewriteRule であることがわかります。

答え2

これはRTMの恥ずかしい事例です。Apacheのドキュメントでは書き換えルール少なくともディレクトリ コンテキスト外で RewriteRule を定義する場合、置換文字列は「ルートまたはファイル システムに www という名前のディレクトリが存在しない限り URL パスとして扱われ、存在する場合はファイル システム パスとして扱われる」と明示的に述べています。

私のファイルシステムには が含まれています/privateが は含まれておらず/foo、URL は/private/2212.htmlRewriteRule の影響を受けないため、上記のパターンが予想されるはずです。

解決策は旗を追加することだった[ポルトガル語](パススルー) を RewriteRule に追加します。

関連情報