मैं इस समय कुछ त्रुटि पृष्ठों और अन्य "डिफ़ॉल्ट" मीडिया फ़ाइलों (जैसे favicon.ico और robots.txt) के नगनेक्स की हैंडलिंग को कॉन्फ़िगर कर रहा हूं और मैं एक छोटी सी समस्या में भाग गया, जिस तरह से मैं कुछ त्रुटि पृष्ठों के लिए काम करना चाहता हूं। ।
मूल रूप से, मैं जो करने की कोशिश कर रहा हूं वह उस सर्वर के लिए रूट के तहत एक सर्वर के लिए कुछ फाइलें परोसता है, जैसे /var/www/someserver.com/robots.txt। यदि वह फ़ाइल मौजूद नहीं है, तो मैं चाहता हूं कि नगणक्स "डिफ़ॉल्ट", यानी /var/www/default/robots.txt पर जाए। यह इस बात का मूल सार है कि मेरे पास कैसे (सफलतापूर्वक) कॉन्फ़िगर किया गया है:
server {
...
root /var/www/someserver.com;
location ~* ^/(robots\.txt)$ {
error_page 404 = @default;
}
location @default {
root /var/www/default;
}
}
यह बहुत अच्छा काम करता है।
मैं त्रुटि पृष्ठों के लिए ऐसा ही करने की कोशिश कर रहा हूं, और मैं ऐसा करने में सक्षम नहीं हूं:
server {
...
root /var/www/someserver.com;
error_page 404 /404.html;
location ~* ^/(404\.html)$ {
error_page 404 = @default;
}
location @default {
root /var/www/default;
}
}
ध्यान दें कि यह "काम" इस अर्थ में करता है कि यदि आप someserver.com/404.html पर जाते हैं, तो यह सबसे पहले /var/www/someserver.com/404.html लोड करने का प्रयास करेगा और फिर / var / www / डिफ़ॉल्ट पर वापस आ जाएगा /404.html यदि यह नहीं मिला। हालाँकि, यदि आप someserver.com/blahblah पर जाते हैं, तो यह केवल 404 पृष्ठ दिखाता है यदि यह /var/www/someserver.com/ में सेट है। यदि वह फ़ाइल मौजूद नहीं है तो यह डिफ़ॉल्ट निर्देशिका में वापस नहीं आता है।
किसी भी तरह, आप शायद वही कर सकते हैं जिसे मैं पूरा करने की कोशिश कर रहा था (इसीलिए मैंने पहला काम उदाहरण में शामिल किया है)।
कोई विचार?
संपादित करें:
मार्टिन एफ के जवाब के आधार पर, यह वही है जो मैंने एक साथ रखा:
# Doesn't work when error page is returned on a POST request
server {
...
root /var/www/someserver.com;
error_page 404 = @notfound;
error_page 500 502 504 = @server_error;
error_page 503 = @maintenance;
location @notfound {
try_files /404.html /../default/404.html =404;
}
location @server_error {
try_files /500.html /../default/500.html =500;
}
location @maintenance {
try_files /503.html /../default/503.html =503;
}
}
यह कमाल का काम करता है। Error_pages और ऊपर दिए गए स्थानों का वास्तविक ब्लॉक एक server_defaults.conf फ़ाइल में है जो हर वर्चुअल होस्ट के साथ शामिल हो जाता है, यही वजह है कि मैंने प्रत्येक स्थान में पथ को हार्ड कोड नहीं किया और चूक के लिए एक सापेक्ष पथ का उपयोग किया।
2 संपादित करें:
इस दृष्टिकोण में एक समस्या है। यदि आप किसी त्रुटि वाले URL पर POST करते हैं, तो POST अनुरोध विधि try_files प्रयासों के साथ भेजी जाती है। यह (मेरे लिए) 405 Not Allowed त्रुटि का परिणाम है, क्योंकि nginx अनिवार्य रूप से केवल उस पृष्ठ को प्राप्त करने के बजाय उदाहरण के लिए /default/500.html पर पोस्ट करने की कोशिश कर रहा है।
3 संपादित करें:
मैंने एक समाधान पोस्ट किया जो मेरे मूल विचार के बहुत करीब है।