【发布时间】:2010-09-06 00:09:54
【问题描述】:
我经常看到(重写)没有 ID 的 URL,例如在某些 wordpress 安装中。实现这一目标的最佳方法是什么? 例子: site.com/product/some-product-name/ 也许将页面名称和 ID 数组保存在缓存中,以避免对每个页面请求进行数据库查询? 如何避免冲突,使用不带 ID 的 url 还有哪些问题?
【问题讨论】:
我经常看到(重写)没有 ID 的 URL,例如在某些 wordpress 安装中。实现这一目标的最佳方法是什么? 例子: site.com/product/some-product-name/ 也许将页面名称和 ID 数组保存在缓存中,以避免对每个页面请求进行数据库查询? 如何避免冲突,使用不带 ID 的 url 还有哪些问题?
【问题讨论】:
实际上,使用 ID 会带来同样的难题——您只是在检查数据库中的不同值。上面 URL 的“some-product-name”部分也是独一无二的。有些人称它们为蛞蝓(Wordpress,也称为永久链接)。因此,您不是在数据库中查询具有特定 ID 的行,而是在数据库中查询具有特定 slug 的行。您无需知道 ID 即可检索记录。
【讨论】:
只要产品名称是唯一的,这应该不是问题。只要列被编入索引,通过唯一名称而不是数字 ID 来查找产品就不会花费更多时间(至少不重要)。
【讨论】:
Wordpress 在 wp_posts 表中有一个字段用于 slug。当您创建帖子时,它会从帖子标题创建一个 slug(如果您是这样配置的),用破折号替换空格(或者我认为您可以将其设置为下划线)。它还去掉了撇号、逗号或诸如此类的东西。我相信它也限制了蛞蝓的总长度。
因此,简而言之,它不会将 URL 动态解码为帖子的标题 - 表中有一个字段直接匹配帖子名称的 URL 版本。
【讨论】:
您可能知道也可能不知道,正在使用 Apache 的 mod_rewrite 模块重写 URL。正如这里提到的,Wordpress 在后台处理标题或帖子名称后分配一个 slug。
但是,为了回答您的问题,您所描述的是 Wordpress 的“Pretty Permalinks”功能,您可以在Wordpress codex 中了解更多信息。较新版本的 Wordpress 在内部进行重写(没有 .htaccess 编辑,wp_rewrite 代替)。这就是为什么您会看到任何固定链接结构的相同规则集。
不过,如果您进行一些挖掘,您可以找到旧的重写规则。例如:
RewriteRule ^([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/?$ /index.php?year=$1&monthnum=$2&day=$3 [QSA,L]
将采用/2008/01/01/ 之类的网址并将其定向到/index.php?year=2008&monthnum=01&day=01(并加载日期类别)。
但是,如上所述,像 product-name 这样的页面仅存在,因为 Wordpress 已经清理了帖子标题并将其作为字段存储在数据库中。
【讨论】: