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


264

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

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

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

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

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

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

अपने नियमों का परीक्षण करने का स्थान

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


9
इस प्रश्न के पीछे विचार यह है कि सभी अंतहीन mod_rewrite प्रश्नों के लिए एक करीबी रास्ता दिया जाए जो हमारे अधिक नियमित उपयोगकर्ताओं को पागल करते हैं। यह बहुत कुछ वैसा ही है जैसा कि serverfault.com/questions/49765/how-does-subnetting-work पर सबनेटिंग के साथ किया गया था ।
काइल ब्रांड्ट

1
इसके अलावा, मैं वास्तव में इस सवाल पर बहुत सारे upvotes नहीं चाहता , बल्कि उन्हें जवाब में जाना चाहिए। मैं इसे सीडब्ल्यू नहीं करना चाहता, क्योंकि मैं यह सुनिश्चित करना चाहता हूं कि पोस्टर को पूरा श्रेय मिले कि मैं जो उम्मीद कर रहा हूं वह सभी mod_rewrite प्रश्नों को समाप्त करने के लिए mod_rewrite उत्तर है
काइल ब्रांड्ट

4
क्षमा करें, मैंने सवाल उठाया। ;-) मुझे सच में लगता है कि इसे mod-rewriteटैग खोजों / फ़िल्टर में सबसे ऊपर (या पास) दिखाना होगा ।
स्टीवन सोमवार

किसी को एल्स (टीएम) को सामान्य उपयोग के मामलों को संभालना चाहिए। मैं उन्हें अच्छी तरह से नहीं जानता कि यह न्याय करना है।
sysadmin1138

शायद इस प्रश्न को मार्ग को और भी छोटा बनाने के लिए mod-rewrite टैग विकि से जोड़ा जाना चाहिए।
बेलादज़

जवाबों:


224

mod_rewrite वाक्यविन्यास क्रम

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

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

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

इस साधारण मामले में, यदि HTTP रेफ़र सर्वरफ़ॉल्ट.कॉम से है, तो ब्लॉग को विशेष सर्वरफ़ॉल्ट पेजों के लिए पुनर्निर्देशित करता है (हम बस यही विशेष हैं)। हालाँकि, यदि उपरोक्त ब्लॉक में एक अतिरिक्त पुनर्लेखन लाइन है:

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)तो के लिए मिलान करने के लिए , htmlया jpgफिर से लिखे गए स्ट्रिंग में $ 2 के रूप में मिलान किए गए स्ट्रिंग का प्रतिनिधित्व करने के लिए रेवेरिएट को बताता है । यह तार्किक रूप से पिछले ब्लॉक के समान है, जिसमें दो रिवेरिटकॉन्ड / रीव्रीट्यूल जोड़े हैं, यह सिर्फ चार के बजाय दो लाइनों पर करता है।

मल्टीपल रिवाइंडकॉन्ड की लाइनें अनुमानित रूप से एंडेड हैं, और स्पष्ट रूप से ओआरईडी हो सकता है। ServerFault और Super User (स्पष्ट OR) दोनों से रेफरल को संभालने के लिए:

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

ServerFault को संदर्भित करने के लिए क्रोम ब्राउजर्स के साथ पेज (अंतर्निहित और):

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" के तहत पहला निर्देश होना चाहिए। इस उदाहरण को लें:

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

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

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

यह नियम एक विशेष ब्रैकेट सिंटैक्स का उपयोग करता है जो एक वर्ण सीमा निर्दिष्ट करता है । [०- ९] अंक ० से ९ तक मेल खाते हैं। यह विशिष्ट नियम २००० से २० ९९ तक के वर्षों को संभालेगा।

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

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


पुनर्लेखन के झंडे

फिर से लिखने के नियमों के झंडे में विशेष अर्थ और usecases की मेजबानी है

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

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

