我试图重写某些查询字符串我有我的网址是这样的:国防部重写和查询字符串
foo.com/index.php?page=admin&view=news&action=edit&id=3
到
foo.com/admin/news/edit/3
,但找不出出来...
它应该也可以,如果我只有'页面'参数的例子,因为我不总是有这4个参数(页面,视图,行动,ID)在我的网址,当然。
有什么建议吗?
我试图重写某些查询字符串我有我的网址是这样的:国防部重写和查询字符串
foo.com/index.php?page=admin&view=news&action=edit&id=3
到
foo.com/admin/news/edit/3
,但找不出出来...
它应该也可以,如果我只有'页面'参数的例子,因为我不总是有这4个参数(页面,视图,行动,ID)在我的网址,当然。
有什么建议吗?
最简单的方法是做大部分的PHP代码解析。
使用的RewriteRules像
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
,然后访问从PHP请求URI($_SERVER['REQUEST_URI']
),并将其解析为尽可能多的部分,只要你想。
在.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 ...”
我写这段代码来解析你想要使用到一个参数数组的类型。它很灵活,这意味着您可以在每个页面上以完全不同的方式使用参数。您将需要它与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'
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]*)/?([^/]*)/?([^/]*)/?([^/]*) index.php?page=$1&view=$2&action=$3&id=$4
需要什么,但mod_rewrite的,所有的参数都是可选的。
我用爆炸PATH_INFO代替:) 谢谢:) – allaire 2010-04-12 17:08:27