2014-12-31 10 views
7

मैं इस .htaccessअनुकूल यूआरएल और इनको स्तरों

RewriteEngine On 
RewriteRule ^custom index.php?page=value [NC,L] 

यह काम करता है index.php और .htaccess एक ही फ़ोल्डर में स्थित हैं, तो की है।

मैं जड़ में .htaccess फाइल जगह है और सामग्री एक newFolder में रखा htaccess नियमों पर प्रतिक्रिया करना चाहते हैं। कहते हैं:

.htaccess -> रूट स्तर
index.php -> जड़/newFolder स्तर

मैं कोशिश किया:

RewriteEngine On 
RewriteRule ^custom newFolder/index.php?page=value [NC,L] 

सब (404) पर कोई प्रतिक्रिया :(

मैं साधारण से समाधान करना चाहिए लगता है, लेकिन ...

किसी भी मदद की सराहना की जाएगी।

+0

क्या आप "कस्टम" गतिशील होना चाहते हैं? या यह मुश्किल कोडित होना चाहिए? साथ ही, क्या आप गतिशील होने के लिए "पृष्ठ =" के बाद "मान" चाहते हैं? यदि हां, तो आप "मूल्य" का मूल्य कहां प्राप्त करना चाहते हैं? : एस – bloodyKnuckles

उत्तर

6

के यकीन है कि हम एक ही पृष्ठ पर कर रहे हैं करते हैं। ;) अपने सर्वर रूट निर्देशिका में मैं एक .htaccess फ़ाइल है और उस फ़ाइल में मेरे पास है:

RewriteEngine On 
RewriteRule ^(.+/)?custom $1index.php?page=value [NC,L] 

RewriteRule तीन घटक होते हैं: एक मैच पैटर्न, लक्ष्य, और झंडे की एक सूची। मेल खाने वाला पैटर्न सादा पाठ या एक नियमित अभिव्यक्ति हो सकते हैं।लक्ष्य में नियमित अभिव्यक्ति मिलान पैटर्न में कैद किए गए इंटरमल्ड किए गए चर के साथ सादा पाठ या टेक्स्ट हो सकता है। दोनों का प्रतिमान है और लक्ष्य निर्देशिका .htaccess फ़ाइल स्थित है में।

मेल खाने वाला पैटर्न यूआरएल वर्तमान निर्देशिका के बाद यह है कि में पाठ की तुलना में है के सापेक्ष हैं। यदि कोई सफल मैच है तो लक्ष्य निर्देशिका से कहा जाता है। Htaccess फ़ाइल में है। अगर जानकारी मिलान पैटर्न में कैप्चर की जाती है तो लक्ष्य में चर पहले लक्ष्य में विभाजित होते हैं।

इस उदाहरण में .htaccess फ़ाइल सर्वर मार्ग पर स्थापित इसलिए खाने वाला पैटर्न के बाद URL पाठ की तुलना में है है: http://localhost/

इसे बाहर का परीक्षण करने के लिए, यहाँ PHP कोड मैं एक सूचकांक में डाल दिया है .php फ़ाइल:

<?php 

echo 'page value: ' .$_GET['page'] . '<br>'; 
echo 'script loaded: ' . $_SERVER['PHP_SELF']; 

?> 

जब मैं अपने ब्राउज़र में http://localhost/custom पर जाएँ: रेगुलर एक्सप्रेशन मिलान पैटर्न स्ट्रिंग "कस्टम" की तुलना में है, वहाँ एक सफल मैच है लक्ष्यतो 210 निष्पादित किया गया है, और मुझे रूट निर्देशिका में index.php पृष्ठ मिलता है। दिखाया गया पेज इस तरह दिखता है:

page value: value 
script loaded: /index.php 

अगला मैं एक नया निर्देशिका कहा जाता "newFolder" सर्वर मार्ग पर बना सकते हैं और नव निर्मित निर्देशिका के लिए index.php फाइल कॉपी।

