nginx url पुनर्लेखन: विराम और अंतिम के बीच का अंतर


45

मैं ब्रेक और आखिरी (फिर से लिखना के झंडे) के बीच अंतर को नहीं समझता। प्रलेखन बल्कि संक्षिप्त है। मैंने अपने कुछ कॉन्फ़िगरेशन में दोनों के बीच स्विच करने की कोशिश की है, लेकिन मैं व्यवहार में कोई अंतर नहीं पा सका। क्या कोई इन झंडों को अधिक विस्तार से बता सकता है? अधिमानतः एक उदाहरण के साथ जो एक झंडे को दूसरे पर लहराते समय अलग-अलग व्यवहार दिखाता है।


मुझे उत्तर नहीं पता है, लेकिन जब आप अपना उत्तर प्राप्त करें तो कृपया wiki.nginx.org को अपडेट करें। इसके अलावा, अंग्रेजी भाषा के नगनेक्स मेलिंग सूची काफी सक्रिय है, और इगोर (मुख्य डेवलपर) प्रति माह सैकड़ों सवालों के जवाब देता है, इसलिए शायद वहां पूछें।
ralayter

@rmalayter - यह सवाल nginx मेलिंग सूची पर पूछा गया था। इगोर ने इसका जवाब दिया, लेकिन इसका जवाब मेरे लिए बहुत मायने नहीं रखता था

pubbs.net लिंक टूट गया है क्योंकि डोमेन को ले लिया गया था। क्षमा करें, यह पता लगाने में सक्षम नहीं था कि यह कहाँ इंगित करना चाहिए। ;
तिनो

जवाबों:


40

आपके पास अलग-अलग स्थानों के लिए नियमों को फिर से लिखने के अलग-अलग सेट हो सकते हैं। जब पुनर्लेखन मॉड्यूल मिलता है last, तो यह वर्तमान सेट को संसाधित करना बंद कर देता है और उपयुक्त स्थान (और पुनर्लेखन नियमों के नए सेट) को खोजने के लिए फिर से लिखा गया अनुरोध एक बार फिर से पारित हो जाता है। यदि नियम समाप्त हो जाता है break, तो पुनर्लेखन भी बंद हो जाता है, लेकिन फिर से लिखे गए अनुरोध को किसी अन्य स्थान पर पारित नहीं किया जाता है।

यह है, अगर दो स्थान हैं: loc1 और loc2, और loc1 में एक पुनर्लेखन नियम है जो loc1 को loc2 में बदलता है और इसके साथ समाप्त होता है last, अनुरोध फिर से लिखा जाएगा और स्थान loc2 में पारित किया जाएगा। यदि नियम समाप्त हो जाता है break, तो वह स्थान loc1 से संबंधित होगा।


आप फिर से लिखना अगर ब्रेक का झंडा है, तो यह एक मिलान स्थान ब्लॉक के लिए खोज नहीं करेगा, इस प्रकार यह स्थान loc1 से संबंधित है।
मार्टिन फेजर्डवाल्ड

ठीक ठीक। फिक्स्ड।
मिन्नेव

43

ओपी ने एक उदाहरण पसंद किया। इसके अलावा, @minaev ने जो लिखा, वह केवल कहानी का एक हिस्सा था! तो अब हम शुरू करें...

उदाहरण 1: नहीं (ब्रेक या अंतिम) झंडे

server {
    server_name example.com;
    root 'path/to/somewhere';

    location / {
        echo 'finally matched location /';
    }

    location /notes {
        echo 'finally matched location /notes';
    }

    location /documents {
        echo 'finally matched location /documents';
    }

    rewrite ^/([^/]+.txt)$ /notes/$1;
    rewrite ^/notes/([^/]+.txt)$ /documents/$1;
}

नतीजा:

# curl example.com/test.txt
finally matched location /documents

स्पष्टीकरण:

के लिए rewrite, झंडे वैकल्पिक हैं!

उदाहरण 2: बाहरी स्थान ब्लॉक (विराम या अंतिम)

server {
    server_name example.com;
    root 'path/to/somewhere';

    location / {
        echo 'finally matched location /';
    }

    location /notes {
        echo 'finally matched location /notes';
    }

    location /documents {
        echo 'finally matched location /documents';
    }

    rewrite ^/([^/]+.txt)$ /notes/$1 break; # or last
    rewrite ^/notes/([^/]+.txt)$ /documents/$1; # this is not parsed
}

नतीजा:

# curl example.com/test.txt
finally matched location /notes

स्पष्टीकरण:

स्थान ब्लॉक के बाहर, दोनों breakऔर lastसटीक तरीके से व्यवहार करें ...

  • फिर से लिखने की स्थिति का कोई और पार्सिंग
  • नेगनेक्स आंतरिक इंजन अगले चरण में जाता है ( locationमैच की खोज )

