मैं एक ही PHP फ़ाइल के माध्यम से सभी URL कैसे चला सकता हूँ?


9

एमवीसी सिस्टम कैसे होते हैं, जहां यूरल्स इन रूपों में हैं, सभी इंडेक्स को सिंगल इंडेक्स.फपी फाइल के माध्यम से मजबूर करते हैं?

http://www.example.com/foo/bar/baz
http://www.example.com/goo/car/caz/SEO-friendly-name-of-the-object
http://www.example.com/hey/you

संपादित करें: जब मैं नीचे दिए गए नियमों को फिर से लिखने की कोशिश करता हूं तो मुझे यह त्रुटि मिलती है:

[error] [client 127.0.0.1] Invalid URI in request GET / HTTP/1.1
[error] [client 127.0.0.1] Invalid URI in request GET /abc HTTP/1.1

संपादित करें: ओह, यह /index.php की पूरी सामग्री है। जब मैं पुनर्लेखन नियम हटाता हूं, तो यह '/' या '/index.php' आउटपुट करता है या मुझे किसी और चीज के लिए 404 मिलता है।

<?php
echo htmlspecialchars($_SERVER['REQUEST_URI']);
?>

SOLVED: मैंने एक / फिर इंडेक्स के सामने index.php को जोड़ा और फिर इसने काम किया:

SOLVED AGAIN: / को चालू करने की आवश्यकता केवल इसलिए थी क्योंकि मैं 2.2.4 चला रहा था। जब मैंने 2.2.11 को अपग्रेड किया था / अब इसकी आवश्यकता नहीं थी।


आपने किन नियमों का उपयोग किया? मैंने दोनों की कोशिश की है और दोनों अच्छी तरह से काम कर रहे हैं। क्या आप सुनिश्चित हैं कि आपके पास mod_rewrite सक्रिय है?
मैनुअल फॉक्स

यदि mod_rewrite सक्रिय नहीं थे, तो सर्वर शुरू नहीं होगा। अगर यह मायने रखता है तो यह WinXP पर Apache 2.2 है।
jmucchiello

जवाबों:


12

यदि आप अपाचे का उपयोग कर रहे हैं, के माध्यम से फिर से लिखना का उपयोग करें mod_rewrite:

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

यह आपके URL को »index.php? Q = foo / bar / baz« पारदर्शी रूप से फिर से लिखेगा।

2. और 3. लाइनें फिर से लिखना इंजन को बताती हैं कि यदि वह किसी मौजूदा फ़ाइल या निर्देशिका की ओर इशारा करता है तो वह URL को फिर से नहीं लिखेगा। यह httpd सर्वर द्वारा प्रदान की गई वास्तविक फाइलों तक पहुंच के लिए आवश्यक है।


ऊपर संपादित देखें। 400 त्रुटि हो रही है।
jmucchiello

आपके द्वारा सर्वर को भेजा गया सटीक अनुरोध क्या था? क्या आपके सर्वर में mod_rewrite स्थापित है? मुझे ऐसा लगता है, क्योंकि अन्यथा यह सिंटैक्स त्रुटि के कारण शुरू नहीं होगा।
मैनुअल फॉक्स

संपादन सटीक अनुरोध दिखाता है: लोकलहोस्ट: 8181 और स्थानीयहोस्ट: 8181 / एबीसी । यदि मैं फिर से लिखना नियम निकालता हूं तो मुझे अपना सूचकांक मिल जाता है।
jmucchiello

मैंने index.php के सामने एक / जोड़ा और उस समस्या को ठीक किया।
jmucchiello

रहस्यमय ... मैंने स्लेश के बिना परीक्षण किया है और इसने मेरे लिए अपाचे-2.2.11-8 के साथ काम किया।
मैनुअल फॉक्स

1

नीचे दिया गया कोड Apache के mod_rewrite का उपयोग करके सभी URL को एक भौतिक फ़ाइल या निर्देशिका को इंगित करने के लिए फिर से लिखना नहीं करता है। अंतिम परिणाम होगा:

http://www.example.com/index.php/foo/bar/baz
http://www.example.com/index.php/goo/car/caz/SEO-friendly-name-of-the-object
http://www.example.com/index.php/hey/you

नियम फिर से करें:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [PT,L,QSA]

स्पष्टीकरण:

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

उपरोक्त दोनों पंक्तियाँ यह तय करती हैं कि यह नियम नियमित फ़ाइलों (-f) या निर्देशिका (-d) पर लागू नहीं होता है।

RewriteRule ^(.*)$ index.php/$1 [PT,L,QSA]

Mod_rewrite नियम बनाने के बारे में अधिक जानकारी अपाचे वेब साइट से एकत्र की जा सकती है: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html


ऊपर संपादित देखें। 400 त्रुटि हो रही है।
jmucchiello

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