2010-04-09 32 views
1

我试图重写某些查询字符串我有我的网址是这样的:国防部重写和查询字符串

foo.com/index.php?page=admin&view=news&action=edit&id=3 

foo.com/admin/news/edit/3 

,但找不出出来...

它应该也可以,如果我只有'页面'参数的例子,因为我不总是有这4个参数(页面,视图,行动,ID)在我的网址,当然。

有什么建议吗?

回答

3

最简单的方法是做大部分的PHP代码解析。

使用的RewriteRules像

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d  
RewriteRule . index.php [L] 

,然后访问从PHP请求URI($_SERVER['REQUEST_URI']),并将其解析为尽可能多的部分,只要你想。

+0

我用爆炸PATH_INFO代替:) 谢谢:) – allaire 2010-04-12 17:08:27

0

在.htaccess文件把这两行:

RewriteRule ^/([^/]+)$ index.php?page=$1 [L] 
RewriteRule ^/([^/]+)/([^/]+)/([^/]+)/([^/]+)$ index.php?page=$1&view=$2&action=$3&id=$4 [L] 

下,而不是调用你的页面,如 “example.com/index.php?var=1 & VAR = 2 ......” 电话他们喜欢这个“example.com/1/2 ...”

3

我写这段代码来解析你想要使用到一个参数数组的类型。它很灵活,这意味着您可以在每个页面上以完全不同的方式使用参数。您将需要它与Joel L建议的请求处理程序一起使用它。

它还允许老派的$ _GET查询字符串被理解,以防万一,并且它也会覆盖$ _SERVER ['PHP_SELF']以表现您的预期行为,具有控制脚本的路径而不是包含所有参数的整个网址。

我很快就编辑它作为独立功能使用,所以要小心输入错误。此外,欢迎任何改进此代码的建议。

<?php 
function parseRequestUrl($http_server = 'http://example.com'){ 

    $request = $_SERVER['REQUEST_URI']; 
    $request = explode('?', $request); 
    if (isset($request[1])){ 
     $get_data = $request[1]; 
     parse_str($get_data, $_GET); 
    } 
    $request = $request[0]; 

    $url_data = array_values(array_filter(explode('/', $request))); 
    $url_level = substr_count($http_server, '/', 8); 
    foreach($url_data as $key => $val){ 
     if($key>$url_level){ 
      $parameter[] = $val; 
     } else if ($key==$url_level){ // controller is also stored at $this->parameter[0] 
      $parameter[] = $controller = $val; 
     } 
    } 

    if(!isset($controller) || !$controller){ 
     $parameter[0] = $controller = 'index'; 
    } 
    $_SERVER['PHP_SELF'] = $http_server.'/'.$controller; 

    return $parameter; 
} 
    ?>

对于$ http_server使用您网站的域名。

所以,如果你使用上的要求: http://site.com/news/category/arts/page/5

您将获得以下变量回:


$parameter[0] => 'news' 
$parameter[1] => 'category' 
$parameter[2] => 'arts' 
$parameter[3] => 'page' 
$parameter[4] => '5' 
0
RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^/]*)/?([^/]*)/?([^/]*)/?([^/]*) index.php?page=$1&view=$2&action=$3&id=$4 

需要什么,但mod_rewrite的,所有的参数都是可选的。