2011-08-09 57 views
2

我對mod_rewrite很新,但我已經做了一些搜索,找不到這個問題的答案。我有一個網站,只有一個PHP頁面提供數十頁內容,具體取決於在查詢字符串中傳遞給它的ID。我想重寫網址,以便此ID 消失並由從數據庫中繪製的頁面標題取代。例如重寫URL,用查詢字符串中的標題替換ID

www.example.com/index.php?id=19 

www.example.com/my-page-title 

,其中「我的頁面標題」是存儲在數據庫中的網頁的索引標題換成19

沒有人有任何經驗這種重寫,還是甚至可能?

感謝,

HR

回答

1

這是可能的。您重寫url以發送$ _GET值,並使用此值查找所需的行。 url必須是唯一的,否則它找不到那個唯一的行。

例子:

RewriteRule ^([\d\w-]+)$ index.php?slug=$1 [L] 

這讓你在PHP中的價值$_GET['slug'],然後你就可以用它來查找數據庫中的值。

+0

感謝羅賓,類似於上面的答案,我會給它一個去。 – user885609

3

確定它可能的,對於PHP腳本你的.htaccess可能是這個樣子:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] 
</IfModule> 

這將改寫所有URL除了目錄或文件名「的index.php URL =該類型的? -地址」。

在你的index.php,你可以再使用的$ _GET值[「網址」]確定ID:

// init DB layer 
if (isset($_GET['url']) && !empty($_GET['url'])) { 
    $url = my_filter_function($_GET['url']); // filter input 
    $pdo = my_get_pdo_function(); // get configured PDO objected 
    $query = "SELECT id FROM my_router_table WHERE url = ? LIMIT 1"; // use prepared statements for security/performance reasons 

    $stmt = $pdo->prepare($query); 
    $stmt->bindValue(1, $url, PDO::PARAM_STR); // bind the value as a string 

    // ternary operator expanded for readability 
    if ($stmt->execute()) { 
    $id = $stmt->fetch(PDO::FETCH_ASSOC); 
    } else { 
    $id = -1; // 404 page 
    } 

    // fetch content/render page according to ID 
} 

這顯然是一個過於簡單的例子,你應該確保你正確逃避您的輸入並使用準備好的語句來避免安全風險。另外,如果您使用MySQLi或其他數據庫訪問層,則準備/執行/提取代碼將略有不同。

+0

這是超級有用的亞歷克斯,我會給它一個去。非常感謝。 – user885609