【问题标题】:Rewrite URL, replacing ID with title in query string重写 URL,用查询字符串中的标题替换 ID
【发布时间】:2011-10-23 01:33:39
【问题描述】:

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

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

被替换为

www.example.com/my-page-title

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

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

谢谢,

人力资源

【问题讨论】:

    标签: php mysql mod-rewrite


    【解决方案1】:

    当然可以,对于 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 或其他数据库访问层,您的准备/执行/获取代码会略有不同。

    【讨论】:

      【解决方案2】:

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

      例子:

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

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

      【讨论】:

      • 谢谢罗宾,和上面的回答差不多,我试试看。
      猜你喜欢
      • 2016-01-31
      • 1970-01-01
      • 1970-01-01
      • 2014-08-07
      • 2011-08-02
      • 2012-01-18
      • 1970-01-01
      相关资源
      最近更新 更多