php – Kohana 3.2. – 如何在URI中使用连字符

最近我一直在研究搜索引擎优化,以及如何区分使用连字符或下划线的URI,特别是谷歌将连字符视为分隔符.

无论如何,急于调整我当前的项目以满足这个标准,我发现因为Kohana使用函数名来定义页面,我收到了意外的’ – ‘警告.

我想知道是否有任何方法可以在Kohana中使用URI,例如:

http://www.mysite.com/controller/function-name

显然我可以为此设置一个routeHandler …但是如果我要用户生成内容,即新闻.然后,我必须从数据库中获取所有文章,生成URI,然后为每个文章进行路由.

有没有替代解决方案?

解决方法:

注意:这与Laurent’s answer中的方法相同,只是略微更多的OOP. Kohana允许一个人非常轻松地重载任何系统类,因此我们可以使用它来为我们节省一些打字,并允许将来更清晰的更新.

我们可以插入Kohana中的请求流并修复URL的操作部分中的破折号.为此,我们将覆盖Request_Client_Internal系统类及其execute_request()方法.在那里我们将检查request->动作是否有破折号,如果是,我们将它们切换到下划线以允许php正确调用我们的方法.

步骤1.打开您的application / bootstrap.php并添加以下行:

define('URL_WITH_DASHES_ONLY', TRUE);

如果您需要在URL中使用下划线,则可以使用此常量在某些请求上快速禁用此功能.

步骤2.在:application / classes / request / client / internal.php中创建一个新的php文件并粘贴此代码:

<?php defined('SYSPATH') or die('No direct script access.');

class Request_Client_Internal extends Kohana_Request_Client_Internal {

    /**
     * We override this method to allow for dashes in the action part of the url
     * (See Kohana_Request_Client_Internal::execute_request() for the details)
     *
     * @param   Request $request
     * @return  Response
     */
    public function execute_request(Request $request)
    {
        // Check the setting for dashes (the one set in bootstrap.php)
        if (defined('URL_WITH_DASHES_ONLY') and URL_WITH_DASHES_ONLY == TRUE) 
        {
            // Block URLs with underscore in the action to avoid duplicated content
            if (strpos($request->action(), '_') !== false)
            {
                throw new HTTP_Exception_404('The requested URL :uri was not found on this server.', array(':uri' => $request->uri()));
            }

            // Modify action part of the request: transform all dashes to underscores
            $request->action( strtr($request->action(), '-', '_') );
        }
        // We are done, let the parent method do the heavy lifting
        return parent::execute_request($request);
    }

} // end_class Request_Client_Internal

这样做只是用下划线替换$request->动作中的所有破折号,因此如果url是/ something / foo-bar,Kohana现在会愉快地将它路由到我们的action_foo_bar()方法.

同时我们使用下划线阻止所有操作,以避免重复的内容问题.

上一篇:umi+antdpro 2.3


下一篇:查找默认网关IP地址,而不是解析proc文件系统