【问题标题】:URL rewriting from id to title从 id 到 title 的 URL 重写
【发布时间】:2017-05-18 07:18:20
【问题描述】:

我有一个带有以下 url 的页面:website.com/foo/bar

其中 foo 是页面的 php 文件,bar 是用于从数据库中提取数据的相应 id。

我没有使用任何类型的框架技巧。只需一个 htaccess 即可删除 .php 和扩展名,并处理带有 id 的页面 foo.php,因为它不在子文件夹中。

无论如何,bar 只是一个数字(就像我说的对应于数据库行 id)。对于用户历史记录中的 SEO 和一般可读性,我想使用更流行的 website.com/foo/this-is-the-name 格式(这种格式叫什么??)。

目前我的代码是:

require('neou_cms/framework/framework.php');

$id = filter(basename(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)));

// no id
if (empty($id)) {
    header('Location: ../portfolio');
}

$projects = Nemesis::select("*", "projects", "published = '1' AND id = {$id}");
$row_projects = $projects->fetch_assoc();
$totalRows_projects = $projects->num_rows;

// no results, bad id
if ($totalRows_projects <= 0) {
    header('Location: ../portfolio');   
}

如果图我会执行以下操作 (1) 使链接到 foo 的页面改为转到页面标题,例如/this-is-the-name (2) in foo 我会这样做,以便 $id 从名称中删除破折号并使用 select 语句和标题在数据库中搜索该行。

但是我觉得这很慢......有没有更好的方法来做到这一点,而不需要我改变当前的流程?

【问题讨论】:

    标签: php mysql url url-rewriting


    【解决方案1】:

    你的方法很好。您的网址 (website.com/foo/this-is-the-name) 的 this-is-the-name 部分通常称为“slug”。如果您要在 slug 上查询数据库表,只需确保 slug 列具有索引并且查询应该执行得相当好。

    我还想指出,您发布的代码中存在 SQL 注入漏洞。考虑将$id 绑定为参数化查询中的参数,而不是将其动态包含在 where 子句中。

    【讨论】:

    • 我只有一个 foo 表,没有 slug 列,所以这将是使用 this is the name 对标题列进行语义搜索。那会很糟糕吗?
    • 如果您在标题列中搜索不完全匹配的字符串,则查询可能不会使用索引,并且随着表变大而变慢。我建议添加一个带有索引的单独 slug 列,以支持对精确字符串匹配的快速查询。
    • 已实施。必须编写一个脚本来为所有过去的 db 条目生成 slug,但工作速度足够快以满足我的喜好。谢谢!
    猜你喜欢
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 2015-06-30
    相关资源
    最近更新 更多