Mod_rewrite को समझने के लिए आपको सबसे पहले यह समझने की जरूरत है कि वेब सर्वर कैसे काम करता है। एक वेब सर्वर HTTP अनुरोधों का जवाब देता है । इसके सबसे बुनियादी स्तर पर HTTP अनुरोध इस तरह दिखता है:
GET /foo/bar.html HTTP/1.1
यह एक वेब सर्वर के लिए एक ब्राउज़र का सरल अनुरोध है, जो URL /foo/bar.html
से अनुरोध करता है। यह जोर देना महत्वपूर्ण है कि यह एक फ़ाइल का अनुरोध नहीं करता है , यह सिर्फ कुछ मनमाने यूआरएल का अनुरोध करता है। अनुरोध इस तरह दिख सकता है:
GET /foo/bar?baz=42 HTTP/1.1
यह एक URL के लिए एक अनुरोध के रूप में मान्य है, और इसमें फ़ाइलों के साथ अधिक स्पष्ट रूप से कुछ भी नहीं है।
वेब सर्वर एक पोर्ट पर सुनने वाला एप्लिकेशन है, जो उस पोर्ट पर आने वाले HTTP अनुरोधों को स्वीकार करता है और प्रतिक्रिया देता है। एक वेब सर्वर किसी भी तरह से किसी भी अनुरोध को जवाब देने के लिए पूरी तरह से स्वतंत्र है यह किसी भी तरह से फिट बैठता है / किसी भी तरह से आपने इसे प्रतिक्रिया देने के लिए कॉन्फ़िगर किया है। यह प्रतिक्रिया एक फ़ाइल नहीं है, यह एक HTTP प्रतिक्रिया है जो किसी भी डिस्क पर भौतिक फ़ाइलों के साथ कुछ भी कर सकती है या नहीं हो सकती है। एक वेब सर्वर को अपाचे होने की जरूरत नहीं है, कई अन्य वेब सर्वर हैं जो सभी बस प्रोग्राम हैं जो लगातार चलते हैं और एक पोर्ट से जुड़े होते हैं जो HTTP अनुरोधों का जवाब देते हैं। आप खुद लिख सकते हैं। इस पैराग्राफ का उद्देश्य था कि आप किसी भी धारणा से, जो सीधे-सीधे फाइलों के बराबर URLs को तलाक दे दें, जिसे समझना महत्वपूर्ण है। :)
अधिकांश वेब सर्वरों का डिफ़ॉल्ट कॉन्फ़िगरेशन एक फाइल की तलाश है जो हार्ड डिस्क पर URL से मेल खाता है। यदि सर्वर का डॉक्यूमेंट रूट सेट किया गया है, तो कहें /var/www
, यह दिख सकता है कि क्या फ़ाइल /var/www/foo/bar.html
मौजूद है और यदि ऐसा है तो सेवा करें। यदि फ़ाइल ".php" में समाप्त होती है, तो यह PHP दुभाषिया को आमंत्रित करेगी और फिर परिणाम लौटाएगी। यह सब एसोसिएशन पूरी तरह से विन्यास योग्य है; वेब सर्वर के लिए PHP दुभाषिया के माध्यम से चलाने के लिए एक फ़ाइल को ".php" में समाप्त नहीं करना पड़ता है, और कुछ होने के लिए URL को डिस्क पर किसी विशेष फ़ाइल से मेल नहीं खाता है।
mod_rewrite आंतरिक अनुरोध हैंडलिंग को फिर से लिखने का एक तरीका है । जब वेब सर्वर को URL के लिए एक अनुरोध प्राप्त होता है /foo/bar
, तो आप उस URL को किसी अन्य चीज़ में फिर से लिख सकते हैं, इससे पहले कि वेब सर्वर उस पर मेल करने के लिए डिस्क पर एक फ़ाइल की तलाश करेगा। सरल उदाहरण:
RewriteEngine On
RewriteRule /foo/bar /foo/baz
यह नियम कहता है कि जब भी कोई अनुरोध "/ foo / bar" से मेल खाता है, तो इसे "/ foo / baz" में फिर से लिखें। इसके बाद अनुरोध को संभाल लिया जाएगा जैसे /foo/baz
कि इसके बजाय अनुरोध किया गया था। इसका उपयोग विभिन्न प्रभावों के लिए किया जा सकता है, उदाहरण के लिए:
RewriteRule (.*) $1.html
यह नियम कुछ भी ( .*
) से मेल खाता है और इसे कैप्चर करता है ( (..)
), फिर इसे ".html" में जोड़ने के लिए फिर से लिखता है। दूसरे शब्दों में, यदि /foo/bar
अनुरोधित URL था , तो इसे ऐसे ही हैंडल किया जाएगा जैसे कि /foo/bar.html
अनुरोध किया गया था। नियमित अभिव्यक्ति मिलान, कैप्चरिंग और प्रतिस्थापन के बारे में अधिक जानकारी के लिए http:// अनियमित- expressions.info देखें ।
एक और अक्सर सामना किया गया नियम यह है:
RewriteRule (.*) index.php?url=$1
यह, फिर से, किसी भी चीज़ से मेल खाता है और इसे फ़ाइल इंडेक्स में फिर से लिखता है url
। क्वेरी पैरामीटर में मूल रूप से अनुरोधित URL के साथ । यानी, आने वाले किसी भी और सभी अनुरोधों के लिए, फ़ाइल index.php निष्पादित किया जाता है और इस फ़ाइल में मूल अनुरोध तक पहुंच होगी $_GET['url']
, इसलिए यह इसके साथ कुछ भी कर सकता है।
मुख्य रूप से आप इन पुनर्लेखन नियमों को अपनी वेब सर्वर कॉन्फ़िगरेशन फ़ाइल में रखते हैं । अपाचे भी * आप उन्हें .htaccess
अपने दस्तावेज़ रूट (यानी आपके .php फ़ाइलों के बगल में) नामक एक फ़ाइल में डालने की अनुमति देता है ।
* यदि प्राथमिक अपाचे कॉन्फ़िगरेशन फ़ाइल द्वारा अनुमति दी गई है; यह वैकल्पिक है, लेकिन अक्सर सक्षम है।
Mod_rewrite क्या नहीं करता है
mod_rewrite जादुई रूप से आपके सभी URL को "सुंदर" नहीं बनाती है। यह एक सामान्य गलतफहमी है। यदि आपकी वेब साइट में यह लिंक है:
<a href="https://stackoverflow.com/my/ugly/link.php?is=not&very=pretty">
वहाँ कुछ भी नहीं है mod_rewrite कि सुंदर बनाने के लिए कर सकते हैं। यह एक सुंदर लिंक बनाने के लिए, आपको निम्न करना होगा:
लिंक को सुंदर लिंक में बदलें:
<a href="https://stackoverflow.com/my/pretty/link">
/my/pretty/link
ऊपर वर्णित विधियों में से किसी एक का उपयोग करके URL के अनुरोध को संभालने के लिए सर्वर पर mod_rewrite का उपयोग करें ।
(एक mod_substitute
आउटगोइंग HTML पेज और उनके सम्मिलित लिंक को बदलने के लिए संयोजन का उपयोग कर सकता है । हालांकि यह केवल आपके निजी संसाधनों को अपडेट करने की तुलना में हमारे लिए अधिक प्रयास है।)
बहुत से mod_rewrite कर सकते हैं और बहुत जटिल मिलान नियम आप बना सकते हैं, जिसमें कई रीराइट्स का पीछा करना, एक पूरी तरह से अलग सेवा या मशीन के लिए अनुरोधों का जवाब देना, विशिष्ट HTTP स्थिति कोड को प्रतिक्रियाओं के रूप में वापस करना, अनुरोधों को पुनर्निर्देशित करना आदि बहुत शक्तिशाली है और इसका उपयोग किया जा सकता है। यदि आप मूलभूत HTTP अनुरोध-प्रतिक्रिया तंत्र को समझते हैं तो बहुत अच्छा है। यह स्वचालित रूप से आपके लिंक को सुंदर नहीं बनाता है।
सभी संभावित झंडे और विकल्पों के लिए आधिकारिक दस्तावेज देखें ।