Dizin olsa bile FallbackResource kullanın


11

Sanal ana makinemi Apache 2.4.7'de çok temel bir yapılandırma ile kurdum:

<VirtualHost *:80>
  ServerName foo.example.com
  DocumentRoot /var/www/html

  DirectoryIndex index.php
  FallbackResource /index.php
</VirtualHost>

Belge kökünün altında aşağıdaki yapıya sahibim:

/index.php
/help/readme.txt

İstekte bulunduğumda aşağıdaki sonuçları alıyorum:

/bla     -> 200 OK
/help/   -> 404 Not Found
/help/a  -> 200 OK

Görünüşe göre /help/dizinin varlığı Apache'nin geri dönmesine neden oluyor 404çünkü orada yok index.php, ancak tüm isteklerin çağrılmasını /index.phpve böylece bir 200 OKyanıt vermesini bekliyorum .

Bunu kullanırken bir sorun olduğunu hatırlamıyorum mod_rewrite, ancak FallbackResourcemümkünse kullanmayı tercih ederim . Bunu düzeltmenin bir yolu var mı?

Güncelleme

DirectoryIndexDirektifi kaldırırsam çalışır , ancak bu beş saniyelik gecikme sorunlarından muzdariptir .

Güncelleme 3

Aşağıdaki test ortamını çalıştırıyorum; dizin yapısı aşağıdaki gibidir:

./htdocs
   index.html
   test/
      bla.txt
./conf
   httpd.conf
./logs

İçeriği httpd.conf:

ServerName apache-bug.local
Listen 8085

DirectoryIndex disabled
DirectorySlash Off

<VirtualHost *:8085>
DocumentRoot /home/user/apache-bug/htdocs

FallbackResource /index.html
</VirtualHost>

Benim config.niceiçeriğim:

"./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" \
"$@"

Sunucuyu çalıştırmak için:

httpd -X -d /home/user/work/apache-bug/

Peki tepki bedeninde ne için var /bla?
zerkms

O zaman sorunu anladığımdan emin değilim: -S
zerkms

Sadece emin olmak için - hangi Apache sürümünü kullanıyorsunuz?
Jenny D

@JennyD 2.4.7 ile çalışıyorum.
Jack

Yanıtlar:


8

Bunu kendim de cevaplıyorum, çünkü sorunun dahili olarak nasıl mod_dir.cçalıştığıyla ilgili olduğundan eminim ve bunun bir hata olduğunu düşünüyorum .

Bir kaynak yerel dosya sistemine eşlenemiyorsa, işlev fixup_dflt(), FallbackResourcebunun yerine hangi belgenin yükleneceğini belirlemek için kullanılır.

Bir kaynak Ancak, olabilir yerel dosya sistemine eşlenen ve bir dizin var olması, bu çalıştırarak belgeyi çözmeye çalışacaktır fixup_dir(); bu işlev DirectoryIndex, ilk uygun belgeyi bulana kadar değerler listesi üzerinde yinelenir .

Benim durumumda, yapılandırmada boş bir değer listesi var DirectoryIndex, bu yüzden fixup_dir()başarısız olacak ve bir 404 döndürülecek.

Aşağıdaki yama benim için çalışıyor ( 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;
}

Temelde başarısız fixup_dflt()olduktan sonra çalışır fixup_dir().

Güncelleme 2015-04-21

2.5 için planlanan projeye bir düzeltme sunuldu; 2.4'e de taşınabilir.

Güncelleme 2015-05-18

Düzeltme geri alındı çünkü:

[...] [en azından] içeri FallBackResourcegirmeden önce mod_autoindexiçeri girmeye neden olur .

Hala bu tür bir durumdan nasıl kaçınacağımı anlamaya çalışıyorum.


Hata fixup_dir()FallbackResource yok sayılıyor olduğunu söyleyebilirim .
Ricky Beam

Evet @RickyBeam, ama teknik fixup_dir()hakkında bilmek gerekir fixup_dflt()bu yüzden düzeltmek için daha iyidir imho, bu "yüksek yukarı" :)
Jack

7

Yapılandırmanız doğru olmalıdır.

Sorun, garip bir şekilde, mod_deflate gibi görünüyor .

Yapılandırmanızı burada başarıyla oluşturduktan sonra ( 404 almıyorum ), 5 saniyelik gecikmeyi de aldım. Ancak, UA gzip, Kabul Başlıkları'ndan çıkarıldığında sayfanın anında görüntülendiğini / alındığını fark ettim . Bunu kendiniz için test edebilirsiniz wget.

İlginç bir şekilde, daha fazla hata ayıklama strace, apache'nin her iki durumda FallbackResourceda fark edilebilir gecikme farkı olmadan müşterinizin soketine içerik gönderdiğini gösterir . Bu durum, HTTP İsteği'nden sonra kayda değer bir gecikme olmaksızın sunucudan istemciye bir yanıt paketinin gönderildiği kabloda da belirgindir 1 .

Ancak bu durumda mod_deflate kullanıldığında UA, sunucu tarafından gönderilen verilerin ne zaman sona erdiğini bilmiyor ve bu nedenle TCP bağlantısı 2 zaman aşımına uğramadan ve sunucu tarafından zorla kapatılmadan hiçbir şey yapmıyor . Bu, kapalı bir bağlantının içerik sonu olduğunu belirttiği HTTP / 1.0 ile uyumludur.

İçin HTTP / 1.1 , sunucu diğer sahiptir sonu içeriğini sinyal mevcut araçları - burada ne gibi görünüyor hangi ama hiçbiri .

Ancak hata mod_dir veya mod_deflate'te gizleniyor olsun, şu anki zamanımın ötesinde. Gzip sıkıştırmasını devre dışı bırakarak kusursuz çalışmayı başardım; Sorun iyice düzeltilinceye kadar geçici bir çözüm olarak, gzip'i seçerek devre dışı bırakabilirsiniz.

1 ) Bu bize sorunun sunucudaki boşaltılan arabelleklerden kaynaklanmadığını bildirir.
2 ) Varsayılan olarak, zaman aşımı apache ile 5 saniyedir - bu 5 saniyenizin geldiği yerdir.


Teşekkürler. 5s gecikme sorunu ana sorunum için ikincil, soruyu yerel olarak yeniden oluşturmak ile güncelledim.
Jack
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.