मैं nginx में एक स्थान कैसे बना सकता हूं जो एक अनुगामी स्लैश के साथ और बिना काम करता है?


46

अभी मेरे पास यह कॉन्फिगर है:

location ~ ^/phpmyadmin/(.*)$
{
        alias /home/phpmyadmin/$1;
}

हालाँकि, अगर मैं यात्रा करता हूं www.mysite.com/phpmyadmin(ध्यान दें कि अनुगामी स्लैश की कमी है), तो मुझे वह नहीं मिलेगा जो मैं 404 में देख रहा हूं। मैं मानता हूं क्योंकि मैं अनुगामी स्लैश को शामिल नहीं करता हूं। मैं इसे कैसे ठीक करूं?


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

जवाबों:


34

यह नियमित अभिव्यक्ति में हो सकता है जिसका आप उपयोग कर रहे हैं -

location ~ ^/phpmyadmin/(.*)$

ऊपर मिलान / phpmyadmin /, / phpmyadmin / कुछ भी / अन्य / यहाँ होगा, लेकिन यह मेल नहीं करेगा / phpmyadmin क्योंकि नियमित अभिव्यक्ति में अनुगामी स्लेश शामिल है।

आप शायद कुछ इस तरह चाहते हैं:

location ~ /phpmyadmin/?(.*)$ {
    alias /home/phpmyadmin/$1;
}

प्रश्न चिह्न एक नियमित अभिव्यक्ति मात्रात्मक है और इसे शून्य या पिछले चरित्र (स्लैश) में से एक से मेल करने के लिए कहना चाहिए।

चेतावनी: समुदाय ने इस समाधान को देखा, जैसा कि एक संभावित सुरक्षा जोखिम के रूप में है


धन्यवाद! और स्पष्टीकरण के लिए धन्यवाद, साथ ही साथ। भविष्य में काम आएगा।
रॉब

15
पैटर्न काफी सही नहीं है। यह "/ phpmyadmin1234" जैसे पथ से भी मेल खा सकता है, जाहिर है कि आप जो चाहते हैं वह नहीं है। @ केबीसी का समाधान सही है।
मेव

3
मुझे यह स्पष्ट रूप से अस्वीकार करने के लिए खेद है, लेकिन @Meow टिप्पणी उपेक्षा के लिए महत्वपूर्ण है। इससे एक गलत वेबसर्वर हो सकता है जिसमें सुरक्षा छेद हो सकते हैं।
डैनियल एफ

34

बेहतर उपाय:

location ~ ^/phpmyadmin(?:/(.*))?$ {
    alias /home/phpmyadmin/$1;
}

सुनिश्चित करें कि सर्वर के पास /home/phpmyadminपहले अनुमति है ।


स्वीकृत उत्तर के साथ अंतर का स्पष्टीकरण:

यह सभी नियमित अभिव्यक्ति के बारे में है ।

सबसे पहले, ^चार का मतलब है कि आप स्ट्रिंग की शुरुआत से मेल खाना चाहते हैं और कहीं बीच में नहीं। $अंत स्ट्रिंग के अंत करने के लिए मिलान साधन पर।

(?:)गैर-कैप्चरिंग समूह का मतलब है - हम इसे कैप्चरिंग परिणामों में नहीं चाहते हैं, लेकिन हम साधारण समूह को कुछ वर्ण बनाना चाहते हैं। हम इसे इस तरह से समूहीकृत करते हैं, क्योंकि हम चाहते हैं /कि बाल मार्ग का निरर्थक हिस्सा हो, न कि मूल मार्ग का महत्वपूर्ण हिस्सा।


यह बेहतर क्यों है?
मियोकी

2
@Meow ने यह स्वीकार किए गए जवाब पर जवाब दिया
kbec

2
यह स्वीकृत उत्तर होना चाहिए
यॉन ट्रिमोरो

@ मीकोही मैंने स्पष्टीकरण लिखा था
kbec

8

आप सिर्फ उपयोग क्यों नहीं करेंगे

location /phpmyadmin {
    alias /home/phpmyadmin;
}

?


क्योंकि वह मेरे लिए काम नहीं कर रहा था। यहाँ देखें: serverfault.com/questions/375602/…
Rob

1
@ क्या आपने निर्देशन में अनुगामी स्लैश के बिना इसे आज़माया alias?
शेन मैडेन

यह वास्तव में सही उत्तर और इसे करने का सही तरीका है। बस अनुगामी स्लैश को बाहर करें और यह अनुगामी स्लेश के साथ और उसके बिना टाइप किए गए यूआरएल के लिए काम करता है। Nginx पर कुछ भी जटिल करने की कोई आवश्यकता नहीं है, इसे सरल, जटिल रेगेक्स और अन्य मज़ेदार चीज़ों को बनाए रखने से Nginx धीमा हो जाएगा।
मिशेल

4
इस के साथ समस्या यह है कि यह भी पर से मेल खाएगी है /phpmyadminblahblahblahblahकिसी भी अन्य संयोजन या
गैरी ग्रीन

6

मुझे पता है कि यह एक पुराना सवाल है, लेकिन Google के माध्यम से यहां समाप्त होने वाले किसी भी व्यक्ति के लिए, मैंने इसे निम्न तरीके से हल किया (@ kbec की विविधता, जो काफी अच्छी थी):

location ~ ^/foo(/.*)?$ {
  proxy_pass http://$backend$1$is_args$args
}

यह किसी भी भिन्नता को पकड़ लेगा /fooऔर इसे /barदूसरे url (पैरामीटर सहित) पर पुनर्निर्देशित करेगा । मैं इसे एक proxy_passनिर्देश के साथ दिखा रहा हूं लेकिन यह भी काम करेगा alias

  • /foo -> /bar
  • /foo/ -> /bar/
  • /foo/sub -> /bar/sub
  • /foo/sub1/sub2/?param=value -> /bar/sub1/sub2/?param=value

यह काम करता है क्योंकि $1वैकल्पिक रूप से उप-स्रोतों और प्रमुख स्लैश को कैप्चर करेगा, इसलिए यह चीजों को कैप्चर नहीं करेगा /fooextra/। यह एक वर्तमान या गैर-वर्तमान समाप्ति स्लैश को ठीक से रीडायरेक्ट करेगा।


1
प्रॉक्सी_पास का उपयोग करने के इच्छुक कोने के मामले पर विचार करने के लिए धन्यवाद और इस प्रकार तर्कों के बारे में देखभाल करना। आपने मेरा उत्थान किया है।
डैनियल एफ

2

यह पुनर्निर्देशन केवल अनुलग्‍नक स्लैश के साथ और बिना URL को फिर से लिखेगा। स्लैश के बाद जो कुछ भी आता है वह ओवरराइट नहीं किया जाएगा।

domain.com/location => domain.com/new/location
domain.com/location => पर पुनर्निर्देशित domain.com/new/location
domain.com/location/other => पुनर्निर्देशित नहीं

server {
  # 301 URL Redirect
  rewrite ^/location/?$ /new/location permanent;
}


0

मैंने ऐसा ही किया

rewrite ^/promo/?$     http://example.com/promo/page43902.html;
location /promo/ {
    root /var/www;
}

0

दो पुनर्लेखन को सरलता से क्यों न कहें:

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