非常に基本的な構成でApache 2.4.7に仮想ホストを設定しました。
<VirtualHost *:80>
ServerName foo.example.com
DocumentRoot /var/www/html
DirectoryIndex index.php
FallbackResource /index.php
</VirtualHost>
ドキュメントルートの下には、次の構造があります。
/index.php
/help/readme.txt
リクエストすると次のような結果になります。
/bla -> 200 OK
/help/ -> 404 Not Found
/help/a -> 200 OK
/help/
がないため、404
ディレクトリが存在するため、Apacheはindex.php
を返しますが、すべてのリクエストが/index.php
を呼び出すため、 200 OK
レスポンス。
mod_rewrite
を使用するときにこれが問題であったことは覚えていませんが、可能であればFallbackResource
を使用することをお勧めします。これを修正する方法はありますか?
更新
DirectoryIndex
ディレクティブを削除すると機能しますが、 5秒の遅延の問題 の影響を受けます。
更新3
次のテスト環境を実行しています。ディレクトリ構造は次のとおりです。
./htdocs
index.html
test/
bla.txt
./conf
httpd.conf
./logs
httpd.conf
の内容は次のとおりです。
ServerName Apache-bug.local
Listen 8085
DirectoryIndex disabled
DirectorySlash Off
<VirtualHost *:8085>
DocumentRoot /home/user/Apache-bug/htdocs
FallbackResource /index.html
</VirtualHost>
私のconfig.Nice
に含まれるもの:
"./configure" \
"--enable-debugger-mode" \
"--with-apr=/usr/local/apr/bin/apr-1-config" \
"--enable-dir=static" \
"--with-mpm=prefork" \
"--enable-unixd=static" \
"--enable-authn-core=static" \
"--enable-authz-core=static" \
"$@"
サーバーを実行するには:
httpd -X -d /home/user/work/Apache-bug/
この問題はmod_dir.c
の動作に関連していると確信している 内部的に であり、 バグ だと思うので、私もこれに自分で回答している。
リソースをローカルファイルシステムにマップできない場合、関数 fixup_dflt()
が実行され、FallbackResource
を使用して代わりにロードするドキュメントを決定します。
ただし、リソースをローカルファイルシステムにマップでき、それがディレクトリである場合、 fixup_dir()
を実行してドキュメントを解決しようとします。 ;この関数は、最初の適切なドキュメントが見つかるまで、DirectoryIndex
値のリストを反復処理します。
私の場合、構成にはDirectoryIndex
値の空のリストがあるため、fixup_dir()
は失敗し、404が返されます。
次のパッチは私のために機能します( [〜#〜] pr [〜#〜] ):
static int dir_fixups(request_rec *r)
{
if (r->finfo.filetype == APR_DIR) {
- return fixup_dir(r);
+ if (fixup_dir(r) != OK) {
+ /* use fallback */
+ return fixup_dflt(r);
+ }
+
+ return OK;
}
else if ((r->finfo.filetype == APR_NOFILE) && (r->handler == NULL)) {
/* No handler and nothing in the filesystem - use fallback */
return fixup_dflt(r);
}
return DECLINED;
}
基本的に、fixup_dflt()
が失敗した後、fixup_dir()
を試行します。
A fix がプロジェクトに送信され、2.5の予定です。 2.4にも移植される可能性があります。
修正は 元に戻されました です:
[...] [少なくとも]
mod_autoindex
が開始する前にFallBackResource
が開始します。
私はまだこのような状況を回避する方法を理解しようとしています。
設定は正しいはずです。
奇妙なことに、問題はmod_deflateのようです。
ここで構成を正常に再現した後(404を取得しない)、5秒の遅延も発生しました。しかし、UAがAccept-Headersからgzip
を省略すると、ページが瞬時に表示/受信されることに気付きました。 wget
を使用して、これを自分でテストできます。
興味深いことに、strace
を使用してさらにデバッグすると、ApacheがFallbackResource
のコンテンツをクライアントのソケットに送信し、bothの遅延に大きな違いはありませんケース。これは回線上でも明らかであり、HTTPリクエストの後に顕著な遅延なしにサーバーからクライアントに応答パケットが送信されます。1。
ただし、この場合にmod_deflateを使用すると、UAはサーバーから送信されたデータがいつ終了するかを認識できないため、TCP接続がタイムアウトするまで何もレンダリングしません。2 サーバーによって強制的に閉じられます。これはHTTP/1.0に準拠しており、閉じられた接続はコンテンツの終わりを示します。
HTTP/1.1の場合、サーバーには他の コンテンツの終わりを通知する手段 –しかし、どれもここでは起こらないようです。
ただし、バグがmod_dirまたはmod_deflateに潜んでいるかどうかは、現時点で私が利用できる時間を超えています。 gzip圧縮を無効にすることで、問題なく動作しました。問題が完全に修正されるまでの回避策として、gzipを選択的に無効にすることができます。
1)これは、問題がサーバー上のフラッシュされていないバッファーから発生したものではないことを示しています。
2)デフォルトでは、Apacheのタイムアウトは5秒です-ここから5秒が始まります。