उदाहरण 3: इनसाइड लोकेशन ब्लॉक - "ब्रेक"

server {
    server_name example.com;
    root 'path/to/somewhere';

    location / {
        echo 'finally matched location /';
        rewrite ^/([^/]+.txt)$ /notes/$1 break;
        rewrite ^/notes/([^/]+.txt)$ /documents/$1; # this is not parsed
    }

    location /notes {
        echo 'finally matched location /notes';
    }

    location /documents {
        echo 'finally matched location /documents';
    }
}

नतीजा:

# curl example.com/test.txt
finally matched location /

स्पष्टीकरण:

किसी स्थान ब्लॉक के अंदर, breakध्वज निम्न कार्य करेगा ...

  • फिर से लिखने की स्थिति का कोई और पार्सिंग
  • Nginx आंतरिक इंजन वर्तमान locationब्लॉक को पार्स करना जारी रखता है

उदाहरण 4: अंदर का स्थान ब्लॉक - "अंतिम"

server {
    server_name example.com;
    root 'path/to/somewhere';

    location / {
        echo 'finally matched location /';
        rewrite ^/([^/]+.txt)$ /notes/$1 last;
        rewrite ^/notes/([^/]+.txt)$ /documents/$1;  # this is not parsed
    }

    location /notes {
        echo 'finally matched location /notes';
        rewrite ^/notes/([^/]+.txt)$ /documents/$1;  # this is not parsed, either!
    }

    location /documents {
        echo 'finally matched location /documents';
    }
}

नतीजा:

# curl example.com/test.txt
finally matched location /notes

स्पष्टीकरण:

किसी स्थान ब्लॉक के अंदर, lastध्वज निम्न कार्य करेगा ...

  • फिर से लिखने की स्थिति का कोई और पार्सिंग
  • परिणाम के आधार पर एक अन्य स्थान मैच के लिए Nginx आंतरिक इंजन की तलाश शुरू होती हैrewrite
  • फिर से लिखने की स्थिति का कोई और अधिक पार्सिंग, यहां तक ​​कि अगले स्थान पर मैच!

सारांश:

  • जब rewriteध्वज breakया lastमाचिस के साथ एक शर्त , Nginx किसी भी अधिक पार्स करना बंद कर देता है rewrites!
  • किसी लोकेशन ब्लॉक के बाहर, breakया last, निग्नेक्स एक ही काम करता है (प्रसंस्करण को फिर से लिखना बंद कर देता है)।
  • एक स्थान ब्लॉक के अंदर break, Nginx केवल प्रसंस्करण बंद कर देता है और अब शर्तों को फिर से लिखता है
  • एक स्थान ब्लॉक के अंदर last, Nginx प्रसंस्करण को फिर से लिखना बंद कर देता है और फिर ब्लॉक के एक नए मिलान की तलाश शुरू करता हैlocation ! Nginx भी rewritesनए locationब्लॉक में किसी की अनदेखी !

अंतिम नोट:

मैं कुछ और धार के मामलों (जैसे पुनर्लेखन के साथ वास्तव में आम समस्या 500 internal error) को शामिल करने से चूक गया । लेकिन, यह इस सवाल के दायरे से बाहर होगा। शायद, उदाहरण 1 भी दायरे से बाहर है!


त्रुटि : "nginx.service विफल रहा क्योंकि नियंत्रण प्रक्रिया त्रुटि कोड के साथ बाहर निकल गई।" ... अज्ञात निर्देश "गूंज"
पीटर क्रूस

nginx.com/resources/wiki/modules/echo । कुछ लिनक्स वितरण जैसे कि उबंटू 14.04 इसके बाद इस मॉड्यूल को कुछ पैकेजों (जैसे कि नेग्नेक्स-एक्स्ट्रा) में बंडल करते हैं। मुझे आशा है कि वह मदद करेंगे।
पोथी कालीमुथु

1
उदाहरण 1 में इससे कोई फर्क पड़ेगा कि क्या पुनर्लेखन नियम तीनों स्थान निर्देशों से ऊपर रखे गए थे?
क्रेग हिक्स

1
@ क्रैचिक्स नहीं, यह नहीं होगा। एक पुनर्लेखन नियम में उच्च वरीयता होती है और स्थानों से मिलान होने से पहले इसे निष्पादित किया जाता है।
पोथी कालीमुथु

1
यह सबसे अच्छा जवाब होना चाहिए। इन उदाहरणों का हवाला देकर और नगीने के दस्तावेज को पढ़कर समझना आसान है।
डॉन दिलंगा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.