Htaccess का उपयोग करके सभी को index.php पर पुनर्निर्देशित करें


131

मैं एक साधारण PHP- आधारित MVC-ish फ्रेमवर्क लिख रहा हूँ। मैं चाहता हूं कि यह ढांचा किसी भी निर्देशिका में स्थापित किया जा सके।

मेरा PHP स्क्रिप्ट अनुरोध uri पकड़ लेता है और इसे खंडों में तोड़ देता है। यह खंड 1 को नियंत्रक और खंड 2 को क्रिया बनाता है। ऐसा करने पर यह सब ठीक हो जाता है:

http://www.example.com/mvc/module/test/

यह विशिष्ट मॉड्यूल नियंत्रक और विधि पर जाएगा। अब मेरे पास एक डिफ़ॉल्ट नियंत्रक है, घर नियंत्रक, जो फ़ोल्डर घर में है।

अब जब मैं इस फ़ोल्डर को सीधे http://www.example.com/mvc/home/ पर एक्सेस करता हूं, तो यह 403 निषिद्ध प्रदर्शित करेगा, क्योंकि यह फ़ोल्डर मौजूद है, इसके बजाय इसे http://www.example.com पर भी वापस जाना चाहिए /mvc/index.php

अगर मैंने किसी अन्य फ़ोल्डर में फ्रेमवर्क स्थापित किया होता, तो फ़ोल्डर के ढांचे को http://www.example.com/framework/index.php पर वापस रीडायरेक्ट करने देता है

मैं हर फ़ोल्डर और php फ़ाइल को index.php पर वापस भेजना चाहूंगा, बाकी सब चीजों को उसी तरह छोड़ दूंगा।

मेरी पहली समस्या जो मुझे मिली, वह कभी भी सही फ़ोल्डर के लिए नहीं है, हमेशा डोमेन रूट फ़ोल्डर में।

यही मैंने कोशिश की:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [L]

बस यह सुनिश्चित करने के लिए कि मैं आपके प्रश्न को सही ढंग से समझता हूं: आप हर अनुरोध को रूट index.php पर पुनर्निर्देशित करना चाहते हैं या आप उस विशिष्ट फ़ोल्डर के लिए किए गए प्रत्येक अनुरोध को पुनर्निर्देशित करना चाहते हैं index.php?
टेक्नो

फ़ोल्डर में htaccess फ़ाइल है, फ्रेमवर्क रूट डायरेक्टरी। मेरे उदाहरण में वापस mvc निर्देशिका
डेविड एरिक्सन

जवाबों:


259

आपका पुनर्लेखन नियम लगभग ठीक दिखता है।

पहले यह सुनिश्चित कर लें कि आपकी .htaccessफ़ाइल आपके दस्तावेज़ रूट (उसी स्थान पर index.php) में है या यह केवल उस उप-फ़ोल्डर को प्रभावित करेगा जो (और उसके भीतर कोई उप-फ़ोल्डर है - पुनरावर्ती)।

इसके बाद अपने नियम में थोड़ा बदलाव करें ताकि यह कुछ इस तरह दिखे:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?path=$1 [NC,L,QSA]

फिलहाल आप सिर्फ मेल कर रहे हैं . जो किसी भी वर्ण का एक उदाहरण है, आपको किसी भी वर्ण के किसी भी उदाहरण से कम से कम .*मिलान करने की आवश्यकता है ।

$_GET['path']चर तो नकली निर्देशिका संरचना में शामिल होंगे, /mvc/module/testउदाहरण, जिसे फिर आप index.php में उपयोग कर सकते हैं यह निर्धारित करने के लिए नियंत्रक और कार्यों, जो आप चाहते।


यदि आप चाहते हैं कि पूरी तरह से एक उप-निर्देशिका में स्थापित किया गया हो, जैसे कि /mvc/ या /framework/कम से कम जटिल तरीका तो यह है कि उस नियम को ध्यान में रखते हुए पुनर्लेखन नियम को थोड़ा बदल दें।

RewriteRule ^(.*)$ /mvc/index.php?path=$1 [NC,L,QSA]