जब मैं अपने ब्राउज़र में http://localhost/newFolder/custom पर जाएँ: रेगुलर एक्सप्रेशन मिलान पैटर्न स्ट्रिंग की तुलना में है "newFolder/कस्टम", फिर वहाँ एक सफल मैच इस बार लक्ष्य newFolder/index.php?page=value क्रियान्वित किया जाता है, और मैं मिल index.php पृष्ठ को नई फ़ोल्डर निर्देशिका में लोड किया गया। दिखाया गया पृष्ठ अब इस तरह दिखता है:

page value: value 
script loaded: /newFolder/index.php 

तो, इसी तरह, मैं रूट निर्देशिका में निर्देशिका और नई index.php फ़ाइलों के किसी भी संख्या उन निर्देशिकाओं में बना सकते हैं, और जब "कस्टम" उन निर्देशिकाओं में है, वहाँ नेविगेट , यह .htaccess फ़ाइल को वर्तमान उपनिर्देशिका में संबंधित index.php फ़ाइल को लोड करना चाहिए।

~~~

मैं यहाँ एक अंग पर बाहर जाने के लिए और मान लें कि आपके गतिशील पृष्ठों को लोड करना चाहते हैं, इसलिए "कस्टम" पर कब्जा एक गतिशील पेज नाम के रूप में और पेज क्षेत्र में यह डंप जा रहा हूँ (की जगह "मान") और वर्तमान उपनिर्देशिका में index.php फ़ाइल को भेजें।

RewriteEngine On 

RewriteCond %{REQUEST_URI} !index\.php 
RewriteRule ^(.+/)?(.+)$ $1index.php?page=$2 [NC,L] 

के रूप में उल्लेख किया है, कोष्ठकों गतिशील पाठ को पकड़ने और लक्ष्य स्ट्रिंग जहां डॉलर साइन नंबर दिए गए हैं में यह डंप। तो ब्रांड्स के पहले सेट में कैप्चर किया गया टेक्स्ट "$ 1" को प्रतिस्थापित करता है और दूसरे सेट में कैप्चर किया गया टेक्स्ट "$ 2" को प्रतिस्थापित करता है। मैंने इस नियम को डबल-डुबकी से रोकने के लिए RewriteCond कथन भी जोड़ा। :) अगर मुझे यह नियम "कस्टम" कॉल और index.php दोनों के लिए पुनर्निर्देशन के लिए निष्पादित नहीं किया जाता है।

तो अब जब मैं http://localhost/newFolder/whoopdeedoo पर जाएँ, regex मैच पैटर्न "newFolder/whoopdeedoo" की तुलना में है, वहाँ एक सफल मिलान है, लक्ष्य newFolder/index.php?page=whoopdeedoo निष्पादित किया जाता है, और मैं मिलता है:

page value: whoopdeedoo 
script loaded: /newFolder/index.php 

~~~

ड्रोनिंग के जोखिम पर, यहां कुछ पृष्ठभूमि जानकारी है।

RewriteEngine On 
RewriteRule ^custom index.php?page=value [NC,L] 

लेकिन जब उप निर्देशिकाओं पर आपके ब्राउज़र नेविगेट यह काम नहीं करता: आप इस रूट निर्देशिका में काम करता है उल्लेख किया। टिप्पणियों को पढ़ने के बाद, ऐसा लगता है कि आप की खोज की यह अगले बिट उप निर्देशिकाओं के लिए काम करता है, विशेष रूप से "newFolder":

RewriteEngine On 
RewriteRule ^newFolder/custom newFolder/index.php?page=value [NC,L] 

लेकिन अब यह नहीं रह गया रूट निर्देशिका के लिए काम करता है। तो आप बस दोनों को शामिल कर सकते हैं:

RewriteEngine On 
RewriteRule ^custom index.php?page=value [NC,L] 
RewriteRule ^newFolder/custom newFolder/index.php?page=value [NC,L] 