= अंतिम। एक बार मैच होने के बाद रिवरराइट की प्रोसेसिंग बंद कर दें। आदेश मायने रखता है!
सी = चेन। अगले रिटर्रूले को संसाधित करना जारी रखें। यदि यह नियम मेल नहीं खाता है, तो अगले नियम को निष्पादित नहीं किया जाएगा। इस पर और बाद में।
E = पर्यावरण चर सेट करें। अपाचे के विभिन्न पर्यावरणीय चर हैं जो वेब-सर्वर व्यवहार को प्रभावित कर सकते हैं।
F = निषिद्ध। यदि यह नियम मेल खाता है, तो 403-निषिद्ध त्रुटि देता है।
जी गॉन =। यदि यह नियम मेल खाता है, तो 410-Gone त्रुटि देता है।
एच = हैंडलर। फोर्सेस से निवेदन किया जाना चाहिए जैसे कि वह निर्दिष्ट MIME- टाइप है।
एन = अगला। नियम को फिर से शुरू करने और फिर से मैच के लिए मजबूर करता है। सावधान रहे! लूप्स परिणाम कर सकते हैं।
NC = कोई मामला नहीं। की अनुमति देता हैjpgjpg और JPG दोनों का मिलान करने के लिए।
एनई = कोई बच नहीं। विशेष वर्णों ((? # & Etc) के पुनर्लेखन को उनके हेक्स-कोड समकक्षों में रोकता है।
एनएस = कोई उपश्रेणी नहीं। यदि आप सर्वर-साइड-इनक्लूड का उपयोग कर रहे हैं, तो यह शामिल फ़ाइलों से मेल खाने से रोकेगा।
पी = प्रॉक्सी। नियम को mod_proxy द्वारा नियंत्रित किया जाता है। पारदर्शी रूप से अन्य सर्वरों से सामग्री प्रदान करते हैं, क्योंकि आपका वेब-सर्वर इसे प्राप्त करता है और इसे फिर से कार्य करता है। यह एक खतरनाक झंडा है, जैसा कि एक खराब लिखा हुआ आपके वेब-सर्वर को एक खुले प्रॉक्सी में बदल देगा और वह खराब है।
पीटी = पास से गुजरना। रिवाइटररेल मिलान में अन्य उपनामों को ध्यान में रखें।
QSA = QSAppend। जब मूल स्ट्रिंग में एक क्वेरी ( http://example.com/thing?asp=foo) होती है) मूल क्वेरी स्ट्रिंग को फिर से लिखे गए स्ट्रिंग में जोड़ें। आम तौर पर इसे छोड़ दिया जाएगा। गतिशील सामग्री के लिए महत्वपूर्ण है।
आर = पुनर्निर्देश। निर्दिष्ट URL पर एक HTTP पुनर्निर्देशित करें। सटीक रीडायरेक्ट कोड [R = 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]

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

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

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


9
बहुत बढ़िया। [भराव]
EEAA

3
बहुत अच्छा mod_rewriteऔर regex प्राइमर। +1।
स्टीवन सोमवार

3
यह कभी-कभी यह जानना उपयोगी होता है कि RewriteCondवास्तव में मिलान होने के बाद यह संसाधित RewriteRuleहोता है। आप शीर्ष पर स्थित "उस पर बाद में" अधिक कहना चाह सकते हैं, जहाँ आप कहते हैं कि "ReriteCond पूर्ववर्ती RewriteRule उस नियम को शर्त के अधीन बनाता है।" आप उल्लेख करना चाहते हैं कि रेग्लेज़ पर्ल-संगत नियमित अभिव्यक्ति हैं। इसके अलावा, आपके पास "... रेवेरिटुले इसे स्ट्रिंग-स्टार्ट मानते हैं ..."
डेनिस विलियमसन

2
RewriteRule ^/blog/.*/(.*)$ /newblog/$1पहली निर्देशिका घटक से मेल नहीं खाता - पुनर्लेखन लेखक डिफ़ॉल्ट रूप से लालची हैं। /.* /(_*) दोनों / 1 / (2) / और / 1/2/3/4/5 / (6) /, से मेल खाता है, इसलिए आपको केवल FIRST पथ से मेल खाने के लिए / [^ /] * की आवश्यकता है घटक।
१२:१२

1
@ sysadmin1138, मुझे लगता है कि इस सवाल का जवाब अच्छा है, लेकिन यह बेहतर हो सकता है अगर आप झंडे ई, एन, एन एस, पी, पीटी, और एस उदाहरण के साथ के बारे में अधिक विस्तार से बता क्योंकि उन झंडे स्पष्ट नहीं है वे कैसे काम आदि
Pacerier

39

Mod_rewrite नियमों का मूल स्वरूप और संरचना क्या है?

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

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

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

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

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

PCRE सिंटैक्स की गलतफहमी से RewriteRule के स्टेम के साथ अधिकांश समस्याएं / विशेष वर्णों से ठीक से बचने में विफलता या मिलान के लिए उपयोग किए जाने वाले चर की सामग्री में अंतर्दृष्टि की कमी।

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

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

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

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

<?php
  var_dump($_SERVER);
?>

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

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

क्या ऐसे mod_rewrite नियमों के SEO या प्रदर्शन निहितार्थ हैं जिनके बारे में मुझे पता होना चाहिए?

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

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

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

क्या ऐसी सामान्य स्थितियाँ हैं जहाँ mod_rewrite काम के लिए सही उपकरण की तरह लग सकता है लेकिन ऐसा नहीं है?

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

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

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


AskApache लिंक के लिए धन्यवाद। यह मैं क्या देख रहा था!
sica07

AskApache मसख़रा आधिकारिक तौर पर ASF द्वारा असमर्थित है। वह जो कहता है, उसमें से अधिकांश बहस या सादे गलत हैं।
एडाप्टर

@adaptr कृपया उन बेहतर संसाधनों को साझा करें जिनके बारे में आप स्पष्ट रूप से अवगत हैं।
danlefree

"आम स्थितियां जहां mod_rewrite काम के लिए सही उपकरण की तरह लग सकता है लेकिन नहीं है?" - सरल पुनर्निर्देश, जहां mod_rewrite पहले से उपयोग नहीं किया जा रहा है। Mod_alias Redirectया RedirectMatchइसके बजाय का उपयोग करें । अपाचे डॉक्स भी देखें: जब mod_rewrite का उपयोग नहीं करना है
MrWhite

21

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

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

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

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

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

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

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

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

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

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

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

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

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

यह अच्छी तरह से प्रलेखित है। आप यह क्यों कहते हैं कि प्रलेखन यह व्याख्या नहीं करता है?
12'12 पर एडाप्ट्र

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

मैं पूरी तरह सहमत हूँ। "हमें उपयोगकर्ता समुदायों को दो श्रेणियों में विभाजित करने और उन्हें पूरी तरह से अलग मानने की आवश्यकता है।" कुछ उपयोगकर्ता साझा होस्टिंग का उपयोग कर रहे हैं और उन पर भरोसा करने की आवश्यकता है .htaccess, जो विशेषज्ञों के लिए बहुत ही नाजुक, जटिल और भ्रमित करने वाले हैं। मुझे अभी तक परेशानी हो रही है।
रयान

15

पुनर्लेखन का उपयोग करना

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

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

RewriteMap MapName MapType:MapSource

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

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

फिर आप इस तरह से निर्माण के लिए mapname का उपयोग कर सकते हैं:

${examplemap:key}

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

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

बिना तार के।

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

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

RewriteMap unescape int:unescape

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

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


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

12

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

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


1
लिंक के लिए धन्यवाद। विशेष रूप से जब टीम के अन्य सदस्यों के साथ काम करना, जो पुनर्लेखन से परिचित नहीं हैं, तो मुझे लगता है कि <base>टैग को जोड़ना सबसे आसान है जो कि अनुसरण करना आसान है और अभी भी रिश्तेदार पथ को सक्षम करता है।
कोंतुर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.