如何限制对节点的直接访问,而仅允许视图访问特定节点类型的必填字段?
例如,在“视图幻灯片”中,我们正在滑动属于特定节点类型的图像字段。但是我们不希望搜索引擎访问和访问者访问属于该节点类型的节点。
有什么建议?
如何限制对节点的直接访问,而仅允许视图访问特定节点类型的必填字段?
例如,在“视图幻灯片”中,我们正在滑动属于特定节点类型的图像字段。但是我们不希望搜索引擎访问和访问者访问属于该节点类型的节点。
有什么建议?
Answers:
一个简单的解决方案是不发布您不想访问的节点。视图仍然可以从那些节点中提取数据。
如果我们取消发布由user1添加的节点,则即使该用户有权编辑该内容类型的内容,也不能由任何其他用户编辑它们。
限制节点页面视图似乎是一种更好的方式来限制对特定内容类型的任何节点的直接访问。
用法也相当简单,您只需要启用此模块并为通常可以直接访问的节点配置权限即可。
http://drupal.org/project/restrict_node_page_view
从项目页面:
您是否曾经使用过需要发布的幻灯片放映节点类型,但不希望节点本身可以使用node / XXX路径进行访问?该模块适合您!
使用此模块,您可以基于节点类型和权限禁用对节点页面(node / XXX)的直接访问。
启用该模块,不要忘记配置您的权限。
您应该使用node_access()
,您可以轻松实现某些选项hook_node_access()
。通过实施node_access()
,您可以决定谁可以访问节点以及谁可以创建,删除,编辑或更新该节点。但是,视图仍然可以从这些节点中提取数据。
受https://www.drupal.org/project/restrict_node_page_view的启发,您可以自己编写一个小模块:
/**
* Implements hook_node_access()
*/
function MYMODULE_node_access($node, $op, $account) {
// Default checks
if (!is_object($node)) {
return NODE_ACCESS_IGNORE;
}
$type = is_string($node) ? $node : $node->type;
if($op == 'view' && arg(0) == 'node' && arg(1) === $node->nid) {
// Restrict access to full MYTYPE node for anon users
if ($type == 'MYTYPE' && user_is_anonymous()) {
return NODE_ACCESS_DENY;
}
}
// Default
return NODE_ACCESS_IGNORE;
}
使用“ 规则”模块,您可以实现类似于以下内容的规则:
{ "rules_check_url" : {
"LABEL" : "Disallow node/* access",
"PLUGIN" : "reaction rule",
"OWNER" : "rules",
"REQUIRES" : [ "rules" ],
"ON" : { "init" : [] },
"IF" : [
{ "text_matches" : {
"text" : [ "site:current-page:url" ],
"match" : "node\/\\d+$",
"operation" : "regex"
}
}
],
"DO" : [
{ "drupal_message" : {
"message" : "Sorry, direct access to URLs like [site:current-page:url] is not allowed around here ...",
"type" : "error"
}
},
{ "redirect" : { "url" : "no_access" } }
]
}
}
上面的规则(尚未)未考虑仅将“操作”仅应用于所选角色(例如,以便管理员仍可以使用这些路径来查看节点)。但是对于任何有点熟悉“规则”模块的人来说,这就是添加的直接“条件” ...
要在您自己的站点中试验此规则,只需复制上面的整个“规则”代码,然后将其粘贴到您自己的站点中通过“导入”功能创建的新规则中即可。然后进一步编辑/优化以使其适合您自己的环境(例如,显示“ Sorry,...”消息)。