我有一个解决方案,但我知道它不是最好的解决方案,最好通过完全重写来解决。基本上我有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类来指示它。
感谢您的帮助。
答案 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]