【问题标题】:Mod_rewrite with multiple variables具有多个变量的 Mod_rewrite
【发布时间】:2010-05-11 02:41:54
【问题描述】:

我正在使用一个 PHP 脚本,该脚本从一个采用 RGBa 和 HSLa 值的查询字符串动态生成透明 PNG 以用作 CSS 背景。原脚本可以在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 的脚本版本,请询问。无论如何,我建议您在其作者的网站上查看。

【问题讨论】:

    标签: php mod-rewrite png css rgba


    【解决方案1】:

    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文件检查值是否在预期范围内,等等。

    【讨论】:

    • 谢谢!奇迹般有效。我理解需要检查变量是否在正确的范围内,但由于我没有将脚本暴露给用户输入,我可以不这样做。
    【解决方案2】:

    试试这个:

    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,所以无论 mod_rewrite 配置如何,/assets/colors/ 总是由 colors.php 处理。

    【讨论】:

    • 谢谢!你为什么建议使用 [QSA] 标志?
    • QSA 是“查询字符串附加”,因此如果您决定构建额外的查询字符串参数,例如 h100_s100_l100_a100.png?v=1v=1 部分将附加到内置的查询字符串的其余部分目标网址。我通常是出于习惯添加它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多