【发布时间】:2010-10-03 20:31:38
【问题描述】:
执行此类操作的有效 .htaccess 规则是什么
/mypage/ --> /index.php?page=mypage
/mypage/param1/value1/ -->index.php?page=mypage¶ms=param1/value1
可能有无限数量的参数?
谢谢。
【问题讨论】:
执行此类操作的有效 .htaccess 规则是什么
/mypage/ --> /index.php?page=mypage
/mypage/param1/value1/ -->index.php?page=mypage¶ms=param1/value1
可能有无限数量的参数?
谢谢。
【问题讨论】:
最好是将 /mypage/ 之后的整个部分作为参数传递给 php 脚本并对其进行解码:
RewriteRule ^mypage/(.*) index.php?page=mypage¶ms=$1 [L,NC,QSA]
如果你希望页面是动态的:
RewriteRule ^([^/\.]+)/(.*) index.php?page=$1¶ms=$2 [L,NC,QSA]
或
RewriteRule ^([^/\.]+)(/(.*))? index.php?page=$1¶ms=$3 [L,QSA]
编辑
添加 Cal 的建议,谢谢 Cal。
编辑
如果我正确理解您的评论:(如果不是,请解释)。您可以只使用带有默认操作的 switch 语句,该操作与页面变量的索引操作相同:
switch($_GET['page']){
case 'mypage':
doMyPageStuff();
break;
case 'foo':
doFooStuff();
break;
case 'index':
default:
doIndexStuff();
break;
}
【讨论】:
RewriteRule ^([^/]+)/(.+)/?$ index.php?page=$1¶ms=$2
或非常相似 - 手头没有服务器可以检查!
【讨论】:
我看到这已经有一个公认的答案,但我相信以下内容将只使用 mod_rewrite 完成您想要的。
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*/)([^/]+)/([^/]+) $1?$2=$3&%1 [L]
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^([^/]+)/ $1.php?%1 [L]
之所以有效,是因为 mod_rewrite 以递归方式运行。也就是说,每次重写后,都会再次处理新的 URL。每次遍历,最后的两个值都会变成查询参数,加入到查询字符串中。
这将重写以下内容
/mypage/param1/val1/param2/val2/param3/val3/... --->
/mypage.php?param1=val1¶m2=val2¶m3=val3&...
当只剩下一个参数时它会停止。它将采用第一个“参数”并使用该名称调用 .php 文件。 param/val 对的数量没有限制。
--
bmb
【讨论】:
这是我的建议:
RewriteRule ^([^/]+)/(([^/]+/[^/]+(/[^/]+/[^/]+)*)/)?$ /index.php?page=$1¶ms=$3 [L]
这不是很好,但完全符合您的要求。它只允许以下形式的路径:
/mypage/
/mypage/param1/value1/
/mypage/param1/value1/param2/value2/
/mypage/param1/value1/param2/value2/param3/value3/
/mypage/param1/value1/param2/value2/param3/value3/param4/value4/
…
【讨论】: