mod重写和查询字符串

时间:2010-04-09 00:34:26

标签: php apache mod-rewrite

我正在尝试重写我的URL中的一些查询字符串,如下所示:

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

foo.com/admin/news/edit/3

但无法弄清楚......

如果我只有'page'参数,它也应该有效,因为我的网址中并不总是有这4个参数(page,view,action,id)。

有什么建议吗?

4 个答案:

答案 0 :(得分:3)

最简单的方法是在PHP代码中进行大部分解析。

使用像

这样的重写符号
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d    
RewriteRule . index.php [L]

然后从PHP访问请求uri($_SERVER['REQUEST_URI']),并将其解析为任意数量的部分。

答案 1 :(得分:3)

我编写了这段代码来解析你想要用于参数数组的url。它非常灵活,这意味着您可以在每个页面上以完全不同的方式使用这些参数。您需要将它与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'

答案 2 :(得分: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 :(得分:0)

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

只需要mod_rewrite,所有参数都是可选的。