और यह सुनिश्चित करें कि आपके index.php.htaccess फ़ाइल उस फ़ोल्डर में है, जबकि फ़ाइल दस्तावेज़ रूट में है।


वैकल्पिक$_GET['path'] (अद्यतन फ़रवरी '18 और जनवरी '19)

पथ को एक $_GETचर के रूप में सेट करने के लिए वास्तव में यह आवश्यक नहीं है (और न ही अब भी सामान्य है) , कई रूपरेखाओं पर भरोसा करेंगे$_SERVER['REQUEST_URI'] एक ही जानकारी को पुनः प्राप्त करने के लिए - सामान्य रूप से यह निर्धारित करने के लिए कि कौन सा नियंत्रक उपयोग करना है - लेकिन सिद्धांत बिल्कुल समान है।

यह RewriteRuleथोड़ा सरल करता है क्योंकि आपको पथ पैरामीटर बनाने की आवश्यकता नहीं है (जिसका अर्थ है कि ओपी का मूल अब काम RewriteRule करेगा ):

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /index.php [L,QSA]

हालाँकि , उप-निर्देशिका में स्थापित करने के बारे में नियम अभी भी लागू होता है, जैसे

RewriteRule ^.*$ /mvc/index.php [L,QSA]



झंडे:

NC = कोई मामला नहीं (संवेदनशील मामला नहीं, वास्तव में आवश्यक नहीं क्योंकि पैटर्न में कोई वर्ण नहीं हैं)

L = अंतिम (यह इस पुनर्लेखन के बाद फिर से लिखना बंद कर देगा, इसलिए सुनिश्चित करें कि यह आपकी पुनर्लेखन की अंतिम चीज़ है)

QSA= क्वेरी स्ट्रिंग अपेंड, बस मामले में आपको ?like=penguinsअंत में कुछ ऐसा मिला है जिसे आप इंडेक्स / एफपीपी में रखना और पास करना चाहते हैं।


1
इसे index.php? पाथ = $ 1 होना चाहिए
Jacek Pietal

1
@Prozi नहीं यदि आप एक उप-निर्देशिका में हैं और index.php डॉकरॉट में है, तो आपको अग्रणी / की आवश्यकता है Options +Indexesऔर साथ में index.php शामिल है। DirectoryIndexआप index.php को पूरी तरह से छोड़ सकते हैं और बस उपयोग कर सकते हैं जब यह सही होता है एक httpd-vhosts.conf प्रकार के निर्देशन के बजाय .htaccess के माध्यम से फिर से लिखना । /?path=$1<Directory>
CD001

यदि आप इसका उपयोग करते हैं और $ _GET ['पाथ' पर भरोसा करते हैं] तो आपको
नगनेक्स

3
अच्छा लेख! यह ध्यान देने योग्य है कि $_GET['path']यदि उपयोगकर्ता path=whateverURL में जोड़ते हैं, तो वे ओवरराइट कर सकते हैं ।
rybo111

1
@Liviuge - सच है, लेकिन शुरू में मैं पूरे रास्ते से गुजर रहा था $_GETइसलिए इसकी आवश्यकता होगी (.*)... यह मज़ेदार है लेकिन 6 साल पहले ओपी उपयोग कर रहा था, लेकिन फिर उनके लिए काम नहीं किया - लेकिन MVC वास्तुकला के साथ PHP के साथ विकसित हुआ (जैसा कि मैंने 18 फरवरी को अपडेट किया गया था ) अब यह अनुमान लगाया है ... लगता है कि वे अपने समय से आगे थे :) फिर भी /mvc/पाठ्यक्रम की निर्देशिका के लिए सही मार्ग की आवश्यकता है।
CD001

28

जो कुछ index.phpभी मौजूद नहीं है उसे पुनर्निर्देशित करने के लिए , आप FallBackResourceनिर्देश का उपयोग भी कर सकते हैं

FallbackResource /index.php

यह उसी तरह काम करता है ErrorDocument, जब आप सर्वर पर किसी गैर-मौजूद पथ या फ़ाइल का अनुरोध करते हैं, तो निर्देश चुपचाप अनुरोध का संकेत देता हैindex.php

