Nginx एक पथ को दूसरे पर पुनर्निर्देशित करता है


51

मुझे यकीन है कि यह पहले पूछा जा चुका है, लेकिन मुझे ऐसा कोई समाधान नहीं मिला है जो काम करता हो।

एक वेबसाइट ने सीएमएस सेवाओं को बंद कर दिया है, लेकिन एक ही डोमेन है, मैं एक पेज के लिए एक नगीन फिर से कैसे लिखूं?

उदाहरण के लिए

पुराना पेज

http://sitedomain.co.uk/content/unique-page-name

नया पृष्ठ

http://sitedomain.co.uk/new-name/unique-page-name

कृपया ध्यान दें , मैं नहीं चाहता कि सामग्री पृष्ठ के भीतर सब कुछ पुनर्निर्देशित हो, लेकिन शाब्दिक रूप से ऊपर उल्लिखित केवल यूआरएल है। मेरे पास सेट करने के लिए लगभग 9 रीडायरेक्ट हैं, जिनमें से गैर एक पैटर्न में फिट होते हैं।

धन्यवाद!

संपादित करें: मुझे यह समाधान मिला, जो काम कर रहा है, इस तथ्य को छोड़कर कि यह बिना किसी स्लैश के पुनर्निर्देश करता है:

if ( $request_filename ~ content/unique-page-name/ ) {
   rewrite ^ http://sitedomain.co.uk/new-name/unique-page-name/? permanent;
}

लेकिन यह पुनर्निर्देशित करता है:

http://sitedomain.co.uknew-name/unique-page-name/

जवाबों:


87

नुकसान और आम गलतियाँ से प्रत्यक्ष उद्धरण : कर छूट :

रिटर्न डायरेक्टिव का उपयोग करके हम नियमित अभिव्यक्ति के मूल्यांकन से पूरी तरह बच सकते हैं।

कृपया स्थायी रीडायरेक्ट के returnबजाय उपयोग करें rewrite। यहाँ इस उपयोग के मामले में मेरा दृष्टिकोण है ...

location = /content/unique-page-name {
  return 301 /new-name/unique-page-name;
}

1
यह निश्चित रूप से अधिक पठनीय है। क्या यह उन मूल प्रश्नों को भी बनाए रखेगा जो मूल URL पर थे?
स्टीव एडसन

1
नहीं। यह नहीं होगा यदि आप वास्तव में स्थायी पुनर्निर्देशन पर किसी भी प्रश्न को बनाए रखना चाहते हैं, तो यह छोटी सी चाल देखें ... gist.github.com/pothi/7152399
Pothi Kalimuthu

1
क्या मैं यह सोचने में सही हूँ कि ifnginx में कथनों का उपयोग करना बुरा है? क्या यह अभी भी पुनर्लेखन विधि का उपयोग करने से बेहतर होगा?
स्टीवएडसन

1
ifरिटर्न डायरेक्शन के साथ उपयोग करना पूरी तरह से ठीक है। Wiki.nginx.org/IfIsEvil देखें । हाँ, IMO, यह फिर से लिखने का उपयोग करने से बेहतर है।
पोथी कालीमुथु

13

यदि आप इससे बच सकते हैं तो आदर्श रूप से आपको बयानों का उपयोग नहीं करना चाहिए। कुछ इस तरह से काम कर सकता है (अप्राप्त)।

location ~ /content/(.*)$ {
    rewrite ^ /new-name/$1?$args permanent;
} 

1
क्या वह सामग्री निर्देशिका में सब कुछ नहीं पकड़ेगा? मैं केवल व्यक्तिगत आइटम को पुनर्निर्देशित करना चाहता हूं। उदाहरण के लिए, मेरे पास सामग्री निर्देशिका में एक और आइटम है, लेकिन मुझे इसे पुनर्निर्देशित करने की आवश्यकता है ... / अन्य-नया-नाम / अद्वितीय-पृष्ठ-नाम 2
स्टीवन्सन

1
मैंने इसे हल कर लिया है। यह सही ढंग से पुनर्निर्देशित करता है, लेकिन स्क्रिप्ट मार रहा था के बाद यूआरएल mangling था।
स्टीव एडसन

1
आह, मैंने सवाल गलत समझा। मुझे लगा कि आप केवल सामग्री भाग को बदलना चाहते हैं। सिद्धांत वही रहता है। मुझे खुशी है कि आप इसके लिए काम कर रहे हैं।
ग्यूबेल

1
कोई समस्या नहीं है, हालांकि मदद के लिए धन्यवाद, मुझे निश्चित रूप से भविष्य में इसका उपयोग करने की आवश्यकता होगी।
स्टीवएडसन

12

मैंने निम्नलिखित समाधान का उपयोग किया:

rewrite ^(/content/unique-page-name)(.*)$   http://sitedomain.co.uk/new-name/unique-page-name/$2 permanent;

एक इलाज करता है।


8

मेरे लिए यह इस तरह के बराबर चिह्न के बिना काम करता है:

location /old-url {
  return 301 /new-url;
}

2
आपको स्थान ब्लॉक की आवश्यकता नहीं है। बस उपयोग करें rewrite। देखिए @ स्टीवईडसन का जवाब।
PKHunter
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.