在请求筛选器中抛出404错误是否安全?

时间:2012-08-10 作者:Joseph Leedy

我正在为我的个人网站开发一个插件,我希望它具有一定的永久链接结构(/项目/项目类型/子类型/项目)。为了实现这一点,我使用request 滤器

在我的hook方法中,我正在检查以确保在加载post类型(project)之前分类(y | ies)(project\\u type)存在。如果没有,过滤器将抛出404错误并加载主题的错误模板,而不是仅显示项目。这样做安全吗?

public function request( $request ) {
    $dummy_query = new \\WP_Query();
    $dummy_query->parse_query( $request );

    if ( ! $dummy_query->is_admin && isset( $request[\'project_type\'] ) ) {
        $last_segment = basename( $request[\'project_type\'] );

        if ( false === get_term_by( \'slug\', $last_segment, \'project_type\' ) ) {
            $types = explode( \'/\', substr( $request[\'project_type\'], 0, strrpos( $request[\'project_type\'], \'/\' ) ) );

            foreach( $types as $type ) {
                if ( false === get_term_by( \'slug\', $type, \'project_type\' ) ) {
                    header( \'HTTP/1.0 404 Not Found\' );
                    locate_template( array( \'404.php\' ), true, true );
                    exit;
                }
            }

            $request[\'post_type\'] = \'project\';
            $request[\'project\'] = $last_segment;
            $request[\'name\'] = $last_segment;
        }
    }

    return $request;
}
此代码修改自this answer.

1 个回复
最合适的回答,由SO网友:Rarst 整理而成

虽然我不认为这有什么特别的问题,但您可以在早期中断代码流。

我会尝试将查询设置为is_404 相反,让它自然地达到模板处理和模板层次结构中的404。

结束

相关推荐

Page Name and Permalinks

我正在使用WordPress 3.2.1,刚刚在我的网站上添加了一个名为“中心管理”的页面,这反过来又创建了一个永久链接:http://localhost:8888/mysite/centre-management/对于我刚刚创建的页面。之后,我把这个页面弄得一团糟,想重新开始。因此,当我现在创建另一个与上述名称相同的新页面时,即“中心管理”,WordPress现在为我创建一个永久链接:‎http://localhost:8888/mysite/centre-管理-2/这不是我想要的。我希望它显示为:ht