सवाल रीडायरेक्ट करें, यूपी बदलें या अपाचे में एचटीटीपीएस पर HTTP को रीडायरेक्ट करें - जो कुछ भी आप कभी भी Mod_Rewrite नियमों के बारे में जानना चाहते थे लेकिन पूछने से डरते थे


यह है एक कैननिकल प्रश्न अपाचे के mod_rewrite के बारे में।

एक अनुरोध यूआरएल बदलना या उपयोगकर्ताओं को मूल रूप से अनुरोध किए गए एक अलग यूआरएल पर रीडायरेक्ट करना mod_rewrite का उपयोग करके किया जाता है। इसमें ऐसी चीजें शामिल हैं:

  • HTTP को HTTPS में बदलना (या दूसरी तरफ)
  • एक पृष्ठ पर एक अनुरोध बदलना जो अब एक नए प्रतिस्थापन के लिए मौजूद नहीं है।
  • एक यूआरएल प्रारूप को संशोधित करना (जैसे आईडी = 3433 से / आईडी / 3433)
  • चंद्रमा और सूर्य के नीचे संभव कुछ भी के आधार पर, रेफरर के आधार पर ब्राउज़र पर आधारित एक अलग पृष्ठ प्रस्तुत करना।
  • यूआरएल के साथ आप जो कुछ भी गड़बड़ करना चाहते हैं

Mod_Rewrite नियमों के बारे में आप जो कुछ भी जानना चाहते थे, लेकिन पूछने से डरते थे!

Mod_rewrite नियम लिखने में मैं एक विशेषज्ञ कैसे बन सकता हूं?

  • Mod_rewrite नियमों का मौलिक प्रारूप और संरचना क्या है?
  • नियमित अभिव्यक्तियों के किस रूप / स्वाद के लिए मुझे ठोस समझ की आवश्यकता है?
  • पुनर्लेखन नियम लिखते समय सबसे आम गलतियों / नुकसान क्या हैं?
  • Mod_rewrite नियमों का परीक्षण और सत्यापन करने के लिए एक अच्छी विधि क्या है?
  • क्या mod_rewrite नियमों के एसईओ या प्रदर्शन प्रभाव हैं मुझे अवगत होना चाहिए?
  • क्या ऐसी सामान्य परिस्थितियां हैं जहां mod_rewrite नौकरी के लिए सही उपकरण की तरह प्रतीत हो सकता है लेकिन नहीं है?
  • कुछ आम उदाहरण क्या हैं?

आपके नियमों का परीक्षण करने के लिए एक जगह

htaccess परीक्षक वेब साइट आपके नियमों के साथ खेलने और उन्हें परीक्षण करने के लिए एक शानदार जगह है। यह डीबग आउटपुट भी दिखाता है ताकि आप देख सकें कि क्या मिलान हुआ और क्या नहीं।


257
2017-12-20 16:59


मूल


इस सवाल के पीछे विचार सभी अंतहीन mod_rewrite प्रश्नों के लिए एक करीबी पथ देना है जो हमारे अधिक नियमित उपयोगकर्ताओं को पागल बनाते हैं। यह सबनेटिंग के साथ क्या किया गया था के समान ही है serverfault.com/questions/49765/how-does-subnetting-work । - Kyle Brandt♦
इसके अलावा, मैं वास्तव में इस पर बहुत अधिक अपवित्र नहीं चाहता हूं सवाल, बल्कि उन्हें जवाब पर जाना चाहिए। मैं इसे सीडब्ल्यू नहीं करना चाहता क्योंकि मैं यह सुनिश्चित करना चाहता हूं कि पोस्टर को जो भी उम्मीद है, उसके लिए पूर्ण क्रेडिट प्राप्त हो mod_rewrite सभी mod_rewrite प्रश्नों को समाप्त करने के लिए उत्तर दें। - Kyle Brandt♦
क्षमा करें, मैंने सवाल उठाया। ;-) मुझे सच में लगता है कि इसे शीर्ष पर (या नज़दीक) दिखाना होगा mod-rewrite टैग खोज / फिल्टर। - Steven Monday
किसी और को (टीएम) सामान्य उपयोग-मामलों को संभालना चाहिए। मैं उन्हें न्याय करने के लिए पर्याप्त रूप से नहीं जानता। - sysadmin1138♦
शायद इस सवाल को पथ को कम करने के लिए मॉड-रीराइट टैग विकी में जोड़ा जाना चाहिए। - beldaz


जवाब:


mod_rewrite वाक्यविन्यास आदेश

mod_rewrite में कुछ विशिष्ट ऑर्डरिंग नियम हैं जो प्रोसेसिंग को प्रभावित करते हैं। कुछ भी करने से पहले, RewriteEngine On निर्देश दिया जाना चाहिए क्योंकि यह mod_rewrite प्रसंस्करण पर बदल जाता है। यह किसी भी अन्य पुनर्लेख निर्देशों से पहले होना चाहिए।

RewriteCond पूर्ववर्ती RewriteRule बनाता है कि एक नियम सशर्त के अधीन है। किसी भी निम्नलिखित रिवाइट्रूल्स को संसाधित किया जाएगा जैसे कि वे सशर्त के अधीन नहीं थे।

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html        $/blog/$1.sf.html

