在Kohana 3中,如何告诉表单助手停止插入'index.php'

时间:2010-01-18 01:26:34

标签: php kohana

当我在Kohana 3中使用form::open时,我得到了这个

<form action="/my-site/index.php/bla" method="post" accept-charset="utf-8"> 

我的网站上没有任何地方依赖index.php。我觉得它看起来很难看。有没有一种简单的方法可以从中删除index.php。

显然我知道我可以做str_replace(),但我认为可能有更优雅的方式?

4 个答案:

答案 0 :(得分:7)

对于Kohana3来说,它的工作方式与Kohana2.x完全相同:

application / bootstrap.php中的

是一个初始化调用:

Kohana::init(array(
  'base_url'   => '/',
  'index_file' => FALSE // This removes the index.php from urls
));

这将从所有生成的URL中删除index.php。无需重载/编辑任何Kohana课程。

请注意,您必须使用.htaccess文件

答案 1 :(得分:6)

Kohana(以及CodeIgniter和大多数其他框架)依赖于Front-Controller Patternindex.php),所以除非你深入攻击它,否则我看不出你不需要依赖它。

快速查看form::open()来源:

public static function open($action = NULL, array $attributes = NULL)
{
    if ($action === NULL)
    {
        // Use the current URI
        $action = Request::instance()->uri;
    }

    if ($action === '')
    {
        // Use only the base URI
        $action = Kohana::$base_url;
    }
    elseif (strpos($action, '://') === FALSE)
    {
        // Make the URI absolute
        $action = URL::site($action);
    }

    // ...
}

如果不指定绝对URL,我认为不可能。如果你不介意的话,可能会成为一个解决方案:

form::open('http://domain.com/my-site/bla');

否则,您最好的方法是str_replace() 或使用应用程序助手覆盖它。


如果您修改url帮助程序(/system/classes/kohana/url.php)并从中更改第71行:

return URL::base(TRUE, $protocol).$path.$query.$fragment;

对此:

return URL::base(FALSE, $protocol).$path.$query.$fragment;

所有index.php次出现都应该消失。


我不确定这是否有效,但在application/bootstrap.php更改此内容:

Kohana::init(array('base_url' => '/kohana/'));

对此:

Kohana::init(array('base_url' => '/kohana/', 'index_file' => ''));

答案 2 :(得分:1)

除了几分钟,我没有和Kohana 3一起玩过。

在Kohana 2中,有一个配置设置,您可以设置为空字符串

$config['index_page'] = '';

我的一位同事在Kohana 3开发团队工作,所以如果你明天没有一个可靠的答案,我可以问他。快速查看form.php表明,action的NULL值将从Request :: instance() - &gt; uri()中获取值,而后者将从Route类中获取其值。你可以通过回溯路由实例来找到答案,看看在哪里设置了什么。否则,就像我提到的那样,明天我会问我的同事。

答案 3 :(得分:0)

除了Casper的响应之外,这里还有默认的KO3 .htaccess(从example.htaccess重命名)文件,可以重写URL。

# Turn on URL rewriting
RewriteEngine On

# Installation directory
RewriteBase /kohana/

# Protect hidden files from being viewed
<Files .*>
    Order Deny,Allow
    Deny From All
</Files>

# Protect application and system files from being viewed
RewriteRule ^(?:application|modules|system)\b index.php/$0 [L]

# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# Rewrite all other URLs to index.php/URL
RewriteRule .* index.php/$0 [PT]