ディレクトリはprivate
DocumentRoot の下にあり、その名前にもかかわらず、他のディレクトリと同じようにアクセスできるはずです。ただし、RewriteRule
httpd.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.html
RewriteRule の影響を受けないため、上記のパターンが予想されるはずです。
解決策は旗を追加することだった[ポルトガル語](パススルー) を RewriteRule に追加します。