हालांकि यहां कुछ चीजें हैं जो मुझ पर कूदती हैं। एक यह है कि मेरी रूट में हार्डकोडिंग निर्देशिका नामों की बजाय। Htaccess मैं प्रत्येक उपनिर्देशिका में .htaccess फ़ाइलों को रखता हूं और वहां यूआरएल प्रोसेसिंग लेता हूं।

लेकिन यदि किसी भी कारण से आप रूट निर्देशिका में .htaccess फ़ाइल को बनाए रखना पसंद करते हैं, तो, नियमों में डुप्लिकेशंस मेरे ऊपर क्या कूदता है।

RewriteEngine On 
RewriteRule ^(.+/)?custom $1index.php?page=value [NC,L] 

regex कब्जा कोष्ठकों "newFolder /", और कोष्ठकों के अंदर टेक्स्ट को: तो, वैकल्पिक रूप से, आप नियमित अभिव्यक्ति उपनिर्देशिका एक पर कब्जा कर लिया चर नाम, इस उत्तर के शीर्ष पर दिखाया की तरह बनाने के लिए उपयोग कर सकते हैं हम कह रहे हैं, "फॉरवर्ड स्लैश के बाद एक या अधिक वर्णों को कैप्चर करें"। फिर, यदि कोई सफल मिलान होता है, तो कैप्चर किया गया मान लक्ष्य में "$ 1" को प्रतिस्थापित करता है। कारण यह रूट में भी काम करता है क्योंकि ब्रांड्स के बाद प्रश्न चिह्न माता-पिता के अंदर रेगेक्स को वैकल्पिक बनाता है। तो अगर "कस्टम" से पहले कुछ भी नहीं है तो हम अभी भी एक मैच के लिए अच्छे हैं। उस स्थिति में "$ 1" को खाली स्ट्रिंग के साथ बदल दिया जाता है।

+0

यह वही है जो मैं खोज रहा था: इस विशेष परियोजना के लिए गैर गतिशील कस्टम यूआरएल। वैसे भी, आपके द्वारा भेजी गई सारी जानकारी बहुत उपयोगी है। बहुत धन्यवाद bloodyKnuckles, और एक अच्छा नया साल है। :) – Sergio

+0

बहुत अच्छा विस्तृत उत्तर +1 – anubhava

+0

@ अनुभावा: अच्छा और सटीक उत्तर। भी गिरना आसान है। तो, हमारे यहां एक बहुत प्रतिभाशाली साथी है :) – Sergio

5

इस rewriterule साथ प्रयास करें:

# Activate RewriteEngine 
RewriteEngine on 

# Rewrite the URL requested by the user 
# Entry: folder/clients/name/ 
# Output: folder/clients.php?id=name 
RewriteRule ^folder/clients/(\w+)/?$ /folder/clients.php?id=$1 

इस RewriteRule का स्पष्टीकरण:

rewriterule का पहला भाग:

  1. ^शीर्ष अभिव्यक्ति
  2. folder/clients/अनुरोध किया गया URL स्ट्रिंग URL के अंत में साथ folder/clients/
  3. (\w+)कब्जा यह $1
  4. /?वैकल्पिक बैकस्लैश में किसी भी पत्र का पालन करें कि और दुकानों शुरू होता है अभिव्यक्ति की
  5. $समाप्ति की

दूसरा हिस्सा rewriterule:

  1. clients.php?id=पाठ स्ट्रिंग
  2. $1पहले कब्जा हम पहले भाग में देखा
+0

काम नहीं किया। "क्लाइंट", आपके कोड में, एक फ़ोल्डर है या एक कस्टम शब्द हो सकता है? आपके जवाब के लिए धन्यवाद। – Sergio

+0

मैंने अपना जवाब संपादित किया। मुझे लगता है कि आपको 'पुनर्लेखन' के अंदर उपनिर्देशिका का नाम लिखना होगा। – tomloprod

+0

शायद यह उत्तर आपके लिए अधिक उपयोगी हो सकता है: http://stackoverflow.com/questions/9262720/htaccess-pretty-url-rewrite-for-php-pages-in-a-subfolder – tomloprod

संबंधित मुद्दे