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


Rewrite URL, replacing ID with title in query string

我对mod_rewrite很陌生,但我已经做了一些搜索,找不到这个问题的答案。我有一个网站,其中只有一个PHP页面提供了几十页的内容取决于在查询字符串传递给它的ID。我想重写URL,使此ID 消失,并由从数据库绘制的页面标题所取代。例如

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

取代
www.example.com/my-page-title

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

有没有人有过这种重写的经验,或者这是可能的吗?

谢谢,人力资源部

当然这是可能的,对于一个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
}

这显然是一个过于简化的示例,您应该确保正确地转义输入并使用预处理语句以避免安全风险。此外,如果您使用mysql或其他数据库访问层,您的准备/执行/获取代码将略有不同。

有可能。您可以重写url以发送$ _get值,并使用该值查找所需的行。url必须是唯一的,否则它找不到唯一的行。

的例子:

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

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