Apache重写问题,自定义URI

时间:2010-06-30 17:06:57

标签: apache mod-rewrite uri

我有一个解决方案,但我知道它不是最好的解决方案,最好通过完全重写来解决。基本上我有3个重写,将转到我想要的正确区域并做他们需要做的事情。然而,为了在我需要去的地方之间切换,我必须编写一个URI类来剥离通过url设置页面和vars手动。这一切都很好,但是如果格式不正确的话,网址会很痛苦。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/bsiadmin/$ /bsiadmin/index.php [L,QSA]
RewriteRule ^/bsiadmin/(.+)/$ /bsiadmin/index.php?page=$1 [L,QSA]
RewriteRule ^/(.+)/$ /index.php?page=$1 [QSA]

因此,第一条规则将确保将所有内容都指向目录而不是根index.php,如果指定了“页面”,则第二条规则将执行相同操作。最后一条规则将采取其他任何措施,并确保它使用根index.php并从那里开始。

网址示例:

http://mysite.test/icecream/id=2/

我的自定义uri类会删除它并将id设置为$ _REQUEST var。

我想我真正想知道的是如何重写一个简单的网址,例如:

http://mysite.test?page=icecream&id=2

AS

http://mysite.test/icecream/id/2/

没有任何限制可以传递多少变量而且存在的目录“bsiadmin”可以显示而不必使用uri类来指示它。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您可以使用mod_rewrite执行此操作:

RewriteRule ^/([^/]+)/([^/]+)/([^/]+)/(.*) /$1/$4?$2=$3 [N,QSA]
RewriteRule ^/([^/]+)/$ /bsiadmin/index.php?page=$1 [L,QSA]

但我认为最好的方法是使用PHP来完成这项工作。因为使用mod_rewrite,您一次只能重写固定数量的URL参数(这里每次重写一次)。使用PHP,您可以解析任意数量的参数,如下所示:

$_SERVER['REQUEST_URI_PATH'] = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$segments = explode('/', $_SERVER['REQUEST_URI_PATH']);
if (count($segments) > 2) {
    for ($i=4, $n=count($segments); $i<$n; $i+=2) {
        $_GET[rawurledecode($segments[$i-1])] = rawurldecode($segments[$i]);
    }
    $_GET['page'] = rawurldecode($segments[1]);
}

然后你需要mod_rewrite所需要的只是一条规则来重写对你的 index.php 的请求:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !^/bsiadmin/index\.php$ /bsiadmin/index.php [L]