यदि आप सब कुछ ( including existant files or folders) को पुनर्निर्देशित करना चाहते हैं index.php, तो आप निम्नलिखित जैसे कुछ का उपयोग कर सकते हैं:

RewriteEngine on

RewriteRule ^((?!index\.php).+)$ /index.php [L]

ध्यान दें कि पैटर्न ^((?!index\.php).+)$ किसी भी uri से मेल खाता है, सिवाय इसके कि index.phpहमने अनन्त लूपिंग त्रुटि को रोकने के लिए गंतव्य पथ को बाहर कर दिया है।


लेकिन आप यह भी उपयोग करना चाह सकते हैं:DirectoryIndex index.php
शाओ

1
यदि आप मूल पथ को पुनर्निर्देशित करना चाहते हैं, तो पैटर्न के *बजाय उपयोग करें +
मीर-इस्माइली

15

आप इस तरह से कुछ का उपयोग कर सकते हैं:

RewriteEngine on
RewriteRule ^.+$ /index.php [L]

यह हर क्वेरी को रूट डायरेक्टरी के index.php पर रीडायरेक्ट करेगा। ध्यान दें कि यह मौजूद फ़ाइलों के लिए पुनर्निर्देशित करेगा, जैसे कि चित्र, जावास्क्रिप्ट फ़ाइलें या शैली पत्रक।


1
यह समाधान मेरे लिए लगभग काम कर गया। मैं "AH00124: रिक्वेस्ट 10 आंतरिक रीडायरेक्ट की सीमा को पार करता रहा"। मैंने पहले "RewriteRule ^ index \ .php - [L]" जोड़ा और यह पूरी तरह से काम करता है!
फ्रेडस्टर

11

इस समस्या के लिए एक "ट्रिक" है जो सभी परिदृश्यों पर फिट बैठता है, इतना स्पष्ट समाधान कि आपको यह विश्वास करने की कोशिश करनी होगी कि यह वास्तव में काम करता है .....

यह रहा...

<IfModule mod_rewrite.c>

   RewriteEngine On

   RewriteCond %{REQUEST_FILENAME}  -f [OR]
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteRule ^(.*)$ index.php [L,QSA]

</IfModule>

मूल रूप से, आप MOD_REWRITE को हमेशाindex.php URI अनुरोध के लिए अग्रेषित करने के लिए कह रहे हैं जब कोई फ़ाइल मौजूद होती है और हमेशा जब अनुरोधित फ़ाइल मौजूद नहीं होती है !

यह समझने के लिए कि यह कैसे काम करता है, यह समझने के लिए MOD-REWRITE के स्रोत कोड की जांच करते समय यह पता चलता है कि इसकी सभी जांचें हमेशा सत्यापन के बाद होती हैं कि संदर्भ फ़ाइल मौजूद है या नहीं। तभी RegExसंसाधित किया जाता है। यहां तक ​​कि जब आपका यूआरआई एक फ़ोल्डर को इंगित करता है, तो अपाचे इसकी कॉन्फ़िगरेशन फ़ाइल में सूचीबद्ध सूचकांक फ़ाइलों के लिए चेक को लागू करेगा ।

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

महत्वपूर्ण: ध्यान दें कि कोई " / " नहीं है index.php। डिफ़ॉल्ट रूप से, MOD_REWRITE उस फ़ोल्डर का उपयोग करेगा जिसे अग्रेषित करने के लिए "बेस फ़ोल्डर" के रूप में सेट किया गया है। इसकी सुंदरता यह है कि इसके लिए साइट के "रूट फ़ोल्डर" होने की आवश्यकता नहीं है, जिससे यह समाधान काम कर सकता हैlocalhost/ और इसे लागू करने वाले / या किसी भी सबफ़ोल्डर के करता है।

अंततः, कुछ अन्य समाधान जिन्हें मैंने पहले परीक्षण किया था (जो ठीक काम कर रहे थे) ने अपने रिश्तेदार पथ के माध्यम से एक फ़ाइल की "आवश्यकता" के लिए PHP क्षमता को तोड़ दिया, जो कि एक bummer है। सावधान रहे।

