重写URL,用查询字符串中的标题替换ID

时间:2011-08-09 09:23:13

标签: php mysql mod-rewrite

我对mod_rewrite很新,但是我已经做了一些搜索,无法找到这个问题的答案。我有一个网站,只有一个PHP页面提供数十页内容,具体取决于在查询字符串中传递给它的ID。我想重写URL,以便此ID 消失,并替换为从数据库中绘制的页面标题。例如

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

替换为

www.example.com/my-page-title

其中“my-page-title”是存储在索引19的数据库中的页面的标题。

有没有人有这种重写的经验,或者甚至可能?

谢谢,

HR

2 个答案:

答案 0 :(得分: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 = THE-TYPED-ADDRESS”。

在index.php中,您可以使用$ _GET ['url']的值来确定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或其他数据库访问层,则prepare / execute / fetch代码会略有不同。

答案 1 :(得分:2)

这是可能的。您重写url以发送$ _GET值,并使用此值来查找所需的行。网址必须是唯一的,否则它找不到那个唯一的行。

示例:

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

这为您提供了PHP中的值$_GET['slug'],您可以使用它来查找数据库中的值。