nginx कॉन्फ़िगरेशन में $ uri से स्थान ब्लॉक कैसे निकालें?


16

मेरे पास मेरी एनजीक्स conf फाइल में एक फिर से लिखना है जो ठीक से काम करता है सिवाय इसके कि यह $ uri वैरिएबल के हिस्से के रूप में लोकेशन ब्लॉक को शामिल करता है। मुझे केवल लोकेशन ब्लॉक के बाद रास्ता चाहिए। मेरा वर्तमान कॉन्फ़िगरेशन कोड है:

location /cargo {
    try_files $uri $uri/ /cargo/index.php?_REWRITE_COMMAND=$uri&args;
}

http://localhost/cargo/testpageरीडायरेक्ट कार्यों के उदाहरण url का उपयोग करते हुए , हालांकि मेरी php फ़ाइल द्वारा प्राप्त "_REWRITE_COMMAND" पैरामीटर का मान "/ कार्गो / टेस्टपेज" है। मुझे लोकेशन ब्लॉक को अलग करने की जरूरत है और बस $ uri के रूप में "टेस्टपेज" होना चाहिए

मुझे पूरा यकीन है कि $ uri को विभाजित करने और $ 1 $ 2 आदि का उपयोग करके एक नए चर को असाइन करने के लिए एक रेगेक्स सिंटैक्स है, लेकिन मुझे रीजेक्स का उपयोग करके केवल एक चर असाइनमेंट करने के लिए कोई उदाहरण नहीं मिल सकता है जो फिर से लिखने का हिस्सा नहीं है। बयान। मैं देख रहा हूं और घंटों तक कोशिश कर रहा हूं और मैं अभी इस अंतिम चरण को पार नहीं कर पा रहा हूं।

मुझे यह भी पता है कि मैं इसे आवेदन कोड पर लिख सकता हूं, लेकिन मैं इसे nginx conf में ठीक करने का प्रयास करना चाहता हूं, क्योंकि यह अपाचे पर भी चलता है। मैं भी कहना चाहिए कि मैं यह करने के एक बहुत hacky तरीका खोज निकाला है, लेकिन यह फ़ाइल अस्तित्व और प्रलेखन के लिए जाँच करने के लिए एक "अगर" बयान शामिल है विशेष रूप से कहते हैं नहीं इसे उस तरह से करते हैं।

जवाबों:


18

अपने आस-पास देखने से मुझे लगता है कि कैप्चर के साथ रीजैक्स लोकेशन का उपयोग करना सबसे आसान है। आपके उदाहरण को अपनाने के साथ मैं समाप्त हो गया:

location ~ ^/cargo(.*) {
    try_files $1 $1/ /cargo/index.php?_REWRITE_COMMAND=$1&args;
}

अहा, इतना सरल एक बार कोई आपको इंगित करता है! मुझे रूट लोकल पुनर्लेखन को सही स्थान पर संभालने के लिए कुछ छोटे संशोधन करने पड़े। मैंने सवाल का जवाब दिया क्योंकि मैं इस टिप्पणी में कोई प्रारूपण नहीं कर सकता। केवल एक चेतावनी है कि php ब्लॉक को अब इस लोकेशन ब्लॉक से ऊपर होना चाहिए वरना एक अनन्त रीडायरेक्ट लूप बनाया जाता है (/ कार्गो एक रेगेक्स होने के कारण और रीडायरेक्ट यूआरएल में / कार्गो भी होता है)। सुनिश्चित नहीं है कि ऐसा होने से रोकने के लिए एक और तरीका है?
जेसन

मैं regexp और गैर- regexp स्थानों के आदेश पर पढ़ने की सलाह देता हूं। मैं आमतौर पर सभी स्थानों को किसी बिंदु पर regexp बनाने की ओर मुड़ता हूं क्योंकि तब ऑर्डर मैच की विशिष्टता के बजाय कॉन्फ़िगरेशन फ़ाइल में आदेश द्वारा निर्धारित किया जाता है।
औनी

शांत धन्यवाद, मैं कल्पना कर रहा था कि क्या रेगेक्स को ऊपर से बेहतर बना देगा यदि यह मेल / कार्गो / (इंडेक्स.फपी को छोड़कर कुछ भी) से मेल खाता है, तो यह अनंत फिर से लिखने वाले लूप के कारण सर्वर त्रुटि को रोक देगा।
जेसन

3

मुझे एक और चीज़ मिली जो मेरे लिए काम करती थी (जैसा कि मैं gunicorn का उपयोग कर रहा हूं, मैं यह नहीं चुन सकता कि क्या पास करना है)

आप के साथ दूर करने में सक्षम होना चाहिए

location /cargo {
    rewrite ^/cargo(.*)$ $1 break;
    try_files $uri $uri/ /cargo/index.php?_REWRITE_COMMAND=$uri&args;
}

1

उन लोगों के लिए जो इसे नोड सेवा जेएस के साथ माइक्रो सेवा या एपीआई के लिए जोड़ने के लिए संघर्ष कर रहे हैं, मैंने apiअपने सर्वर पर यूआरएल से हटाने के लिए निम्नलिखित का उपयोग किया है:

location ^~ /api {
        rewrite ^/api(/.*)$ $1 break;
        proxy_pass    http://127.0.0.1:3001/;
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.