我在Kohana 3中检测引荐来源页面的控制器/操作名称时遇到问题。
我要做的是检测引荐来源页面是来自内部还是外部。如果它是外部的(例如来自谷歌),我会做一些默认设置。如果它是内部引用者(即来自同一域),我需要根据该引用者页面的控制器和动作信息做一些不同的事情。
我从检查$ _SERVER [“HTTP_REFERRER”]开始,但我坚持从该变量中获取控制器和操作名称。由于我在bootstrap中定制了路由,我希望得到相同的
我知道Kohana提供了获取当前请求的控制器和操作的方法。
$this->request->controller
$this->request->action
$this->request->param('paramname')
虽然我们想知道是否有方法可以解析给定的URL字符串并返回控制器/操作/参数信息。
任何想法??
更新:
在Kohana源代码中进行了数小时的研究后,我发现了一个分为两个步骤的解决方案:
步骤1.将URL转换为URI。如果它来自外部引用者,则URI应为NULL。
function URL2URI($URL)
{
if (empty($URL)) return NULL;
$url_info = parse_url($URL);
if (!isset($url_info['host']) || !isset($url_info['path'])) return NULL;
return ($url_info['host'] === $_SERVER['HTTP_HOST']) ? ltrim($url_info['path'], '/') : NULL;
}
步骤2.使用所有路由测试URI并从路径中获取与URI匹配的信息($ match ['controller'],$ match ['action'])。
function getInfoFromURI($URI)
{
if (empty($URI)) return NULL;
$routes = Route::all();
foreach ($routes as $oneRoute)
if ($match = $oneRoute->matches($URI))
return $match;
return NULL;
}
答案 0 :(得分:1)
你不应该使用:
$controller = Request::factory($your_url_without_http)->controller;
$action = Request::factory($your_url_without_http)->action;