कुछ लोग कह सकते हैं कि यह एक असमान समाधान है। यह हो सकता है, वास्तव में, लेकिन जहाँ तक परीक्षणों में, कई परिदृश्यों में, कई सर्वरों, कई अलग-अलग अपाचे संस्करणों आदि में, इस समाधान ने सभी मामलों पर 100% काम किया है!


धन्यवाद, इससे मेरी समस्या ठीक हो गई जिससे एक FallbackResource index.phpलाइन ने मैक (OS X 10.11) पर काम किया लेकिन Centos 7.5 के तहत नहीं किया। हालाँकि: यह RewriteRuleउदाहरण के लिए CSS फ़ाइलों के स्थान को भी फिर से लिखता है। चूंकि मुझे केवल PHP फ़ाइलों को पुनर्निर्देशित करने की आवश्यकता थी, इसलिए मैंने नियम को संशोधित किया RewriteRule ^(.*)php$ index.php [L,QSA]। YMMV।
लेरिक्स डेसीडुआ

1
मुझे खुशी है कि इसने मदद की। आप सही हैं, यह सभी फाइलों को लक्षित करता है क्योंकि प्रश्न था: " htaccess का उपयोग करके सभी को index.php पर पुनर्निर्देशित करें "। केवल PHP फ़ाइलों को पुनर्निर्देशित करने के लिए अन्य अधिक सुरुचिपूर्ण तरीके हैं, जैसे RewriteRule ^(.*)\.php$ index.php [L,NE,QSA](जिसमें काम करने के लिए कोई स्थिति नहीं है)। : आजकल, हालांकि, मैं एक और अधिक सस्ती नियम का उपयोग RewriteRule ^.+$ index.php [L,NE,QSA], जो स्थिति के साथ गठबंधन किया जा सकता है RewriteCond %{REQUEST_FILENAME} !-fऔर RewriteCond %{REQUEST_FILENAME} !-d, या यहाँ तक कि के साथ RewriteCond $1 !^(index\.php|assets|robots\.txt|favicon\.ico)सही मायने में विशिष्ट होना।
जूलियो मार्ची

5

मूर्खतापूर्ण उत्तर लेकिन अगर आप यह पता नहीं लगा सकते हैं कि इसकी रीडायरेक्टिंग क्यों नहीं है कि वेब फ़ोल्डर के लिए निम्नलिखित सक्षम है ..

AllowOverride All

यह आपको htaccess चलाने में सक्षम करेगा जो कि चल रहा होगा! (विकल्प हैं, लेकिन समस्याओं के कारण नहीं होंगे https://httpd.apache.org/docs/2.4/mod/core.html#allowoverride )


0

करने के बाद अपने लंगर टैग, घर को बदलने के लिए मत भूलना

उदाहरण:

.htacces file
RewriteEngine On

RewriteRule ^about/$ /about.php

PHP file:
<a href="about/"> about</a>

हमेशा <a> टैग बदलने के लिए याद रखें।
कोलिन्स बेंसन

2
अपने टैग, घर का मतलब बदलने के लिए नहीं करने के बाद क्या करता है?
एनरिको मारिया डे एंजेलिस

0

बस अगर आप अभी भी सोच रहे थे कि कैसे सभी अनुरोधों को पुनर्निर्देशित किया जाए या तो यदि निर्देशिका मौजूद है (कोर फ्रेमवर्क फ़ोल्डर्स और फ़ाइलों के लिए) फ्रेमवर्क इंडेक्स हैंडलर के लिए, तो कुछ त्रुटि / सफलता के प्रयासों के बाद मैंने अभी-अभी देखा। फ़ाइल

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

उपरोक्त स्थिति बताती है कि "फाइलें नहीं मिलीं" और "नहीं मिली निर्देशिका", ठीक है, क्या होगा यदि केवल "नहीं मिला" (-d) लाइन को हटा दें, और नीचे कुछ के साथ समाप्त हो गया:

RewriteEngine on
RewriteBase /framework/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /framework/index.php [L,QSA]

इसने मेरे लिए एक आकर्षण की तरह काम किया

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.