यदि आप केवल picture.php
तब के लिए मार्ग बदलना चाहते हैं, तो पुनर्लेखन नियम जोड़ना .htaccess
आपकी आवश्यकताओं की पूर्ति करेगा, लेकिन, यदि आप Wordpress की तरह URL पुनर्लेखन चाहते हैं तो PHP एक तरीका है। यहाँ से शुरू करने के लिए सरल उदाहरण है।
फ़ोल्डर संरचना
दो फ़ाइलों कि रूट फ़ोल्डर में की जरूरत है कर रहे हैं, .htaccess
और index.php
, और यह के बाकी जगह के लिए अच्छा होगा .php
, अलग फ़ोल्डर में फ़ाइलें की तरह inc/
।
root/
inc/
.htaccess
index.php
.htaccess
RewriteEngine On
RewriteRule ^inc/.*$ index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
इस फ़ाइल में चार निर्देश हैं:
RewriteEngine
- पुनर्लेखन इंजन को सक्षम करें
RewriteRule
- inc/
फ़ोल्डर में सभी फ़ाइलों तक पहुंच से इनकार करें, उस फ़ोल्डर में किसी भी कॉल को रीडायरेक्ट करेंindex.php
RewriteCond
- अन्य सभी फ़ाइलों (जैसे छवियां, सीएसएस या स्क्रिप्ट) तक सीधी पहुंच की अनुमति दें
RewriteRule
- किसी और चीज को रीडायरेक्ट करना index.php
index.php
क्योंकि सब कुछ अब index.php पर पुनर्निर्देशित किया गया है, यह निर्धारित किया जाएगा कि क्या url सही है, सभी पैरामीटर मौजूद हैं, और यदि पैरामीटर के प्रकार सही हैं।
Url का परीक्षण करने के लिए हमें नियमों का एक सेट होना चाहिए, और उसके लिए सबसे अच्छा उपकरण एक नियमित अभिव्यक्ति है। नियमित अभिव्यक्ति का उपयोग करके हम दो मक्खियों को एक ही वार से मार देंगे। Url, इस परीक्षण को पास करने के लिए सभी आवश्यक पैरामीटर होने चाहिए जो अनुमत वर्णों पर परीक्षण किए जाते हैं। यहाँ नियमों के कुछ उदाहरण दिए गए हैं।
$rules = array(
'picture' => "/picture/(?'text'[^/]+)/(?'id'\d+)", // '/picture/some-text/51'
'album' => "/album/(?'album'[\w\-]+)", // '/album/album-slug'
'category' => "/category/(?'category'[\w\-]+)", // '/category/category-slug'
'page' => "/page/(?'page'about|contact)", // '/page/about', '/page/contact'
'post' => "/(?'post'[\w\-]+)", // '/post-slug'
'home' => "/" // '/'
);
अगला है आग्रह उरी तैयार करना।
$uri = rtrim( dirname($_SERVER["SCRIPT_NAME"]), '/' );
$uri = '/' . trim( str_replace( $uri, '', $_SERVER['REQUEST_URI'] ), '/' );
$uri = urldecode( $uri );
अब जब हमारे पास अनुरोध uri है, तो अंतिम चरण नियमित अभिव्यक्ति नियमों पर uri का परीक्षण करना है।
foreach ( $rules as $action => $rule ) {
if ( preg_match( '~^'.$rule.'$~i', $uri, $params ) ) {
/* now you know the action and parameters so you can
* include appropriate template file ( or proceed in some other way )
*/
}
}
सफल मैच, चूंकि हम regex में subpatterns नाम का उपयोग करते हैं, $params
सरणी को लगभग उसी तरह भरते हैं जैसे PHP $_GET
सरणी को भरता है । हालाँकि, डायनेमिक url का उपयोग करते समय, $_GET
मापदंडों को बिना किसी जाँच के पॉप्युलेट किया जाता है।
/ चित्र / कुछ + पाठ / 51
सरणी
(
[०] => / चित्र / कुछ पाठ / ५१
[पाठ] => कुछ पाठ
[१] => कुछ पाठ
[आईडी] => ५१
[२] => ५१
)
picture.php? पाठ कुछ + पाठ और आईडी = = 51
सरणी
(
[पाठ] => कुछ पाठ
[आईडी] => ५१
)
कोड की इन कुछ पंक्तियों और नियमित अभिव्यक्तियों की एक बुनियादी जानकारी एक ठोस मार्ग प्रणाली का निर्माण शुरू करने के लिए पर्याप्त है।
पूर्ण स्रोत
define( 'INCLUDE_DIR', dirname( __FILE__ ) . '/inc/' );
$rules = array(
'picture' => "/picture/(?'text'[^/]+)/(?'id'\d+)", // '/picture/some-text/51'
'album' => "/album/(?'album'[\w\-]+)", // '/album/album-slug'
'category' => "/category/(?'category'[\w\-]+)", // '/category/category-slug'
'page' => "/page/(?'page'about|contact)", // '/page/about', '/page/contact'
'post' => "/(?'post'[\w\-]+)", // '/post-slug'
'home' => "/" // '/'
);
$uri = rtrim( dirname($_SERVER["SCRIPT_NAME"]), '/' );
$uri = '/' . trim( str_replace( $uri, '', $_SERVER['REQUEST_URI'] ), '/' );
$uri = urldecode( $uri );
foreach ( $rules as $action => $rule ) {
if ( preg_match( '~^'.$rule.'$~i', $uri, $params ) ) {
/* now you know the action and parameters so you can
* include appropriate template file ( or proceed in some other way )
*/
include( INCLUDE_DIR . $action . '.php' );
// exit to avoid the 404 message
exit();
}
}
// nothing is found so handle the 404 error
include( INCLUDE_DIR . '404.php' );