ओपी ने एक उदाहरण पसंद किया। इसके अलावा, @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 भी दायरे से बाहर है!