2012-02-02 101 views
6

到目前爲止,我已經做到了這一點:用戶友好的URL - 國防部重寫和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/ 

但如果你應該輸入那個URL作爲重寫的[username]/gallery/作爲一個部分,這意味着$load = [username]/gallery這會給我一個'404'。

可能有更好的解決方案來獲得理想的結果,但我對.htaccess和重寫不太好。我想補充一點,我喜歡這個改寫過,因爲我有子目錄稱爲signupsignin兩個都具有子目錄中他們太多,但如果我去的網址:

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

它忽略了重寫並進入目錄,而不是通過$load聲明運行它,這是我想要的。

另外,需要注意,在註冊一個帳戶,它匹配的字符串,如dashboardabout等不允許他們使用的任何用戶名,該用戶名停止和$load if/else語句和它們包括混合達等

編輯

我忘了另一個要注意的是,因爲他們可以調用任何他們喜歡的畫廊,它需要做一個搜索,看看是否能廊存在,因此,例如:

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

首先需要檢查用戶名是否存在,然後檢查相冊是否存在,然後顯示它是否存在,或者404 /重定向到不存在的地方。所以基本上,這兩個參數/查詢都是動態的。不僅如此,則該相冊中的個別照片需要工作相同,例如:

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

我希望是有道理的......

回答

0

隨着來自Aatch和薩莉和URL路由幾個搜索結果的幫助下,我已經得到了下面的方法來實現我以後所以我想我會分享給大家,以防有人可能想要使用它...

首先,我需要提到我正在工作的網站是在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的東西,但是它掩蓋了地址欄中的URL。

它忽略這一點的唯一時間是如果子目錄實際存在。因此,例如我有一個文件夾/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'); 

開關的情況下是簡單的包括,如果該URL :/子/文件夾/儀表板/然後dashboard.php顯示。如果沒有任何一種情況匹配,那麼我們可能會查看配置文件。第一個檢查是否可以是用戶名,如果存在,則顯示視圖配置文件頁面。然後,它會檢查它是否是該配置文件的唯一ID號碼,並執行相同的檢查。

最後,如果沒有結果從任何結果中返回,則會顯示404頁未找到頁面。

如果這是一個個人資料頁,在profile.php文件然後我可以運行檢查$var_two,看看他們是否已經上傳下該名稱的相冊,例如/sub/folder/joe/holiday/如果是,則運行查詢來獲取它所有,如果沒有,顯示消息/重定向或其他。

然後,如果還有更多,請說明該文件夾($var_two)中的特定圖片($var_three),例如/sub/folder/joe/holiday/beach/ - 然後通過顯示結果的類似查詢運行它。

它可能不是最好的方法,但它非常直接,一切都工作,因爲我也喜歡它,所以我不能抱怨。

2

你想要的是所謂的URL路由器,這需要你分析網址並根據內容做出決定。大多數系統通過讓你提供一個url模板和一個函數來調用url匹配。該功能通常通過模板url中的任何子匹配。

例如Django使用正則表達式進行url路由,並將指定的匹配作爲參數傳遞給給定的函數(或類)。

如果這是太複雜,你的需要,那麼你可以只使用特定的正則表達式解析的網址,您的畫廊的情況將是:

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

然後你可以使用$username$gallery但是你的願望。

注意上述

假定它將匹配,你將需要檢查的preg_match返回值來確保。另外,我還沒有檢查過正則表達式,它可能是錯誤的,或者使用不在這個語法中的特性。

參考

+0

我查了一下這個URL路由,從來沒有聽說過它,但我已經想出了一個很好的方式來使用它,以及從你和莎莉給我的答案一些想法。我即將寫出一份答案來說明我如何運行。 +1爲您提供幫助! – Joe 2012-02-02 06:10:01

3

一個簡單的解決辦法是: EDIT 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] 

現在PHP部分(的index.php):

$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

正如我在Aatch的回答中所說的,我已經使用了你自己和Aatch的幫助以及Aatch提到的關於URL路由的一些文章。我現在正在寫一個答案,以顯示我有什麼。感謝您的幫助+1 – Joe 2012-02-02 06:11:23

0

下面是簡單的例子開始:

的.htaccess

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

首先,你必須拒絕直接訪問.php文件,你可以把它們放在單獨的文件夾,如「/包括'並將任何呼叫重定向到index.php。 其次,允許直接訪問文件(如圖像或JavaScript)。 最後一條規則,將其他任何內容重定向到index.php。

PHP

基本上,你必須設置的規則來測試URL和一些控制器來處理結果。

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'); 

下一步是檢查收到的參數。