Apache mod_rewrite规则不符合要求

时间:2017-02-12 00:22:11

标签: apache .htaccess mod-rewrite

我正在尝试转换此网址

http://www.example.com/test/products-list.php?category=cars&subcategory=coupe&color=blue

http://www.example.com/test/products/cars/coupe/blue

这些是我正在使用的规则:

RewriteRule products/(.*)/(.*)/(.*)/ /test/products-list.php?category=$1&subcategory=$2&color=$3
RewriteRule products/(.*)/(.*)/(.*) /test/products-list.php?category=$1&subcategory=$2&color=$3

适用于某些网址:

http://www.example.com/test/products/cars ----> not working
http://www.example.com/test/products/cars/ ----> not working
http://www.example.com/test/products/cars/coupe ----> not working
http://www.example.com/test/products/cars/coupe/ ----> working
http://www.example.com/test/products/cars/coupe/blue ----> working
http://www.example.com/test/products/cars/coupe/blue/ ----> working

如何修复不起作用的3个案例?还有,它不起作用的原因是什么?

1 个答案:

答案 0 :(得分:1)

我认为你的表达是在产品这个词之后寻找3或4'/'。

你的三个捕获(.*)正在使用“0或更多”重复运算符'*',但你的三个是必需的。

我相信http://www.example.com/test/products/cars//会测试为有效。

现在......如何解决?

我认为每个搜索案例都需要三次不同的重写。

  1. 类别
  2. 类别和子类别
  3. 类别,子类别和颜色
  4. 您将在下面看到我使用'+''重复运算符'强制类别子类别或<的捕获中至少有1个字符EM>颜色。

    '/?'在表达式的末尾表示'/'是可选的。这会将上述两条规则合并为一条。

    RewriteRule products/(.+)/? /test/products-list.php?category=$1
    RewriteRule products/(.+)/(.+)/? /test/products-list.php?category=$1&subcategory=$2
    RewriteRule products/(.+)/(.+)/(.+)/? /test/products-list.php?category=$1&subcategory=$2&color=$3
    

    请注意读者,我多年没有使用Apache mod_Rewrite,但我认为它只是一个正则表达式匹配问题。