mod_rewrite规则

时间:2010-11-19 00:42:29

标签: php apache .htaccess mod-rewrite

什么规则会像这样翻译网址?

host.com/plastic_toys/pink_barbie/
host.com/index.php?q=plastic+toys+pink+barbie

类别和产品名称中的组件数量各不相同。

编辑:

我想这条规则可以完成部分工作:

RewriteRule ^([^/]*)/([^/]*)$ /index.php?q=$1+$2 [L]

上述规则的问题在于它不会将下划线转换为+,因此它的翻译方式如下:

host.com/plastic_toys/pink_barbie/
host.com/index.php?q=plastic_toys+pink_barbie

我想我必须将该转换委托给PHP。现在有没有办法测试规则是否实际按照我的想象进行转换?

3 个答案:

答案 0 :(得分:3)

是否有理由(现有代码等)需要完全重写?

通常,我做

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

然后解析$_GET["q"]甚至直接解析$_SERVER["REQUEST_URI"]preg_match()是你的朋友。

使用这两种方法中的一种方法所花费的时间少于尝试进行奇怪重写的时间。

答案 1 :(得分:1)

首先 - 我建议使用以下规则:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z_]+)/([a-zA-Z_]+)/?$ /index.php?q1=$1&q2=$2 [L,QSA]

RewriteCond每次检查一个有效的文件或目录是否存在(例如,如果你想要一个静态的/help.html并且它存在,或者/FAQ/index.php并且它存在,那么RewriteRule将不会触发

我已将参数拆分为2个项目 - 因此您可以将它们视为单独的参数(如果您想将其视为1个参数,只需将其更改为/index.php?q=$1-$2或其他一些分隔符你想要的 - 我会说不要使用+,因为你想要解析那个角色。)

答案 2 :(得分:0)

无。规则如何知道在类别和产品之间划线的位置。如果查询有3个参数怎么办?前两个是类别,最后一个是产品,还是第一个类别,最后两个是产品。