इस साधारण मामले में, यदि HTTP रेफरर serverfault.com से है, तो ब्लॉग अनुरोधों को विशेष सर्वरफॉल्ट पृष्ठों पर रीडायरेक्ट करें (हम केवल उस विशेष हैं)। हालांकि, अगर उपरोक्त ब्लॉक में एक अतिरिक्त रिवाइटरूल लाइन थी:

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html        $/blog/$1.sf.html
RewriteRule $/blog/(.*)\.jpg         $/blog/$1.sf.jpg

सभी .jpg फ़ाइलें विशेष सर्वरफॉल्ट पृष्ठों पर जाएंगी, न कि केवल एक रेफरर के साथ जो यह इंगित करती है कि यह यहां से आया है। यह स्पष्ट रूप से यह नहीं है कि ये नियम कैसे लिखे गए हैं। यह एकाधिक रिवाइटकंड नियमों के साथ किया जा सकता है:

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html        /blog/$1.sf.html
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.jpg         /blog/$1.sf.jpg

लेकिन शायद कुछ ट्रिकियर प्रतिस्थापन वाक्यविन्यास के साथ किया जाना चाहिए।

RewriteEngine On
RewriteCond %{HTTP_REFERER}                ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg)        /blog/$1.sf.$2

अधिक जटिल रिवाइट्रूल में प्रसंस्करण के लिए सशर्त शामिल हैं। अंतिम मूलभूत, (html|jpg) किसी भी के लिए मिलान करने के लिए RewriteRule बताता है html या jpg, और पुनर्लेखित स्ट्रिंग में $ 2 के रूप में मिलान की गई स्ट्रिंग का प्रतिनिधित्व करने के लिए। यह पिछले ब्लॉक के लिए तार्किक रूप से समान है, दो रिवाइटकंड / रीवाइटरूल जोड़े के साथ, यह सिर्फ चार की बजाय दो लाइनों पर करता है।

एकाधिक रिवाइटकंड लाइनें पूरी तरह से एंडेड हैं, और स्पष्ट रूप से ऑर्ड किया जा सकता है। सर्वरफॉल्ट और सुपर उपयोगकर्ता (स्पष्ट या) दोनों से रेफरर्स को संभालने के लिए:

RewriteEngine On
RewriteCond %{HTTP_REFERER}                ^https?://serverfault\.com(/|$)    [OR]
RewriteCond %{HTTP_REFERER}                ^https?://superuser\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg)        /blog/$1.sf.$2

क्रोम ब्राउज़र (अंतर्निहित और) के साथ सर्वरफॉल्ट संदर्भित पृष्ठों की सेवा करने के लिए:

RewriteEngine On
RewriteCond %{HTTP_REFERER}                ^https?://serverfault\.com(/|$)
RewriteCond %{HTTP_USER_AGENT}             ^Mozilla.*Chrome.*$
RewriteRule ^/blog/(.*)\.(html|jpg)        /blog/$1.sf.$2

RewriteBase यह आदेश भी विशिष्ट है क्योंकि यह निर्दिष्ट करता है कि निम्नलिखित कैसे है RewriteRule निर्देश उनके प्रसंस्करण को संभालते हैं। यह htaccess फ़ाइलों में बहुत उपयोगी है। यदि उपयोग किया जाता है, तो यह एक .htaccess फ़ाइल में "रिवाइटइंजिन ऑन" के तहत पहला निर्देश होना चाहिए। यह उदाहरण लें:

RewriteEngine On
RewriteBase /blog
RewriteCond %{HTTP_REFERER}           ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg)         $1.sf.$2

यह mod_rewrite को बता रहा है कि वर्तमान में यह विशेष यूआरएल जिस तरह से संभाला जा रहा है, उसके माध्यम से पहुंचा था http://example.com/blog/ भौतिक निर्देशिका पथ (/ home / $ उपयोगकर्ता नाम / public_html / ब्लॉग) के बजाय और इसके अनुसार इसका इलाज करने के लिए। इस वजह से, RewriteRule यह यूआरएल में "/ ब्लॉग" के बाद होने वाली स्ट्रिंग-स्टार्ट मानता है। यहां एक ही बात है जो दो अलग-अलग तरीकों से लिखी गई है। एक रिवाइटबेस के साथ, दूसरा बिना:

RewriteEngine On

##Example 1: No RewriteBase##
RewriteCond %{HTTP_REFERER}                                   ^https?://serverfault\.com(/|$)
RewriteRule /home/assdr/public_html/blog/(.*)\.(html|jpg)     $1.sf.$2

##Example 2: With RewriteBase##
RewriteBase /blog
RewriteCond %{HTTP_REFERER}           ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg)         $1.sf.$2

जैसा कि आप देख सकते हैं, RewriteBase वेब का लाभ उठाने के लिए नियमों को फिर से लिखने की अनुमति देता हैसाइट वेब के बजाय सामग्री के लिए पथ-सर्वर, जो उन फ़ाइलों को संपादित करने वालों के लिए उन्हें अधिक समझदार बना सकता है। इसके अलावा, वे निर्देश कम कर सकते हैं, जिसमें एक सौंदर्य अपील है।


