web-dev-qa-db-ja.com

ディレクトリが存在する場合でもFallbackResourceを使用します

非常に基本的な構成で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/
11
Jack

この問題は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()を試行します。

2015-04-21の更新

A fix がプロジェクトに送信され、2.5の予定です。 2.4にも移植される可能性があります。

2015-05-18の更新

修正は 元に戻されました です:

[...] [少なくとも] mod_autoindexが開始する前にFallBackResourceが開始します。

私はまだこのような状況を回避する方法を理解しようとしています。

8
Jack

設定は正しいはずです。

奇妙なことに、問題は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秒が始まります。

7
Roman