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


11

非常に基本的な構成で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にディレクトリが存在しないため、Apacheが戻ってきたようですindex.phpが、すべてのリクエストが呼び出され/index.php200 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/

そして、レスポンスボディには何があり/blaますか?
zerkms 2014年

そのとき問題を理解しているのかわかりません:-S
zerkms 2014年

念のために言っておきますが、どのバージョンのApacheを使用していますか?
ジェニーD

@JennyD 2.4.7で実行しています。
Jack

回答:


8

私もこれに答えています。問題が内部でどのように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の更新

修正は 2.5に予定のプロジェクト、に提出されました。2.4にも移植される可能性があります。

2015-05-18の更新

次の理由により、修正は元に戻さました。

[...]それが[少なくとも] FallBackResourceキックする前にキックする原因にmod_autoindexなります。

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


エラーはfixup_dir()、FallbackResource を無視することです。
リッキービーム

@RickyBeamはい。しかし、技術的にfixup_dir()はを知らないはずなfixup_dflt()ので、「もっと上」に修正するのがいいでしょう:)
Jack

7

設定は正しいはずです。

奇妙なことに、問題はmod_deflateのようです

ここで構成を正常に再現した後(404を取得しない)、5秒の遅延も発生しました。しかし、UA gzipがAccept-Headersから省略されると、ページが瞬時に表示/受信されることに気付きました。これを自分でテストできますwget

興味深いことに、さらにデバッグを行うとstrace、Apache FallbackResource両方のケースで遅延に顕著な違いなしにコンテンツをクライアントのソケットに送信します。これは回線上でも明らかであり、HTTPリクエストの後でサーバーからクライアントに返信パケットが著しく遅延することなく送信されます1

ただし、この場合にmod_deflateを使用する場合、UAはサーバーから送信されたデータがいつ終了するかを認識していないため、TCP接続がタイムアウトする2前に何もレンダリングせず、サーバーによって強制的に閉じられます。これはHTTP / 1.0に準拠しており、閉じられた接続はコンテンツの終わりを示します。

以下のためにHTTP / 1.1、サーバが他の持っている終わりの内容を通知するために利用可能な手段を - しかし、のどれもが、ここで起きているように見えるん

ただし、バグがmod_dirまたはmod_deflateに潜んでいるかどうかは、現時点で利用できる時間を超えています。gzip圧縮を無効にすることで、問題なく動作しました。問題が完全に修正されるまでの回避策として、gzipを選択的に無効にすることができます。

1)これは、問題がサーバー上のフラッシュされていないバッファーに起因するものではないことを示しています。
2)デフォルトでは、タイムアウトはapacheで5秒です-ここから5秒が始まります。


ありがとう。5秒の遅延の問題は私の主な問題の二次的なものです。問題をローカルで再現する方法を使用して質問を更新しました。
Jack
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.