2012-02-02 12 views
6

अब तक मैं इस किया है:उपयोगकर्ता के अनुकूल यूआरएल आधुनिक पुनर्लेखन और php पुनर्निर्देशन

RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php?load=$1 [QSA,L] 
तब मेरे अनुक्रमणिका पृष्ठ पर (रूट निर्देशिका में) मैं PHP का उपयोग कर रहा निर्धारित करने के लिए लोड करने के लिए जो पेज

:

// Swap to variables 
    $load = $_GET['load']; 

// Home page 
    if (!$load || $load == "") { include('home.php'); exit(); } 

// Dashboard 
    if ($load == "dashboard") { include('dashboard.php'); exit(); } 

// About 
    if ($load == "about") { include('about.php'); exit(); } 

// Username 
    $data_array = array(':username' => $load); 
    $select_account = $connect->prepare("SELECT * FROM `users` WHERE `username` = :username"); 
    $select_account-> execute($data_array); 
    $account_amount = $select_account->rowCount(); 
    if ($account_amount > 0) { include('profile.php?name=$load'); exit(); } 

// Redirect to 404 if there are no results 
    include('404.php'); exit(); 

सब कुछ अब तक काम कर रहा है, लेकिन उपयोगकर्ताओं को एक गैलरी में फ़ोटो अपलोड कर सकते हैं और मैं चाहता हूँ उन्हें इतनी तरह देखा जाना चाहिए:

www.mysite.com/[username]/gallery/ 

लेकिन अगर आप इसे यूआरएल के रूप में टाइप करना चाहते थे, रीराइट [username]/gallery/ को एक सेक्शन के रूप में पढ़ता है जिसका अर्थ है $load = [username]/gallery जो मुझे '404' देगा।

वांछित परिणाम प्राप्त करने के लिए शायद एक बेहतर समाधान है लेकिन मैं .htaccess और पुनर्लेखन के साथ बहुत अच्छा नहीं हूं। मैं जोड़ने के लिए है कि मैं इस पुनर्लेखन भी पसंद है के बाद से मैं एक उप-निर्देशिका signup और signin जो दोनों भी उन में एक उप-निर्देशिका है कहा जाता है चाहते हैं, लेकिन अगर मैं URL पर जाएगा:

www.mysite.com/signup 
www.mysite.com/signin 

यह फिर से लिखने पर ध्यान नहीं देता और $load कथन के माध्यम से इसे चलाने के बजाय निर्देशिका में जाता है जो मैं चाहता हूं।

ही, ध्यान दें करने के लिए, कोई खाता पंजीकरण पर है, जो तार इस तरह के dashboard या about आदि के रूप में यह उन्हें इसका इस्तेमाल करने की अनुमति नहीं है मेल खाने वाले किसी उपयोगकर्ता नाम, इस उपयोगकर्ता नाम और $load करना बंद कर दे/किसी और बयानों और उनके मिलाया जा रहा है शामिल

: आदि अप

संपादित

एक और बात मैं नोट करना भूल गया है क्योंकि वे गैलरी जो कुछ भी वे पसंद कॉल कर सकते हैं, यह एक खोज करने के लिए करता है, तो यह है कि गैलरी में मौजूद है को देखने के लिए, उदाहरण के लिए इसलिए जरूरत है

www.mysite.com/username/my+first+album 

इसे पहले उपयोगकर्ता नाम की जांच करने की आवश्यकता होगी, फिर एल्बम मौजूद है, फिर इसे प्रदर्शित करें या 404/यदि कहीं भी रीडायरेक्ट न हो तो इसे प्रदर्शित करें। तो मूल रूप से, दोनों पैरामीटर/प्रश्न गतिशील होंगे। इतना ही नहीं, लेकिन फिर उस एलबम के भीतर अलग-अलग तस्वीरें, एक ही काम करने के लिए उदाहरण के लिए की जरूरत है:

www.mysite.com/username/my+first+album/my+picture 

मुझे आशा है कि समझ में आता है ...

उत्तर

0
दोनों Aatch और सैली और यूआरएल मार्ग पर कुछ खोज परिणामों से मदद के साथ

है, मुझे मिल गया है:अब (index.php के लिए) है कि PHP हिस्सा मेरे द्वारा प्राप्त किए जाने वाले कार्यों को प्राप्त करने के लिए निम्नलिखित विधि मैंने सोचा कि अगर मैं इसका उपयोग करना चाहूंगा तो मैं इसे सभी के साथ साझा करूंगा ...

सबसे पहले मुझे जिस साइट पर काम कर रहा हूं उसका उल्लेख करने की आवश्यकता है 2 रूट फ़ोल्डर mysite.com/sub/folder/index.php की उप-निर्देशिकाएं इसलिए क्यों मैं उन सरणीओं पर क्यों शुरू कर रहा हूं [3]

इसके साथ ही कहा मेरी .htaccess फाइल पीछा किया है:

RewriteEngine on 
RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . sub/folder/index.php [QSA,L] 

