如何使用mod_rewrite实现此目的?
from:
.com/index.php?menu=home
to:
.com/home
和
from:
.com/index.php?menu=home&list=hello
to:
.com/home/hello
另外(没有文件夹hierarki)
from:
.com/index.php?menu=home&list=hello
to:
.com/hello
我正在使用它作为第一个:
RewriteRule ^([^/\.]+)/?$ index.php?menu=$1 [L]
但如果有多个变量,如何连接它们?
试过这个:
RewriteRule ^([^/]*)/([^/]*)?$ index.php?home=$1&list=$2
答案 0 :(得分:1)
您误解了应该如何重写URL。当您使用MVC
模式时,您的URL会告诉框架/引导程序执行哪个控制器和方法。
因此,您的网址应该类似于:http://host.com/CONTROLLER/ACTION/what/ever
。这就是为什么你不能将.com/index.php?menu=home&list=hello
重写为.com/hello
。当http://host.com/hello
是controller
时,以及它是action
(控制器类的方法)时,将无法区分。
以下代码将重写:
.com/whatever
为.com/index.php?menu=whatever
.com/whatever/youwant
为.com/index.php?menu=whatever&list=youwant
.com/whatever/youwant/with/additional/parameters
为.com/index.php?menu=whatever&list=youwant&additional=$5
。
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)([/])?([^/]*)?([/])?(.*)$ index.php?menu=$1&list=$3&additional=$5 [L,QSA]
答案 1 :(得分:0)
很多令人头疼的问题,为什么不创建 1 规则并将路由传递给您的脚本,然后使用explode()来拆分和定义:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]
然后在你的PHP中
<?php
$route = explode('/',$_GET['route']);
$menu = (!empty($route[0])?:null);
$list = (!empty($route[1])?:null);
?>
BTW你的第三个例子是不可能的。