【发布时间】:2011-01-19 05:02:29
【问题描述】:
我在检测 Kohana 3 中引用页面的控制器/操作名称时遇到问题。
我要做的是检测referrer页面是来自内部还是外部。如果是外部的(例如来自google),我会做一些默认设置。如果是内部引用者(即来自同一个域),我需要根据该引用者页面的控制器和操作信息做一些不同的事情。
我从检查 $_SERVER["HTTP_REFERRER"] 开始,但我坚持从该变量中获取控制器和操作名称。由于我在引导程序中自定义了路线,因此我想获得相同的路线
我知道 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;
}
【问题讨论】:
-
为什么需要控制器和操作才能知道引荐来源是外部还是内部?
-
@sberry2A:因为页面必须针对不同的引荐来源做出不同的响应。例如如果访问者来自外部,则响应 A,如果来自内部页面 X,则响应 B,如果来自内部页面 Y,则响应 C,依此类推...
-
终于找到了解决办法。请参阅上面的编辑版本。
标签: php url controller kohana action