भले ही निर्देशिका मौजूद है, FallbackResource का उपयोग करें


11

मैंने अपाचे 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क्योंकि वहाँ कोई नहीं index.phpहै, लेकिन मुझे लगता है कि सभी अनुरोधों को लागू करने /index.phpऔर इस तरह एक 200 OKप्रतिक्रिया प्राप्त करने की उम्मीद है ।

मुझे यह याद नहीं है कि इसका उपयोग करते समय कोई समस्या है mod_rewrite, लेकिन मैं FallbackResourceयदि संभव हो तो उपयोग करना पसंद करता हूं । क्या इसे ठीक करने का कोई तरीका है?

अपडेट करें

अगर मैं DirectoryIndexनिर्देश निकालता हूं तो यह काम करता है , लेकिन यह पांच देरी के मुद्दों से ग्रस्त है ।

अपडेट ३

मैं निम्नलिखित परीक्षण वातावरण चला रहा हूं; निर्देशिका संरचना इस प्रकार है:

./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?
झटके

मुझे यकीन नहीं है कि मैं तब समस्या को समझ रहा हूँ: -S
zerkms

बस यह सुनिश्चित करने के लिए - आप अपाचे के किस संस्करण पर हैं?
जेनी डी

@ जेनीडी मैं 2.4.7 पर चल रहा हूं।
जैक

जवाबों:


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 की अनदेखी करने में है।
रिकी बीम

@ रिकीबीम हां, लेकिन तकनीकी रूप से fixup_dir()इसके बारे में नहीं जानना चाहिए fixup_dflt(), इसलिए इसे "उच्चतर" ठीक करना बेहतर है :) :)
जैक

7

आपका कॉन्फ़िगरेशन सही होना चाहिए।

समस्या, काफी अजीब, mod_deflate प्रतीत होता है ।

बाद यहाँ विन्यास सफलतापूर्वक reproduced होने ( नहीं एक 404 हो रही), मैं भी 5 सेकंड की देरी मिला है। हालाँकि, मैंने देखा कि जब UA gzipअपने स्वीकार-शीर्षकों से हटता है, तो पृष्ठ तुरंत प्रदर्शित / प्राप्त होता है। आप अपने साथ के लिए यह परीक्षण कर सकते हैं wget

दिलचस्प बात straceयह है कि आगे डिबगिंग से पता चलता है कि अपाचे FallbackResourceआपके क्लाइंट की सामग्री को दोनों मामलों में देरी के बिना ध्यान देने योग्य अंतर के लिए भेजता है । यह तार पर भी स्पष्ट है, जहां HTTP उत्तर के बाद क्लाइंट से क्लाइंट को एक नोटरी विलंब 1 के बिना एक उत्तर पैकेट भेजा जाता है ।

ऐसा लगता है कि जब इस मामले में mod_deflate का उपयोग किया जाता है, तो UA को यह नहीं पता होता है कि सर्वर द्वारा भेजा गया डेटा कब समाप्त होता है, और इस तरह टीसीपी कनेक्शन 2 से पहले कुछ भी रेंडर नहीं करता है और सर्वर द्वारा जबरन बंद कर दिया जाता है। यह HTTP / 1.0 के अनुरूप है, जहां एक बंद कनेक्शन अंत-सामग्री को दर्शाता है।

के लिए HTTP / 1.1 , सर्वर अन्य है अंत के संकेत देने के लिए सामग्री उपलब्ध साधनों - जिनमें से यहां होने लगते हैं, लेकिन कोई भी

हालांकि, mod_dir या mod_deflate में बग लर्क को मिटाना मेरे उपलब्ध समय से परे है। मुझे यह गज़िप संपीड़न को अक्षम करके दोषरहित काम करने के लिए मिला; जब तक समस्या को ठीक करने के लिए समाधान के रूप में, आप चुनिंदा रूप से gzip को अक्षम कर सकते हैं।

1 ) यह हमें बताता है कि समस्या सर्वर पर अप्रभावित बफ़र्स से नहीं है।
2 ) डिफ़ॉल्ट रूप से, टाइमआउट अपाचे के साथ 5 सेकंड है - यही वह जगह है जहां से आपके 5 सेकंड हैं।


धन्यवाद। 5s देरी का मुद्दा मेरी मुख्य समस्या के लिए गौण है, मैंने अपने सवाल को स्थानीय स्तर पर कैसे पुन: पेश किया जाए, के साथ अद्यतन किया है।
जैक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.