具有多个变量的Mod_rewrite

时间:2010-05-10 18:20:00

标签: php mod-rewrite png css3 rgba

我正在使用一个PHP脚本,该脚本动态生成透明PNG,用作来自查询字符串的CSS背景,该字符串采用RGBa和HSLa值。可以找到原始脚本here,我只添加了HSLa支持。

因为带有PHP查询字符串的后台URL不是很漂亮,并且因为它似乎打破了IE 6透明的PNG hack,所以我想到使用mod_rewrite来允许在调用带有此语法的.png时调用脚本:

/assets/colors/h[0-360 value]_s[0-100 value]_l[0-100 value]_a[0-100 value].png

将被重写为:

/assets/colors.php?h=[0-360 value]&s=[0-100 value]&l=[0-100 value]&a=[0-100 value]

以下是我遇到的问题:

  • 使用mod_rewrite传递多个变量
  • 使用下划线作为分隔符

我知道这可以通过传递单个变量然后在PHP脚本中进行爆炸来完成,但我更希望它由Apache完成。

提前致谢,如果有人想要我的HSLa启用版本的脚本,请询问。无论如何,我建议你在作者的网站上查看。

2 个答案:

答案 0 :(得分:3)

mod_rewrite将匹配大括号()中的内容,然后您可以按照它们匹配的顺序将它们称为$ 1,$ 2等。因此,您可以使用它来提取多个变量,只需将它们放在大括号内即可。

所以这样的事情对你有用,

RewriteRule ^assets/colors/h([0-9]{1,3})_s([0-9]{1,3})_l([0-9]{1,3})_a([0-9]{1,3}).png assets/colors.php?h=$1&s=$2&l=$3&a=$4 

([0-9]{1,3})将匹配连续数字0-9中的1,2或3。所以“3”,“10”和“100”等等。但它也匹配“999”,所以你需要确保colors.php文件检查值是否在预期的范围内等。

答案 1 :(得分:0)

试试这个:

RewriteEngine on
RewriteRule /assets/colors/h([0-9]+)_s([0-9]+)_l([0-9]+)_a([0-9]+).png /assets/col.php?h=$1&s=$2&l=$3&a=$4 [QSA,L]

我不得不更改我的脚本名称以使其工作。因为我有Options MultiViews,所以/ assets / colors /总是由colors.php处理,无论mod_rewrite配置如何。