Drupal链接URI含internal:/和entity:无法访问,如何移除?
解决Drupal链接URI中internal:/和entity:前缀的问题
嘿,我之前在Drupal开发里也碰到过一模一样的问题——这些前缀是Drupal内部用来区分链接类型的标识,但直接输出确实会导致链接无法访问。给你几个实用的解决思路,按需选择:
1. 在Twig模板中直接处理(最快捷,无需写自定义模块)
这是前端输出时最常用的方式,有两种靠谱思路:
方法A:用Drupal自带的url过滤器自动解析(推荐)
Drupal的Twig过滤器url可以自动识别internal:/和entity:类型的URI,直接生成可访问的路径,不用手动处理字符串,容错性更强:
{# 直接对URI使用url过滤器,生成正确的访问路径 #} {% set valid_link = paragraph.field_stage_element_hp_link.uri|url %} <a href="{{ valid_link }}">{{ paragraph.field_stage_element_hp_link.title.value }}</a>
方法B:手动字符串替换(适合特殊场景)
如果需要更精细的控制,可以手动判断前缀并截取:
{% set raw_uri = paragraph.field_stage_element_hp_link.uri.value %} {% set cleaned_uri = raw_uri %} {# 移除internal:/前缀 #} {% if raw_uri starts with 'internal:/' %} {% set cleaned_uri = raw_uri|slice(9) %} {# 处理entity:前缀,比如entity:node/123转成/node/123 #} {% elseif raw_uri starts with 'entity:' %} {% set cleaned_uri = '/' ~ raw_uri|slice(7) %} {% endif %} <a href="{{ cleaned_uri }}">{{ paragraph.field_stage_element_hp_link.title.value }}</a>
2. 在自定义模块后端处理(适合后端逻辑、数据导出等场景)
如果需要在PHP代码里处理这个URI(比如导出数据、自定义字段输出),可以用Drupal的Url类来解析:
// 从paragraph字段获取原始URI $raw_uri = $paragraph->get('field_stage_element_hp_link')->getString(); try { // 解析URI生成Url对象 $url_object = \Drupal\Core\Url::fromUri($raw_uri); // 获取可访问的路径字符串 $cleaned_path = $url_object->toString(); } catch (\InvalidArgumentException $e) { // 如果URI无效, fallback到原始值 $cleaned_path = $raw_uri; }
这种方式会自动处理所有Drupal支持的链接类型,比手动替换更健壮。
3. 在Views中处理(如果是Views输出链接)
如果是在Views里展示这个链接字段:
- 编辑对应的链接字段,在「重写结果」里选择「输出此字段为链接」,然后在「链接路径」中选择字段的URI值,Drupal会自动解析前缀生成正确路径;
- 或者用「全局:自定义文本」字段,嵌入Twig代码来处理(参考上面的Twig方法)。
内容的提问来源于stack exchange,提问作者Rached Nemr
相关产品推荐
相关产品推荐

