我有一个问题: 我按照以下方式手册,用SEO友好的URL编写了我的应用程序:
http://example.com/page/page-slug
使用以下URLManager规则:
'page/<slug:.*?>/<page:.*?>'=>'page/view',
'page/<slug:.*?>/'=>'page/view',
一切正常,但是当链接被共享时(我实际上并不知道在哪里),一些附加参数以奇特的方式添加:
http://example.com/page/page-slug的&安培;语言环境= EN_US&安培;流动=真安培; numposts = 5
当发生这种情况时,页面会抛出错误
Invalid argument supplied for foreach()
跟踪到我的控制器内的私有函数,该函数与此无关。
所以我的问题是:
如何清理beforeAction中的请求网址?有什么办法吗?
提前致谢: - )
答案 0 :(得分:1)
我要做的第一件事就是改进规则,使他们只接受预期值。目前你几乎要放任何东西。有点像:
'page/<slug:\w+>/<page:[a-z\-]+>'=>'page/view',
'page/<slug:\w+>/'=>'page/view',
这样做可以确保......
http://example.com/page/page-slug&locale=en_us&mobile=true&numposts=5
...因为网址与您的规则不符而导致404。
然而,无论如何,该URL都是格式错误的,因为第一个&符应该是问号。因此,如果您期望错误的网址,您可以留意它们。这是一个非常粗略的正则表达式,但你明白了:
'page/<slug:\w+>/<page:[a-z\-]+>&<rubbish:.*>'=>'page/viewWithBadUrls',
在你的actionViewWithBadUrls()控制器方法中你会得到:
print_r($_GET); // Array ( [slug] => page [page] => page-slug [rubbish] => locale=en_us&mobile=true&numposts=5 )
您可以使用,或将URL和301清理到正确的位置