यह, जहाँ तक मैं दूर हूँ, कुछ भी है कि sub/folder/ के बाद लिखा गया था और सीधे वापस index.php के लिए पेज पुनर्निर्देश है हो जाता है, फिर भी , यह पता बार में यूआरएल मास्क करता है।

एकमात्र समय यह अनदेखा करता है यदि उप निर्देशिका वास्तव में मौजूद है। तो उदाहरण के लिए मेरे पास एक फ़ोल्डर /sub/folder/signup/ है यदि मैं इसे एड्रेस बार में टाइप करना चाहता था, क्योंकि निर्देशिका मौजूद है तो आपको index.php फ़ाइल पर रीडायरेक्ट नहीं किया गया है, लेकिन सामान्य की तरह अनुरोध की गई निर्देशिका में भेजा गया है।

अब मेरी index.php फ़ाइल पर (याद रखें मैं $ पर शुरू कर रहा हूँ uri [3] क्योंकि मैं सब फ़ोल्डर में हूँ!)

$uri = $_SERVER['REQUEST_URI']; // This brings back /sub/folder/foo/bar/test/ 
$uri = explode("/", $uri); // Separate each one 

$var_one = $uri[3]; // foo 
$var_two = $uri[4]; // bar 
$var_three = $uri[5]; // test 

switch ($var_one) { 

    case '': 
    case 'home': 
     include('home.php'); 
     exit(); 
     break; 

    case 'signout': 
    case 'logout': 
     include('signout.php'); 
     exit(); 
     break; 

    case 'dashboard': 
    case 'dash': 
     include('dashboard.php'); 
     exit(); 
    break; 

} 

// By Username 
    $data_array = array(':username' => $var_one); 
    $select_account = $connect->prepare("SELECT * FROM `users` WHERE `username` = :username"); 
    $select_account -> execute($data_array); 
    $account_amount = $select_account->rowCount(); 
    if ($account_amount > 0) { include('profile.php'); exit(); } 

// By Account ID 
    $data_array = array(':id' => $var_one); 
    $select_account = $connect->prepare("SELECT * FROM `users` WHERE `id` = :id"); 
    $select_account -> execute($data_array); 
    $account_amount = $select_account->rowCount(); 
    if ($account_amount > 0) { include('profile.php'); exit(); } 

include('page_not_found.php'); 

स्विच मामलों, सरल भी शामिल कर रहे हैं यूआरएल है :/उप/फ़ोल्डर/डैशबोर्ड/फिर dashboard.php दिखाया गया है। यदि कोई भी मामला मेल नहीं खाता है तो हम संभवतः एक प्रोफ़ाइल देख सकते हैं। यह देखने के लिए पहली जांच है कि यह उपयोगकर्ता नाम हो सकता है, यदि यह मौजूद है तो दृश्य प्रोफ़ाइल पृष्ठ प्रदर्शित होता है। फिर, यह देखने के लिए जांच करता है कि यह उस प्रोफ़ाइल के लिए अद्वितीय आईडी नंबर हो सकता है और वही चेक करता है।

अंत में, यदि उनमें से कोई भी परिणाम वापस नहीं लाया जाता है, तो हमें 404 पृष्ठ नहीं मिला पृष्ठ दिखाया गया है।

यदि यह एक प्रोफाइल पेज, profile.php फ़ाइल पर मैं तो $var_two के लिए चेक चलाने के लिए और उदाहरण /sub/folder/joe/holiday/ के लिए देखें कि क्या वे उस नाम के तहत एक फोटो एलबम अपलोड कर दिया है, यदि हाँ, तो यह लाने के लिए एक प्रश्न चला सकते हैं था सब, यदि नहीं, तो एक संदेश/रीडायरेक्ट या जो कुछ भी प्रदर्शित करें।

फिर अगर वहाँ और भी अधिक है, उस फ़ोल्डर ($var_two) में एक विशिष्ट चित्र ($var_three), उदाहरण के /sub/folder/joe/holiday/beach/ के लिए कहते हैं - तो एक समान क्वेरी परिणाम दिखा के माध्यम से चलाते हैं।

यह सबसे अच्छा तरीका नहीं हो सकता है लेकिन यह बहुत सीधी आगे है और सबकुछ काम कर रहा है क्योंकि मुझे यह भी पसंद है इसलिए मैं वास्तव में शिकायत नहीं कर सकता। ,

.htaccess

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

सबसे पहले, आप फ़ाइलों .php के लिए सीधी पहुँच से इनकार करना होगा कि आप उन्हें अलग फ़ोल्डर में डाल सकते हैं/शामिल की तरह ':

2

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

उदाहरण के लिए डीजेंगो अपने यूआरएल रूटिंग के लिए रेगेक्स का उपयोग करता है और नामित मैचों को दिए गए फ़ंक्शन (या कक्षा) में तर्क के रूप में पास करता है।