रिवाइटरूल मिलान वाक्यविन्यास

रीवाइट्रूल के पास स्ट्रिंग मिलान के लिए एक जटिल वाक्यविन्यास है। मैं एक और खंड में झंडे ([पीटी] जैसी चीजें) को कवर करूंगा। क्योंकि Sysadmins उदाहरण के द्वारा अक्सर पढ़ने के बजाय सीखते हैं मानव पेज मैं उदाहरण दूंगा और समझाऊंगा कि वे क्या करते हैं।

RewriteRule ^/blog/(.*)$    /newblog/$1

.* किसी एकल चरित्र से मेल खाता है (.) शून्य या अधिक बार (*)। इसेष्ठक में संलग्न करना इसे स्ट्रिंग प्रदान करने के लिए कहता है जो $ 1 चर के रूप में मेल खाता था।

RewriteRule ^/blog/.*/(.*)$  /newblog/$1

इस मामले में, पहला। * माता-पिता में संलग्न नहीं था इसलिए पुनर्लेखित स्ट्रिंग को प्रदान नहीं किया गया है। यह नियम नई ब्लॉग साइट पर निर्देशिका स्तर को हटा देता है। (/blog/2009/sample.html /newblog/sample.html बन जाता है)।

RewriteRule ^/blog/(2008|2009)/(.*)$   /newblog/$2

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

RewriteRule ^/blog/(2008|2009)/(.*)$   /newblog/$1/$2

इस मामले में, हम पुनर्लेखित स्ट्रिंग में $ 1 का उपयोग करते हैं।

RewriteRule ^/blog/(20[0-9][0-9])/(.*)$   /newblog/$1/$2

यह नियम एक विशेष ब्रैकेट वाक्यविन्यास का उपयोग करता है जो एक वर्ण निर्दिष्ट करता है रेंज। [0-9] अंक 0 से 9 तक मेल खाता है। यह विशिष्ट नियम 2000 से 20 99 तक वर्षों को संभालेगा।

RewriteRule ^/blog/(20[0-9]{2})/(.*)$  /newblog/$1/$2

यह पिछले नियम की तरह ही काम करता है, लेकिन {2} भाग इसे पिछले वर्ण (इस मामले में एक ब्रैकेट अभिव्यक्ति) से मेल खाने के लिए कहता है।

RewriteRule ^/blog/([0-9]{4})/([a-z]*)\.html   /newblog/$1/$2.shtml

यह मामला दूसरी मिलान अभिव्यक्ति में किसी भी लोअर-केस अक्षर से मेल खाता है, और ऐसा करने के लिए जितने पात्र हो उतने ऐसा कर सकते हैं। \. निर्माण इस अवधि को वास्तविक अवधि के रूप में पेश करने के लिए कहता है, न कि विशेष उदाहरण यह पिछले उदाहरणों में है। यदि फ़ाइल नाम में इसमें डैश हो तो यह टूट जाएगा।

RewriteRule ^/blog/([0-9]{4})/([-a-z]*)\.html  /newblog/$1/$2.shtml

यह उन जाल में फ़ाइल नामों को डैश करता है। हालांकि, के रूप में - ब्रैकेट अभिव्यक्तियों में एक विशेष चरित्र है, यह होना चाहिए प्रथम अभिव्यक्ति में चरित्र।

RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html   /newblog/$1/$2.shtml

यह संस्करण अक्षरों, संख्याओं या के साथ किसी फ़ाइल नाम का पता लगाता है - फ़ाइल नाम में चरित्र। इस प्रकार आप ब्रैकेट अभिव्यक्ति में एकाधिक वर्ण सेट निर्दिष्ट करते हैं।


रिवाइटरूले झंडे

पुनर्लेखन नियमों पर झंडे के पास विशेष अर्थ और उपयोगकाज हैं

RewriteRule ^/blog/([0-9]{4})/([-a-z]*).\html  /newblog/$1/$2.shtml  [L]

ध्वज है [L] उपर्युक्त अभिव्यक्ति के अंत में। एक अल्पविराम से अलग, एकाधिक झंडे का उपयोग किया जा सकता है। लिंक्ड दस्तावेज प्रत्येक का वर्णन करता है, लेकिन यहां वे वैसे भी हैं:

एल = अंतिम। एक बार यह एक बार मेल खाता है RewriteRules प्रसंस्करण बंद करो। ऑर्डर मायने रखता है!
सी = चेन अगले RewriteRule संसाधित करना जारी रखें। यदि यह नियम मेल नहीं खाता है, तो अगला नियम निष्पादित नहीं किया जाएगा। इस पर और अधिक।
 = पर्यावरण चर सेट करें। अपाचे में विभिन्न पर्यावरणीय चर होते हैं जो वेब-सर्वर व्यवहार को प्रभावित कर सकते हैं।
