2011-12-09 15 views
15

मुझे पता है कि आप htaccess में नियम जोड़ सकते हैं, लेकिन मुझे लगता है कि PHP ढांचे ऐसा नहीं करते हैं और किसी भी तरह आपके पास अभी भी सुंदर यूआरएल हैं। अगर वे यूआरएल नियमों से अवगत नहीं हैं तो वे ऐसा कैसे करते हैं?PHP ढांचे में सुंदर यूआरएल

मैं वाईआई के url manager class देख रहा हूं लेकिन मुझे नहीं पता कि यह कैसे करता है।

# Redirect everything that doesn't match a directory or file to index.php 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule .* index.php [L] 

इस फ़ाइल में तो अनुरोध तुलना ($_SERVER["REQUEST_URI"]):

+5

मेरा उत्तर देखें [PHP स्क्रिप्ट के भीतर से यूआरएल की उपस्थिति कैसे बदलें] (http://stackoverflow.com/questions/8392965/how-to-change-appearance-of-url-from-within-a- php-script/8392997 # 8392997) सबसे अधिक ढांचा क्या करता है सभी अनुरोधों को एक फ़ाइल में रीडायरेक्ट करता है जो सब कुछ संभालता है। – Ibu

उत्तर

15

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

एक छोटी सी, सरल उदाहरण:

<?php 

// Define a couple of simple actions 
class Home { 
    public function GET() { return 'Homepage'; } 
} 

class About { 
    public function GET() { return 'About page'; } 
} 

// Mapping of request pattern (URL) to action classes (above) 
$routes = array(
    '/' => 'Home', 
    '/about' => 'About' 
); 

// Match the request to a route (find the first matching URL in routes) 
$request = '/' . trim($_SERVER['REQUEST_URI'], '/'); 
$route = null; 
foreach ($routes as $pattern => $class) { 
    if ($pattern == $request) { 
     $route = $class; 
     break; 
    } 
} 

// If no route matched, or class for route not found (404) 
if (is_null($route) || !class_exists($route)) { 
    header('HTTP/1.1 404 Not Found'); 
    echo 'Page not found'; 
    exit(1); 
} 

// If method not found in action class, send a 405 (e.g. Home::POST()) 
if (!method_exists($route, $_SERVER["REQUEST_METHOD"])) { 
    header('HTTP/1.1 405 Method not allowed'); 
    echo 'Method not allowed'; 
    exit(1); 
} 

// Otherwise, return the result of the action 
$action = new $route; 
$result = call_user_func(array($action, $_SERVER["REQUEST_METHOD"])); 
echo $result; 

पहले विन्यास के साथ संयुक्त, यह एक सरल स्क्रिप्ट है कि आप domain.com/about जैसे URL का उपयोग करने की अनुमति देगा। उम्मीद है कि यह आपको समझने में मदद करता है कि यहां क्या हो रहा है।

+1

आपके कोड में आप भूल जाते हैं: जीईटी पैराम्स में यूआरएल जोड़ने के लिए: 'रिवाइट्रूल (। *) Index.php? Url = $ 1 [क्यूएसए, एल] ' –

+1

हाय ओलिवियर, पैरामीटर के रूप में यूआरएल को पारित करना वास्तव में आवश्यक नहीं है क्योंकि यह '$ _SERVER ['REQUEST_URI']' में उपलब्ध है। – Ross

+0

क्या आप * निश्चित * हैं कि यह अंतिम पुनर्लेखित यूआरएल नहीं होगा (यानी '$ _SERVER ['REQUEST_URI']' == 'index.php')? –

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