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 = कोई मामला नहीं। की अनुमति देता हैjpg
jpg और 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" से मेल खाएगा