坚持在htaccess中重写URL,使用Apache:1规则对它们进行全部规则

坚持在htaccess中重写URL,使用Apache:1规则对它们进行全部规则,apache,.htaccess,url-rewriting,apache2,Apache,.htaccess,Url Rewriting,Apache2,检查我当前的url重写以加载图片: // Possibiities: 1 letter char, followed by `=` then the value (numbers/letters) // w= | h= | c= | q= | f= IMG-bla/blue_w100.jpg >> imgcpu?src=bla/blue.jpg&w=100 IMG-bla/blue_cp.jpg >> imgcpu

检查我当前的url重写以加载图片:

// Possibiities: 1 letter char, followed by `=` then the value (numbers/letters)
// w= | h= | c= | q= | f=

IMG-bla/blue_w100.jpg           >>  imgcpu?src=bla/blue.jpg&w=100
IMG-bla/blue_cp.jpg             >>  imgcpu?src=bla/blue.jpg&c=p
IMG-bla/blue_h200.jpg           >>  imgcpu?src=bla/blue.jpg&h=200
IMG-bla/blue_w50_h200_fbw.jpg   >>  imgcpu?src=bla/blue.jpg&w=50&h=200&f=bw 
本质上,我希望有一个最终的重写url,这使我可以自由地用任何属性重写下面的url,而不必硬编码重写的确切顺序,每个可能性有一个规则:目前我的代码非常愚蠢,不实用&不完整,它不合法,思想确实有效

// works but utterly unelegant and unpractical as well as incomplete:
RewriteRule ^IMG-(.+)_w(.+).jpg$ imgcpu\.php\?src=$1\.jpg&w=$2 [L]
RewriteRule ^IMG-(.+)_w(.+)_h(.+)_c(.+).jpg$ imgcpu\.php\?src=$1\.jpg&w=$2&h=$3&c=$4 [L]
RewriteRule ^IMG-(.+)_w(.+)_h(.+)_f(.+).jpg$ imgcpu\.php\?src=$1\.jpg&w=$2&h=$3&f=$4 [L]

现在,我如何用可选的属性资产重写这个复杂的规则呢?我正在搜索1条规则来管理所有属性资产。您的想法和建议将受到热烈欢迎,我非常乐意为任何敢于解决这个复杂难题的人投票

在得出这个非常普遍的解决方案之前,我考虑了几种方法。在这里,我重复了几次同样的规则。这是一种分而治之的策略,每次执行规则时,它都提取一个参数

# Generic rule for extracting one parameter

RewriteRule ^(IMG-[a-z0-9]+/[a-z0-9]+)_([a-z0-9])([a-z0-9]+)([_.].*)$ $1$4?$2=$3 [NC,QSA]
RewriteRule ^(IMG-[a-z0-9]+/[a-z0-9]+)_([a-z0-9])([a-z0-9]+)([_.].*)$ $1$4?$2=$3 [NC,QSA]
RewriteRule ^(IMG-[a-z0-9]+/[a-z0-9]+)_([a-z0-9])([a-z0-9]+)([_.].*)$ $1$4?$2=$3 [NC,QSA]
RewriteRule ^(IMG-[a-z0-9]+/[a-z0-9]+)_([a-z0-9])([a-z0-9]+)([_.].*)$ $1$4?$2=$3 [NC,QSA]
RewriteRule ^(IMG-[a-z0-9]+/[a-z0-9]+)_([a-z0-9])([a-z0-9]+)([_.].*)$ $1$4?$2=$3 [NC,QSA]
RewriteRule ^(IMG-[a-z0-9]+/[a-z0-9]+)_([a-z0-9])([a-z0-9]+)([_.].*)$ $1$4?$2=$3 [NC,QSA]
RewriteRule ^(IMG-[a-z0-9]+/[a-z0-9]+)_([a-z0-9])([a-z0-9]+)([_.].*)$ $1$4?$2=$3 [NC,QSA]
RewriteRule ^(IMG-[a-z0-9]+/[a-z0-9]+)_([a-z0-9])([a-z0-9]+)([_.].*)$ $1$4?$2=$3 [NC,QSA]

# Final rule which does the actual rewrite 
RewriteRule IMG-([a-z0-9]+/[a-z0-9]+\.jpg) /test/index.php?src=$1 [QSA]
让我们把D&C规则分成更小的部分

^(IMG-[a-z0-9]+/[a-z0-9]+)
此零件匹配但保留。结果是1美元

一个下划线。这是匹配的,但被丢弃

([a-z0-9])
匹配单个字母或数字(显然在undorscore后面)。这是$2,假定为参数名

([a-z0-9]+)
匹配一个或多个字母或数字。结果为$3,假设为参数值

([.].*)$
匹配一个下划线或句点,以及请求字符串末尾的所有内容。这是4美元

因此,对于每个步骤,提取一个参数(如果存在匹配项,即),然后在QSA的帮助下将其附加到查询字符串中。请求的其余部分$1$4捆绑在一起,为下一轮做好准备。冲洗并重复,直到超出参数或达到可用规则的最大数量

最后一条规则匹配到那时应该是路径和文件名的内容。 以下是步骤:

IMG-bla/blue_w50_h200_fbw.jpg -> IMG-bla/blue_h200_fbw.jpg?w=50 [with QSA]
IMG-bla/blue_h200_fbw.jpg     -> IMG-bla/blue_fbw.jpg?h=200     [with QSA]
IMG-bla/blue_fbw.jpg          -> IMG-bla/blue.jpg?f=bw          [with QSA]
(不再匹配其他通用规则)

追加查询字符串后的总计:

/test/index.php?src=bla/blue.jpg&f=bw&h=200&w=50
请注意,我正在做一些假设

  • 所有内容(除了下划线、目录斜杠和句点)都是字母或数字。如果文件或参数可能包含国际字符,则可能对您过于严格
  • 参数名称总是一个字符长,但不需要显式列出
  • 图像永远不会超过一个子文件夹深度(易于修复)

告诉我你的想法。

+1这是一个很棒的答案。我不敢相信你在这疯狂的追求中支持了我!它又短又聪明。不幸的是,它不工作,但,哎呀。。。查看我的更新答案,特别是我必须编辑的代码的最后一行,以匹配位于根目录中的imgcpu。如果它不起作用,可能是因为许多原因。想到的事情:1)您试图访问的映像位于(虚拟)子目录中。2) 我在上一条规则中忘记了NC,因此路径/文件名部分中任何带有大写字母的内容都将失败(404)。尝试在那里切换到[NC,QSA]。3) 还有别的。你有重写日志吗?非常感谢你的反馈。尝试在上一条规则中添加
NC,
infront os QSA,但相同:无图片。我没有启用重写日志,因为我不知道如何启用,如果我能做到这一点,那将是非常酷的,有任何有用的链接指示如何启用重写日志吗?例如,这里的顶部答案
/test/index.php?src=bla/blue.jpg&f=bw&h=200&w=50