एफ = निषिद्ध यदि यह नियम मेल खाता है तो 403-निषिद्ध त्रुटि देता है।
जी = चला गया। यदि यह नियम मेल खाता है तो 410-गोन त्रुटि देता है।
एच = हैंडलर। अनुरोध को संभालने का अनुरोध करता है जैसे कि यह निर्दिष्ट एमआईएम-प्रकार था।
एन = अगला। नियम फिर से शुरू करने और फिर से मैच करने के लिए मजबूर करता है। सावधान रहे! लूप्स परिणाम कर सकते हैं।
एनसी = कोई मामला नहीं। की अनुमति देता है jpg जेपीजी और जेपीजी दोनों से मेल खाते हैं।
NE = कोई भाग नहीं। विशेष हेक्स-कोड समकक्षों में विशेष वर्णों (।? # और आदि) के पुनर्लेखन को रोकता है।
एन एस = कोई सबक्वेक्स्ट नहीं। यदि आप सर्वर-साइड-इन का उपयोग कर रहे हैं, तो यह शामिल फ़ाइलों को मैचों को रोक देगा।
पी = प्रॉक्सी। Mod_proxy द्वारा नियम को संभालने के लिए मजबूर करता है। पारदर्शी रूप से अन्य सर्वरों से सामग्री प्रदान करते हैं, क्योंकि आपका वेब-सर्वर इसे प्राप्त करता है और इसे फिर से पेश करता है। यह एक खतरनाक झंडा है, क्योंकि एक खराब लिखित व्यक्ति आपके वेब-सर्वर को ओपन-प्रॉक्सी में बदल देगा और यह बुरा है।
पीटी = के माध्यम से पास करें। RewriteRule मिलान में खाता उपनाम विवरण ले लो।
QSA = QSAppend। जब मूल स्ट्रिंग में एक क्वेरी होती है (http://example.com/thing?asp=foo) रीयल लिखित स्ट्रिंग में मूल क्वेरी स्ट्रिंग संलग्न करें। आम तौर पर इसे त्याग दिया जाएगा। गतिशील सामग्री के लिए महत्वपूर्ण है।
आर = पुनर्निर्देशित करें। निर्दिष्ट यूआरएल पर एक HTTP रीडायरेक्ट प्रदान करें। सटीक रीडायरेक्ट कोड भी प्रदान कर सकते हैं [आर = 303]। बहुत समान है RedirectMatch, जो तेज़ है और जब संभव हो तो इसका इस्तेमाल किया जाना चाहिए।
एस = छोड़ें। इस नियम को छोड़ें।
टी = टाइप करें। लौटाई गई सामग्री के माइम-प्रकार को निर्दिष्ट करें। बहुत समान है AddType निर्देश।

आप जानते हैं कि मैंने यह कैसे कहा RewriteCond एक और केवल एक नियम पर लागू होता है? खैर, आप चेनिंग के माध्यम से चारों ओर मिल सकते हैं।

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html        /blog/$1.sf.html     [C]
RewriteRule ^/blog/(.*)\.jpg         /blog/$1.sf.jpg

चूंकि पहले रिवाइट्रूल में चेन ध्वज होता है, दूसरा पुनरावृत्ति-नियम तब निष्पादित होगा जब पहला करता है, जो पिछला रिवाइटकंड नियम मिलान होता है। यदि अपाचे नियमित-अभिव्यक्ति आपके मस्तिष्क को चोट पहुंचाती है तो हंडी। हालांकि, पहले खंड में इंगित सभी-इन-वन-लाइन विधि ऑप्टिमाइज़ेशन बिंदु से तेज़ है।

RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html   /newblog/$1/$2.shtml

इसे झंडे के माध्यम से सरल बनाया जा सकता है:

RewriteRule ^/blog/([0-9]{4})/([-0-9a-z]*)\.html   /newblog/$1/$2.shtml   [NC]

इसके अलावा, कुछ झंडे भी रिवाइटकंड पर लागू होते हैं। विशेष रूप से, नोकेस।

RewriteCond %{HTTP_REFERER}        ^https?://serverfault\.com(/|$)     [NC]

"ServerFault.com" से मेल खाएगा


219
2017-12-20 17:44



बहुत बढ़िया। [भराव] - EEAA
बहुत अच्छा mod_rewrite और regex प्राइमर। +1। - Steven Monday
कभी-कभी यह जानना उपयोगी होता है कि RewriteCond वास्तव में संसाधित किया जाता है बाद  RewriteRule मिलान किया गया है हो सकता है कि आप "बाद में उस पर अधिक" कहें, जहां आप कहते हैं "रिवाइटकंड से पहले रिवाइटकंड बनाता है कि एक नियम सशर्त के अधीन है।" आप शायद यह उल्लेख करना चाहें कि रेगेक्स पर्ल-संगत नियमित अभिव्यक्ति हैं। इसके अलावा आपके पास एक अपरिपक्व एस्ट्रोफ़े है "... रिवाइटरूल इसे स्ट्रिंग-स्टार्ट मानता है ..." - Dennis Williamson
RewriteRule ^/blog/.*/(.*)$ /newblog/$1 मेल नहीं खाता प्रथम निर्देशिका घटक - पुनरीक्षण डिफ़ॉल्ट रूप से लालची हैं। /.*/(.*) दोनों / 1 / (2) / और / 1/2/3/4/5 / (6) / से मेल खाता है, इसलिए आपको केवल [पथ /] * / केवल पहले पथ से मिलान करने की आवश्यकता है घटक। - adaptr
@ sysadmin1138, मुझे लगता है कि यह जवाब अच्छा है लेकिन यह बेहतर हो सकता है यदि आप उदाहरण के साथ झंडे ई, एन, एनएस, पी, पीटी और एस पर अधिक विस्तृत करते हैं क्योंकि वे झंडे स्पष्ट नहीं हैं कि वे कैसे काम करते हैं आदि। - Pacerier


मौलिक प्रारूप क्या है और   mod_rewrite नियमों की संरचना?

मैं इन बिंदुओं पर sysadmin1138 के उत्कृष्ट उत्तर को रोक दूंगा।

नियमित रूप से किस रूप / स्वाद   अभिव्यक्तियों को मुझे ठोस होने की आवश्यकता है   की समझ?

सिंटैक्स ऑर्डर के अलावा, सिंटैक्स मिलान / नियमित अभिव्यक्तियों के अलावा, और sysadmin1138 द्वारा उल्लिखित रीवाइट्रूल ध्वज, मुझे विश्वास है कि यह उल्लेख करता है कि mod_rewrite HTTP अनुरोध शीर्षलेख और अपाचे की कॉन्फ़िगरेशन के आधार पर अपाचे पर्यावरण चर का खुलासा करता है।

मैं सलाह दूँगा AskApache के mod_rewrite डीबग ट्यूटोरियल चर की व्यापक सूची के लिए जो mod_rewrite के लिए उपलब्ध हो सकता है।

सबसे आम क्या हैं   लिखने के दौरान गलतियों / नुकसान   नियम?

पीसीआरई सिंटैक्स की गलतफहमी से रिवाइटरूले के स्टेम के साथ सबसे अधिक समस्याएं / मिलान के लिए उपयोग किए जाने वाले चर (ओं) की सामग्री में अंतर्दृष्टि की कमी से विशेष रूप से बचने में विफलता।

विशिष्ट समस्याएं और अनुशंसित समस्या निवारण:

  • 500 आंतरिक सर्वर त्रुटि - विंडोज कैरिज नियंत्रण हटाएं यदि कॉन्फ़िगरेशन फ़ाइल में मौजूद है, तो सुनिश्चित करें कि mod_rewrite सक्षम है (इसमें निर्देश लपेटें IfModule इस परिदृश्य से बचने के लिए सशर्त), निर्देशक सिंटैक्स की जांच करें, समस्या की पहचान होने तक निर्देशों पर टिप्पणी करें
  • काफी बार पुनःनिर्देशित करना - समस्या का पता लगाने तक निर्देशों पर टिप्पणी करें, रिवाइटलॉग और रीवाइट लॉगवेल का उपयोग करें

परीक्षण के लिए एक अच्छी विधि क्या है और   mod_rewrite नियमों की पुष्टि?

सबसे पहले, पर्यावरण चर (ओं) की सामग्री को देखें जिनके लिए आप मिलान करना चाहते हैं - यदि आपके पास PHP स्थापित है, तो यह आपके एप्लिकेशन पर निम्न ब्लॉक जोड़ने जैसा आसान है:

<?php
  var_dump($_SERVER);
?>

... फिर अपने नियम लिखें (अधिमानतः विकास सर्वर पर परीक्षण के लिए) और अपने अपाचे में किसी भी असंगत मिलान या गतिविधि को नोट करें त्रुटि संग्रह फ़ाइल।

अधिक जटिल नियमों के लिए, mod_rewrite का उपयोग करें RewriteLog एक फ़ाइल और सेट करने के लिए गतिविधि लॉग करने के लिए निर्देश RewriteLogLevel 3

एसईओ या प्रदर्शन वहाँ हैं   mod_rewrite नियमों के प्रभाव I   के बारे में पता होना चाहिए?

AllowOverride all अपाचे को जांचने के लिए सर्वर प्रदर्शन को प्रभावित करता है .htaccess प्रत्येक अनुरोध के साथ फाइलें और पार्स निर्देश - यदि संभव हो, तो अपनी साइट के लिए वर्चुअलहोस्ट कॉन्फ़िगरेशन में सभी निर्देश रखें या सक्षम करें .htaccess उन निर्देशिकाओं के लिए ओवरराइड करता है जिन्हें उनकी आवश्यकता होती है।

गूगल की वेबमास्टर दिशानिर्देश स्पष्ट रूप से बताएं: "उपयोगकर्ताओं को प्रदर्शित करने के बजाय अपने उपयोगकर्ताओं को धोखा न दें या खोज इंजन पर अलग-अलग सामग्री प्रस्तुत न करें, जिसे आमतौर पर 'क्लोकिंग' कहा जाता है।" - खोज इंजन रोबोट के लिए फ़िल्टर करने वाले mod_rewrite निर्देश बनाने से बचें।

खोज इंजन रोबोट 1: 1 सामग्री पसंद करते हैं: यूआरआई मैपिंग (यह सामग्री के रैंकिंग लिंक के लिए आधार है) - यदि आप अस्थायी रीडायरेक्ट बनाने के लिए mod_rewrite का उपयोग कर रहे हैं या आप एकाधिक यूआरआई के तहत एक ही सामग्री की सेवा कर रहे हैं, तो एक निर्दिष्ट करने पर विचार करें कैननिकल यूआरआई अपने एचटीएमएल दस्तावेज़ों के भीतर।

क्या वहां सामान्य परिस्थितियां हैं   mod_rewrite सही की तरह प्रतीत हो सकता है   नौकरी के लिए उपकरण लेकिन नहीं है?

केस-दर-मामले आधार पर उपयोगों को संबोधित करने के लिए यह एक बड़ा (और संभावित रूप से विवादास्पद) विषय है - बेहतर (आईएमएचओ) और पूछने वालों को यह निर्धारित करने दें कि सुझाए गए प्रस्ताव उनकी आवश्यकताओं के लिए उपयुक्त हैं या नहीं।

कुछ आम उदाहरण क्या हैं?

AskApache की mod_rewrite ट्रिक्स और टिप्स प्रत्येक सामान्य उपयोग-मामले के बारे में केवल नियमित रूप से पॉप-अप होता है, हालांकि, किसी दिए गए उपयोगकर्ता के लिए "सही" समाधान उपयोगकर्ता की कॉन्फ़िगरेशन और मौजूदा निर्देशों के परिष्कार पर निर्भर करता है (यही कारण है कि यह आमतौर पर यह देखने का एक अच्छा विचार है अन्य जब भी कोई mod_rewrite प्रश्न आता है तो उपयोगकर्ता के पास निर्देश होते हैं)।


38
2017-12-21 01:00



AskApache लिंक के लिए धन्यवाद। यह वही है जो मैं ढूंढ रहा था! - sica07
AskApache जोकर आधिकारिक तौर पर एएसएफ द्वारा असमर्थित है। वह जो भी कहता है वह बहस योग्य या सादा गलत है। - adaptr
@adaptr कृपया उन बेहतर संसाधनों को साझा करें जिन्हें आप स्पष्ट रूप से जानते हैं। - danlefree
"सामान्य परिस्थितियां जहां mod_rewrite नौकरी के लिए सही उपकरण की तरह लग सकता है लेकिन नहीं है?" - सरल रीडायरेक्ट करता है, जहां mod_rewrite पहले से ही उपयोग नहीं किया जा रहा है। Mod_alias का प्रयोग करें Redirect या RedirectMatch बजाय। अपाचे दस्तावेज़ भी देखें: Mod_rewrite का उपयोग नहीं करते हैं - MrWhite


कई व्यवस्थापक / डेवलपर्स की तरह मैं वर्षों से फिर से लिखने के नियमों की जटिलताओं से लड़ रहा हूं और मौजूदा अपाचे दस्तावेज से नाखुश हूं, इसलिए मैंने एक निजी परियोजना के रूप में निर्णय लेने के लिए कैसे तय किया mod_rewrite वास्तव में अपाचे कोर के बाकी हिस्सों के साथ काम करता है और इंटरैक्ट करता है, इसलिए पिछले कुछ महीनों में मैं परीक्षण मामलों का वाद्य यंत्र कर रहा हूं strace इस सब पर एक संभाल पाने के लिए स्रोत कोड में ड्रिलिंग।

यहां कुछ महत्वपूर्ण टिप्पणियां दी गई हैं जो नियम डेवलपर्स को फिर से लिखने की आवश्यकता है:

  • पुनर्लेखन के कुछ पहलू सर्वर कॉन्फ़िगरेशन, वर्चुअल होस्ट, निर्देशिका, .htaccess प्रसंस्करण के लिए आम हैं हालाँकि
  • कुछ प्रोसेसिंग रूट कॉन्फ़िगर (सर्वर कॉन्फ़िगरेशन, वर्चुअल होस्ट और निर्देशिका) के लिए बहुत अलग है, जैसा कि PerDir के विपरीत है (.htaccess) प्रसंस्करण।
  • इससे भी बदतर क्योंकि पेरडीर प्रसंस्करण लगभग अनजाने में आंतरिक रेडियरेक्ट साइकलिंग को ट्रिगर कर सकता है, रूट कॉन्फ़िगरेशन तत्वों को यह पता होना चाहिए कि इस तरह की पेरडीर प्रोसेसिंग इसे ट्रिगर कर सकती है।

मैं यह कहने के लिए कहूंगा कि इस वजह से आपको लगभग दो श्रेणियों में पुनर्लेखन उपयोगकर्ता समुदायों को विभाजित करने और उन्हें पूरी तरह से अलग करने की आवश्यकता है:

  • अपाचे कॉन्फ़िगरेशन तक रूट पहुंच वाले लोग। ये आमतौर पर एक समर्पित समर्पित सर्वर / वीएम के साथ व्यवस्थापक / डेवलपर होते हैं, और यहां संदेश काफी सरल है: उपयोग से बचें .htaccess यदि संभव हो तो फाइलें; अपने सर्वर या vhost config में सबकुछ करें। डिबगिंग उचित है क्योंकि डेवलपर डिबगिंग सेट कर सकता है और rewrite.log फ़ाइलों तक पहुंच प्राप्त कर सकता है।

  • साझा होस्ट की गई सेवा के उपयोगकर्ता (एसएचएस)

    • ऐसे उपयोगकर्ता है उपयोग करने के लिए .htaccess / पेर्डिर प्रसंस्करण के रूप में कोई विकल्प उपलब्ध नहीं है।
    • इससे भी बदतर, ऐसे उपयोगकर्ताओं का कौशल स्तर (जहां तक ​​mod_rewrite के regexp संचालित सीढ़ी-तर्क का उपयोग करना) आमतौर पर अनुभवी व्यवस्थापक से काफी कम है।
    • अपाचे और होस्टिंग प्रदाता कोई डिबगिंग / नैदानिक ​​समर्थन प्रदान नहीं करते हैं। एकमात्र नैदानिक ​​जानकारी एक सफल पुनर्निर्देशन है, गलत यूआरआई के लिए एक पुनर्निर्देशन। या 404/500 स्थिति कोड। यह उन्हें भ्रमित और असहाय छोड़ देता है।
    • अपाचे बेहद कमजोर है कि इस उपयोग के मामले में पुनर्लेखन कैसे काम करता है। उदाहरण के लिए यह PerDir के बारे में स्पष्ट स्पष्टीकरण प्रदान नहीं करता है .htaccessफ़ाइल का चयन किया गया है और क्यों। यह पेर्डिर साइकलिंग की जटिलताओं और इससे बचने के लिए व्याख्या नहीं करता है।

संभवतः एक तीसरा समुदाय है: एसएचएस प्रदाताओं में व्यवस्थापक और सहायक स्टाफ जो दोनों शिविरों में एक पैर के साथ समाप्त होते हैं और उपर्युक्त परिणामों का सामना करना पड़ता है।

मैंने कुछ लेख-शैली ब्लॉग पोस्ट लिखे हैं (उदा .Htaccess फ़ाइलों में पुनर्लेख नियमों का उपयोग करने पर अधिक) जिसमें बहुत से विस्तृत अंक शामिल हैं जिन्हें मैं इस पोस्ट को कम रखने के लिए यहां दोहराना नहीं चाहूंगा। मेरे पास अपनी खुद की साझा सेवा है और कुछ समर्पित और वीएम फ्लॉस परियोजनाओं का समर्थन भी है। मैंने अपने एसएचएस खाते के लिए एक परीक्षण वाहन के रूप में एक मानक लैंप वीएम का उपयोग शुरू किया, लेकिन अंत में मुझे उचित दर्पण वीएम (वर्णित) यहाँ)।

हालांकि, व्यवस्थापक समुदाय को कैसे समर्थन करना चाहिए इसके संदर्भ में .htaccess उपयोगकर्ता, मुझे लगता है कि हमें विकसित करने और पेश करने की आवश्यकता है:

  • पेरियर प्रोसेसिंग में रीराइट सिस्टम वास्तव में कैसे काम करता है इसका एक सुसंगत विवरण
  • लिखने के तरीके पर दिशानिर्देशों / सर्वोत्तम प्रथाओं का एक सेट .htaccess नियमों को फिर से लिखें
  • डब्ल्यू 3 सी एचटीएमएल पार्सर्स के समान एक सरल वेब आधारित रीराइट स्क्रिप्ट पार्सर सॉर्ट, लेकिन जिसके द्वारा उपयोगकर्ता परीक्षण यूआरआई या परीक्षण वैक्टर इनपुट कर सकते हैं और पुनः लिखने के तर्क प्रवाह /
  • अपने नियमों से अंतर्निहित निदान कैसे प्राप्त करें इस पर संकेत (उदा।

    • उपयोग [E=VAR:EXPR] इस तथ्य का शोषण करना EXPR लक्ष्य स्क्रिप्ट में निदान के रूप में उपलब्ध कराने के लिए बैक्रेरेंस ($ एन या% एन) का विस्तार करेगा।
    • यदि आप [या], [सी], [SKIP] और [एल] झंडे का उपयोग करके अपने पुनर्लेखन नियमों को क्रमिक रूप से ऑर्डर करते हैं ताकि संपूर्ण पुनर्लेखन योजना काम करे के बिना आंतरिक पुनर्निर्देशन का फायदा उठाने की आवश्यकता, तो आप सभी लूपिंग परेशानी से बचने के लिए निम्नलिखित नियम 1 के रूप में जोड़ सकते हैं:

      RewriteCond %{ENV:REDIRECT_STATUS} !=""
      RewriteRule .  -  [L]
      

21
2018-01-14 16:50



यह अच्छी तरह से प्रलेखित है। आप क्यों कहते हैं कि दस्तावेज़ीकरण यह समझा नहीं है? - adaptr
आपको बस इतना करना है कि सदस्यता लें .htaccess विषय और आप देखेंगे। अधिकांश शुरुआती निराशाजनक रूप से उलझन में आते हैं - इनमें से अधिकतर को एक साझा सेवा पर एलएएमपी सेवा और mod_rewrite का पहला अनुभव होता है और इसलिए सिस्टम / vhost configs के लिए रूट रूट नहीं है और प्रति डीआईआर प्रोसेसिंग का उपयोग करना है .htaccessफ़ाइलें। शुरुआती मतभेद हैं जो शुरुआती को "खून बह रहा है"। मैं खुद को एक शक्ति-उपयोगकर्ता के रूप में मानता हूं और अभी भी सूक्ष्मता की खोज कर रहा हूं। जैसा कि मैंने कहा है कि मुझे कुछ पहलुओं को काम करने के लिए स्ट्रेस और सोर्स-कोड स्कैनिंग का उपयोग करना पड़ा है। इसकी आवश्यकता नहीं है। :-( - TerryE
मैं पूरी तरह सहमत हूँ। "हमें फिर से लिखने वाले उपयोगकर्ता समुदायों को दो श्रेणियों में विभाजित करने और उन्हें पूरी तरह से अलग करने की आवश्यकता है।" कुछ उपयोगकर्ता साझा होस्टिंग का उपयोग कर रहे हैं और जरुरत भरोसा करना .htaccess, जो विशेषज्ञों के लिए भी बहुत नाजुक, जटिल, और भ्रमित है। मुझे अभी भी परेशानी हो रही है। - Ryan


Rewritemap का उपयोग करना

Rewritemaps के साथ आप बहुत सी चीजें कर सकते हैं। रिवाइटमैप को रेवाइटमैप निर्देश का उपयोग करके घोषित किया जाता है, और फिर रीवाइटकॉन्ड मूल्यांकन और रीवाइट्रूल सब्सक्रिप्शन में दोनों का उपयोग किया जा सकता है।

रिवाइटमैप के लिए सामान्य वाक्यविन्यास है:

RewriteMap MapName MapType:MapSource

उदाहरण के लिए:

RewriteMap examplemap txt:/path/to/file/map.txt

इसके बाद आप इस तरह की संरचनाओं के लिए मानचित्र नाम का उपयोग कर सकते हैं:

${examplemap:key}

मानचित्र में कुंजी / मूल्य जोड़े हैं। यदि कुंजी पाई जाती है, तो मान कम हो जाता है। सरल मानचित्र केवल सादा पाठ फ़ाइलें हैं, लेकिन आप हैश मानचित्र, और यहां तक ​​कि SQL क्वेरी का भी उपयोग कर सकते हैं। अधिक जानकारी दस्तावेज़ों में हैं:

http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritemap

तारों से बाहर निकलना।

चार आंतरिक मानचित्र हैं जिनका उपयोग आप कुछ जोड़-विमर्श करने के लिए कर सकते हैं। विशेष रूप से अनजान तार आसानी से आ सकते हैं।

उदाहरण के लिए: मैं क्वेरी स्ट्रिंग में स्ट्रिंग "कैफे" के लिए परीक्षण करना चाहता हूं। हालांकि, ब्राउजर इसे मेरे सर्वर पर भेजने से पहले बच जाएगा, इसलिए मुझे यह पता लगाने की आवश्यकता होगी कि प्रत्येक स्ट्रिंग के लिए यूआरएल से बचने वाला संस्करण क्या है, या मैं इसे अनदेखा कर सकता हूं ...

RewriteMap unescape int:unescape

RewriteCond %{QUERY_STRING}  (location|place)=(.*)
RewriteCond ${unescape:%2}   café
RewriteRule ^/find/$         /find/1234? [L,R]

ध्यान दें कि मैं तर्क स्ट्रिंग पैरामीटर को तर्क देने के लिए केवल एक रिवाइटकंड का उपयोग कैसे करता हूं, और फिर दूसरे रीराइट में मानचित्र का उपयोग करें, इसे अनदेखा करने के लिए। इसके बाद इसकी तुलना की जाती है। यह भी ध्यान दें कि मुझे rewritemap में कुंजी के रूप में% 2 की आवश्यकता है, क्योंकि% 1 में "स्थान" या "स्थान" होगा। जब आप समूह पैटर्न में ब्रांड्स का उपयोग करते हैं तो उन्हें भी कैप्चर किया जाएगा, गीलेर आप कैप्चर के परिणाम का उपयोग करने की योजना बना रहे हैं या नहीं ...


15
2018-04-06 11:57



अंतिम वाक्य बिल्कुल सही नहीं है। mod_rewrite regexp इंजन गैर-कैप्चरिंग समूहों जैसे कि समर्थन करता है (?:location|place) और इस उदाहरण में केवल एक ही कैप्चर होगा। - TerryE


सबसे आम क्या हैं   लिखने के दौरान गलतियों / नुकसान   नियम?

वास्तव में आसान पतन तब होता है जब आप उन URL को फिर से लिखते हैं जो स्पष्ट पथ को बदलते हैं, उदा। से /base/1234/index.html सेवा मेरे /base/script.php?id=1234। स्क्रिप्ट स्थान के सापेक्ष पथ के साथ कोई भी छवि या सीएसएस क्लाइंट द्वारा नहीं मिलेगा। इसे हल करने के लिए कई विकल्प मिल सकते हैं यह faq


12
2018-01-01 04:02



लिंक के लिए धन्यवाद। विशेष रूप से जब अन्य टीम के सदस्यों के साथ काम करते हैं जो पुनर्लेखन से परिचित नहीं हैं, तो मुझे एक जोड़ना पड़ता है <base> टैग करने के लिए सबसे आसान होने के लिए टैग और अभी भी सापेक्ष पथ सक्षम करें। - kontur