यदि यह आपकी आवश्यकताओं के लिए बहुत जटिल तो आप न केवल विशिष्ट regexes उपयोग कर सकते हैं यूआरएल को पार्स करने के लिए है, अपनी गैलरी मामला होगा:

$matches = array(); 
$re = "/\/([\w\d])+\/([\w\d+%])+\/?/"; 
preg_match($re, $load, $matches); 
$username = $matches[0]; 
$gallery = $matches[1]; 

आप तो $username और $gallery उपयोग कर सकते हैं जैसा आप चाहते हैं।

नोट

ऊपर मानता है कि यह मेल खाएगा, आप यह सुनिश्चित करना preg_match की वापसी मान की जाँच करने की आवश्यकता होगी। इसके अलावा, मैंने रेगेक्स की जांच नहीं की है, यह गलत हो सकता है, या इस वाक्यविन्यास में सुविधाओं का उपयोग नहीं कर सकता है।

संदर्भ

+0

मैंने इस यूआरएल रूटिंग पर थोड़ा सा देखा है, इससे पहले कभी नहीं सुना है, लेकिन मैं इसके बिट्स का उपयोग करने के साथ-साथ आप और सैली दोनों ने जवाब देने के कुछ अच्छे विचारों के साथ आ गया है । मैं यह दिखाने के लिए एक जवाब में लिख रहा हूं कि मुझे चीजें कैसे चल रही हैं। आपकी मदद के लिए +1! – Joe

3

एक सरल समाधान होगा: संपादित htaccess

RewriteBase/
RewriteCond %{REQUEST_URI} !/signup 
RewriteCond %{REQUEST_URI} !/signin 
RewriteRule ^([^/]*)/([^/]*)$ index.php?load=gallery&username=$1&gallery=$2 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php?load=$1 [QSA,L] 
$load = $_GET['load']; 
switch ($load){ 
    default: 
     include('home.php'); 
     exit(); 
    break; 
    case 'dashboard': 
     include('dashboard.php'); 
     exit(); 
    break; 
    case 'about': 
     include('about.php'); 
     exit(); 
    break; 
    case 'gallery': 
     $username = $_GET['username']; 
     $gallery = $_GET['gallery']; 

     //check for the username and gallery 

     header("Location: your-gallery-location-goes-here"); 
    break; 
} 

उम्मीद है कि यह वाला मदद :)

+0

जैसा कि मैंने अभी तक एच के जवाब में कहा है, मैंने आपके और एच के दोनों के साथ-साथ यूआरएल रूटिंग पर कुछ लेखों का उपयोग किया है, जिसे एच ने उल्लेख किया है। मैं यह दिखाने के लिए अब एक उत्तर लिख रहा हूं कि मुझे क्या मिला है। आपकी सहायता +1 के लिए धन्यवाद – Joe

0

यहाँ के साथ शुरू सरल उदाहरण है 'और उस फ़ोल्डर में index.php पर किसी भी कॉल को रीडायरेक्ट करें। दूसरा, फ़ाइलों तक सीधे पहुंच (जैसे छवियों या जावास्क्रिप्ट) की अनुमति दें। अंतिम नियम, index.php पर कुछ और रीडायरेक्ट करें।

पीएचपी

मूल रूप से आप परिणाम को संभालने के लिए यूआरएल और कुछ नियंत्रक परीक्षण करने के लिए नियमों का सेट करनी होगी।

define('WEB_ROOT', rtrim(dirname($_SERVER["SCRIPT_NAME"]), '/')); 
define('INCLUDES_ROOT', 'includes/'); 

// examples of rewrite rules ($key = action, $value = regular expression) 
$rules = array( 
    'pages' => "/(?'page'dashboard|about|signin|signup)", // e.g. '/about' 
    'gallery' => "/(?'username'[\w\-]+)/gallery", // e.g. '/some-user/gallery' 
    'album' => "/(?'username'[\w\-]+)/(?'album'[\w\-]+)", // e.g. '/some-user/some-album' 
    'picture' => "/(?'username'[\w\-]+)/(?'album'[\w\-]+)/(?'picture'[\w\-]+)",  // e.g. '/some-user/some-album/some-picture' 
    'home' => "/" // e.g. '/' 
    ); 

// get uri 
$uri = '/' . trim(str_replace(WEB_ROOT, '', $_SERVER['REQUEST_URI']), '/'); 

// test uri 
foreach ($rules as $action => $rule) { 
    $pattern = '/^'.str_replace('/', '\/', $rule).'$/'; 

    if (preg_match($pattern, $uri, $params)) { 
     /* now you know the action and parameters so you can 
     * include appropriate template file (or proceed in some other way) 
     * NOTE: variable $params vill be visible in template (use print_r($params) to see result) 
     */ 
     include(INCLUDES_ROOT . $action . '.php'); 
     // exit to avoid the 404 message 
     exit(); 
    } 
} 

// nothing is found so handle 404 error 
include(INCLUDES_ROOT . '404.php'); 

अगला चरण प्राप्त पैरामीटर की जांच करना है।

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