2011-04-18 50 views
0

这是一个Apache .htaccess问题。带有Kohana PHP框架的URL中的连字符

在Kohana的PHP框架(我是3.1),它不会出现,他们支持连字符的URL的控制器或动作,这是域后的第2个URL参数,如:

http://example.com/controller/action

OR

http://example.com/blogs/edit-article

有没有一种办法可以让我的.htaccess文件,这样我可以剥夺连字符(破折号)从控制器和动作插槽,而不是其他SLO TS?这是我目前的.htaccess文件:

Options All +FollowSymLinks -Indexes -Multiviews 

# Turn on URL rewriting 
RewriteEngine On 

# Installation directory 
RewriteBase/

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

RewriteRule ^assets/(.*)$ application/views/assets/$1 

RewriteCond %{REQUEST_FILENAME} !/application/views/assets/.* 

# 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] 
+0

另请参阅http://stackoverflow.com/questions/7404646#answer-8751122 – ChrisV 2012-10-14 16:42:58

回答

2

在Kohana中3.1的boostrap.php我的项目,我不得不添加此默认路由上面:

Route::set(
    'custom', 
    function($uri) { 
     $uri = rtrim($uri, '/'); 
     $asParts = @ explode('/',$uri); 
     $controller = @ $asParts[0]; 
     $action = @ $asParts[1]; 
     $param1 = @ $asParts[2]; 
     $param2 = @ $asParts[3]; 
     $param3 = @ $asParts[4]; 
     $controller = str_replace('-','_',$controller); 
     $action = str_replace('-','_',$action); 
     $controller = (empty($controller)) ? 'home' : $controller; 
     $action = (empty($action)) ? 'index' : $action; 
     return array(
      'controller' => $controller, 
      'action' => $action, 
      'param1' => $param1, 
      'param2' => $param2, 
      'param3' => $param3 
     ); 
    } 
); 

这让我做以下事情:

  • 动作中的破折号变为控制器类中带有下划线的函数。所以,'add-new'变成'action_add_new()'。
  • 控制器中的破折号变成子文件夹,因为控制器在kohana中自然强调表示子文件夹。所以,由于控制器上面的str_replace()函数,如果我有'test1-test2'的控制器,Kohana会去查找一个控制器文件夹'test1',然后是一个控制器文件'test2.php'。但问题是,你的test2.php需要以'Controller_Test1_Test2 extends Controller {'开始。
  • 然后,我也能够通过URL后的3个友好的参数,而不必使用更丑陋?p1 = blah & p2 = blah & p3 =等值查询参数技术。这是explained more here