Path: 易读的 URL

path 模块允许你指定 Drupal URL 的别名。这些别名为站点用户增强了 URL 的可读性并可能帮助互联网搜索引擎更有效地索引你的内容。 每个页面都可以建立多个别名。

一些 URL 别名的示范:

  • user/login => login
  • image/tid/16 => store
  • taxonomy/term/7+19+20+21 => store/products/whirlygigs
  • node/3 => contact
  • node/10 => products/merchandise/cups
  • node/10 => cups
  • node/11 => products/merchandise/coffeemakers

path 模块在所有的节点输入和编辑界面加入额外的输入别名的区域 (当然要求该用户具有相应的权限),它也提供一个查看和编辑所有 URL 别名的界面。

这个模块同时带来了用户批量定义 URL 别名的可能性,这对于希望统一的 URL 别名而不是默认的地址很有用处。 例如,你可能希望在不同的语言中有自己的 URL 表现形式,在 web 服务器上访问 Drupal 源代码需要设置这些类型的别名。

你可以

  • 用 path 模块为文章设置路径。
  • 添加一个 URL 别名: 管理 >> url 别名 >> 添加别名
  • 管理 URL 别名列表: 管理 >> url 别名
  • 阅读如何为你的 webserver 配置简洁 URL
  • 管理 >> 设置常规设置 区域启用 简洁 URL 以去除 =? 。
  • 安装和使用 pathauto 模块 可以自动建立 url 别名。

批量建立 URL 别名

Drupal 同时带给用户进行批量指定 URL 别名的可能性。 你可能愿意看到 Drupal 使用完全不一样的 URL,或者是将 URL 翻译为访问者的本地语言,不论是哪种情形,这个特性都是相当棒的。 只有可以访问站点源代码的管理员才能设置这种类型的别名,你可以在代码的某处定义一个函数 (甚至在 settings.php),请看下面的示范:

<?php
// 用于 Drupal 4.6.x 的示范
function conf_url_rewrite($path, $mode = 'incoming') {
  if (
$mode == 'incoming') { // 来自客户端的 URL
   
return preg_replace('!^display/(\d+)$!', 'node/\1', $path);
  }
  elseif (
$mode == 'outgoing') { // 输出到客户端的 URL
   
return preg_replace('!^node/(\d+)$!', 'display/\1', $path);
  }
}
?>

<?php
// 适用于 Drupal 4.7.x 以上的示范
function custom_url_rewrite($type, $path, $original) {
 
// 如果这个路径已经有别名了,跳过它
 
if ($path != $original) {
    return
$path;
  }
  if (
$type == 'source') { // 来自客户端的 URL
   
return preg_replace('!^display/(\d+)$!', 'node/\1', $path);
  }
  elseif (
$type == 'alias') { // 输出到客户端的 URL
   
return preg_replace('!^node/(\d+)$!', 'display/\1', $path);
  }
}
?>

这个函数将每个 node/$node_id 类型的 URL 转为 display/$node_id。 你自己定制的 URL 别名将不受影响,因此,如果你有一个 'contact' 页面别名,那么 display/3 别名将不会生效。

利用这个特性,你不仅仅可以用来缩短你的 URL,或者将他们翻译为你自己的语言,你还可以添加全新的次级 URL 到已经存在的模块的 URL 空间,或者将存在的组合到公共的 URL 空间。举个例子,你可以为“新闻”词汇下的页面别名建立一个 news 部分,这样就可以拥有 news/15news/sections/3 这样的 URL 而不是 node/15taxonomy/term/3。 当然要做如此高级的别名,你需要广泛地了解 Drupal 的内部工作机理和正则表达式。