You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Drupal中如何为同一个节点自动生成2个URL别名?

Drupal同一节点自动生成多URL别名的实现方案

实现方式判定

Pathauto 模块原生仅支持单节点生成1个默认URL别名,无法通过后台配置直接实现单节点多别名自动生成,该需求必须通过自定义代码扩展完成。

具体实现步骤

  • 前置准备:确认已启用Pathauto、Path核心模块,拥有可正常运行的自定义功能模块
  • 通过Drupal实体钩子监听节点的新增、更新事件,在Pathauto生成默认别名后,自动插入第二条自定义规则的别名即可
  • 参考代码(放置在自定义模块的.module文件中,以内容类型article为例,可按需修改适配):
<?php

use Drupal\node\NodeInterface;

/**
 * Implements hook_node_insert().
 * 节点新增时自动生成第二个别名
 */
function your_custom_module_node_insert(NodeInterface $node) {
  // 仅对指定内容类型生效,可修改为你需要的内容类型机器名
  if ($node->bundle() !== 'article') {
    return;
  }
  // 生成第二个别名,规则可按业务需求自行调整,示例规则为/second-prefix/[节点ID]
  $second_alias = '/second-prefix/' . $node->id();
  // 保存别名到系统别名表,关联到当前节点的默认系统路径
  \Drupal::service('path.alias_storage')->save(
    '/node/' . $node->id(),
    $second_alias,
    $node->language()->getId()
  );
}

/**
 * Implements hook_node_update().
 * 节点更新时同步更新第二个别名
 */
function your_custom_module_node_update(NodeInterface $node) {
  if ($node->bundle() !== 'article') {
    return;
  }
  $langcode = $node->language()->getId();
  $system_path = '/node/' . $node->id();
  // 删除旧的自定义别名避免重复
  $existing_aliases = \Drupal::service('path.alias_storage')->loadByProperties([
    'source' => $system_path,
    'langcode' => $langcode,
  ]);
  foreach ($existing_aliases as $alias) {
    // 仅删除我们自定义前缀的别名,不影响Pathauto生成的默认别名
    if (str_starts_with($alias['alias'], '/second-prefix/')) {
      \Drupal::service('path.alias_storage')->delete($alias);
    }
  }
  // 插入新的自定义别名
  $new_second_alias = '/second-prefix/' . $node->id();
  \Drupal::service('path.alias_storage')->save($system_path, $new_second_alias, $langcode);
}
  • 代码部署完成后清空Drupal缓存,后续新增/更新对应内容类型的节点时,就会自动生成2个可访问的URL别名

额外注意事项

  • 多别名场景建议配置其中一个地址为canonical标签,避免搜索引擎判定为重复内容影响收录
  • 上述代码的别名生成规则、生效内容类型都可以根据业务需求自由调整,支持生成更多数量的别名

内容的提问来源于stack exchange,提问作者RitikaDesai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 21:45:04