नगीनक्स में फॉलबैक एरर पेज कैसे सेट करें?


10

मैं इस समय कुछ त्रुटि पृष्ठों और अन्य "डिफ़ॉल्ट" मीडिया फ़ाइलों (जैसे 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 संपादित करें:

मैंने एक समाधान पोस्ट किया जो मेरे मूल विचार के बहुत करीब है।

जवाबों:


10

मैंने अपने मूल विचार के बहुत करीब जाने के साथ अंत किया। कुंजी मुझे याद आ रही थी निर्देश के रूप में recursive_error_pages। मुझे वास्तव में यह करना था कि यह "चालू" था और मेरे मूल विचार ने काम किया। यहां बताया गया है कि मेरे कॉन्फिडेंस का प्रासंगिक हिस्सा अब कैसा दिखता है:

server {
    ...

    root /var/www/someserver.com/;

    error_page 400 404      /404.html;
    error_page 500 502 504  /500.html;
    error_page 503          /503.html;

    recursive_error_pages   on;

    location ~* ^/(404\.html|500\.html|503\.html)$ {
        log_not_found off;
        error_page 404 = @default;
    }

    location @default {
        log_not_found on;
        root /var/www/default;
    }
}

मैंने अन्य त्रुटि प्रकारों को शामिल किया जो मेरे मूल प्रश्न का हिस्सा नहीं थे क्योंकि यह वही है जो मुझे मार्टिन एफ के दृष्टिकोण के साथ कठिनाइयों का कारण बना, जो अन्यथा उत्कृष्ट था। log_not_foundनिर्देश सिर्फ इतना है कि मैं अपने लॉग में 404s नहीं मिलता है जब त्रुटि पृष्ठ मूल जड़ में नहीं पाया जाता है।


यह greate (esp। Re। 404 / POST संयोजन) काम करता है, लेकिन यह HTTP त्रुटि कोड को निगलने लगता है और 200 भेजता है ... क्या आपके पास मेरे जैसा व्यवहार है?
अक्टूबर

2
आप इसके बजाय निकालना log_not_found off;और जोड़ना चाह सकते हैं internal;
एलिक्स एक्सल

समस्या के परिणामस्वरूप POST अनुरोध के साथ आपके द्वारा देखा गया समस्या nginx द्वारा अजीब व्यवहार है, देखें trac.nginx.org/nginx/ticket/824
Robo

5

try_files यहां जाने का रास्ता है। निम्न कॉन्फ़िगरेशन काम करना चाहिए, लेकिन मैंने इसे सिंटैक्स त्रुटियों के लिए परीक्षण नहीं किया है।

server {
    ...
    root /var/www;

    location / {
        try_files /someserver.com$uri /default$uri /someserver.com$uri/ /default$uri/ @notfound;
    }

    location @notfound {
       try_files /someserver/404.html /default/404.html =404; # =404 should make it use the nginx-default 404 page.
    }
}

हां, बस यही मेरी जरूरत थी। मैंने try_files का उपयोग करने की कोशिश की थी, लेकिन आपके जवाब ने मुझे एहसास दिलाया कि मुझे इसके लिए एक विशेष आंतरिक स्थान बनाने की आवश्यकता है। मैंने अपने जवाब को मेरे लिए काम करने वाले कॉन्फ़िगरेशन को दिखाने के लिए संपादित किया है, जिसमें आपके द्वारा सुझाए गए कुछ ट्विक्स हैं।
जिम डी

ऊपर मेरे संपादन 2 देखें। मैं जो बता सकता हूं, यह सुझाव POST अनुरोधों के साथ काम नहीं करता है। चूँकि try_files मूल अनुरोध की अनुरोध विधि का उपयोग करता है, आप 405 Not Allowed प्रतिक्रिया के साथ समाप्त होते हैं।
जिम डी

@JDD: वैसे आप इस दृष्टिकोण का बिल्कुल उपयोग नहीं करते हैं, आप एक संशोधित का उपयोग करते हैं। यह मेरे लिए काम करता है। अपने Nginx बाइनरी को अपग्रेड करने का प्रयास करें यदि यह 0.8.x से अधिक पुराना है
मार्टिन फेजर्डवाल्ड

खैर, समस्या यह है कि मैं इसे केवल 404 से अधिक के लिए उपयोग कर रहा हूं, यही कारण है कि मुझे त्रुटि_पृष्ठ -> स्थान -> try_files स्थान के बजाय -> try_files -> स्थान -> try_files जैसा कि आप हैं। मैं एक पैकेज से 0.7.x बाइनरी पर हूं, इसलिए मैं इसे स्रोत से बनाने की कोशिश करूंगा और देखूंगा कि क्या यह हल करता है।
जिम डी

2

दुर्भाग्य से मैं अपने उत्तर के साथ कुछ साल देर कर रहा हूं, लेकिन मुझे लगा कि यह भविष्य के खोजकर्ताओं की मदद कर सकता है। मेरा स्थापित Nginx संस्करण 1.2.4 है, और मैंने निम्नलिखित कॉन्फ़िगरेशन स्निपेट बनाया है,

server {

server_name www.example.com
root /var/www/example


## Errors -> Locations
error_page   400 /400.html;
error_page   403 /403.html;
error_page   404 /404.html;
error_page   500 502 503 504 /50x.html;

## Locations -> Fallback
location = /400.html {
    try_files /400.html @error;
    internal;
}
location = /403.html {
    try_files /403.html @error;
    internal;
}
location = /404.html {
    try_files /404.html @error;
    internal;
}
location = /50x.html {
    try_files /50x.html @error;
    internal;
}

## Fallback Directory
location @error {
    root /var/www/error;
}

}

1
का अच्छा उपयोग internal
क्लिंट पचेल

0

मैंने पाया कि इसमें "xy_intercept_errors; "शामिल करना महत्वपूर्ण था। किसी भी स्थान ब्लॉक में जहां error_page भी शामिल था।

इस सेटिंग के बिना, फिर लोकेशन ब्लॉक अपस्ट्रीम से वापस आने वाले एरर कोड्स को इंटरसेप्ट करेगा।

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_intercept_errors

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.