我在CakePHP网站上有以下查看方法,用于显示投资组合项目:
function view ( $id, $slug )
{
$post = $this->Portfolio->read(null, Tiny::reverseTiny($id));
$this->set(compact('post'));
}
这需要一个网址,例如:http://driz.co.uk/portfolio/3z/Paperview_Magazine
但是http://driz.co.uk/portfolio/3z/也会显示帖子,http://driz.co.uk/portfolio/3z/Fake_Text也会显示!
不仅像http://driz.co.uk/portfolio/Random_Text这样完全虚假的网址只会显示空白屏幕,但仍会使用“查看”视图
1。)我如何确保slug是正确的,并强制除了id之外还在url上附加了一个slug。我已经在一些网站上看到过,例如Forrst,他们只是将用户重定向到正确的帖子,所以如果他们错过了slug或者错误输入它,它只是纠正自己,例如也可以在http://forrst.com/posts/Simple_pure_CSS_tooltip_with_arrow-BkY
访问帖子http://forrst.com/posts/Simple_pure_CSS_tooltip_and_extra_text_added_to_url_arrow-BkY2.。)如何为http://driz.co.uk/portfolio/Random_Text
等公牛网址显示404感谢
答案 0 :(得分:1)
回答1: 您可以通过使用beforeRender, beforeFilter或afterFind来实现此目的。这将涉及获取提交的slug,将其传递给您的模型,检查它是否有效,并根据需要执行任何其他逻辑。如果它通过,则显示内容,否则重定向/无论如何。
但是http://driz.co.uk/portfolio/3z/也会显示帖子,http://driz.co.uk/portfolio/3z/Fake_Text也会显示!
如果您确定您的view
方法只会采用两个参数;你可以这样做:
function view($id, $slug, $bogus=null) {
if($bogus) {
$this->cakeError('error404');
}
// carry on as normal.
}
基本上,如果有第3个URI段,那么我们可以假设它是 bogus URL(虽然它仍然可以显示,因为你的方法使用$id
,所以这不是在我看来,必要。
要防止发生portfolio/Random_text
,您需要检查参数是否有效 - 因此在您使用$id
时,它应该是数字。然后,您应该针对您的数据库进行检查,如果找到结果则显示它,否则不要。
可能还有其他解决方案。
也; IMO可能不值得担心太多。如果有人想要使用URL,那么你最好只使用404,而不是试图解决他们自己的混乱。至少我的2点!