2011-08-09 6 views
2

私はmod_rewriteの新機能ですが、いくつかの検索を行ってしまい、この質問に対する答えを見つけることができません。私は、クエリ文字列で渡されたIDに応じて数十ページのコンテンツを提供するPHPページが1つしかないサイトを持っています。このID が消えてとなるようにURLを書き直して、データベースのページのタイトルに置き換えます。例えばURLを書き換えて、クエリ文字列のIDをタイトルに置き換えます。

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

は、「私のページタイトルは、」インデックスのデータベースに格納されたページのタイトルである

www.example.com/my-page-title 

によって置き換えられる19

は誰がどんな経験を持っていますこの種の書き直しや、それは可能でしょうか?

おかげで、

HR

答えて

1

それが可能です。 $ _GET値を送信するURLを書き換えて、この値を使用して目的の行を探します。 urlはユニークでなければなりません(elselyそれはユニークな行を見つけることができません)。

例:

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

これは、あなたが、データベース内の値を見つけるために使用できる値はPHPで$_GET['slug']を与えます。

+0

ありがとうRobinは、上記の答えと同様に、私はそれを行ってみましょう。 – 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> 

これは、「index.phpにディレクトリまたはファイル名以外のすべてのURLをリライトするURL =型付けされました? -住所"。

あなたがIDを決定するために$ _GET [「URL」]の値を使用することができ、あなたのindex.phpで

// 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

関連する問題