使用Apache在htaccess中进行URL重写:1规则来统治它们

时间:2011-03-20 22:04:50

标签: apache .htaccess url-rewriting apache2

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

// 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 

基本上我想有一个终极重写网址,这让我可以自由地用任何属性重写下面的网址,而不必硬编码那个确切的重写顺序,每个可能性有一条规则:目前我的代码非常愚蠢,实用的&不完美的,思想确实有效!

// 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 个答案:

答案 0 :(得分: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]

(不再有通用规则匹配)

IMG-bla/blue.jpg              -> /test/index.php?src=bla/blue.jpg [with QSA]

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

/test/index.php?src=bla/blue.jpg&f=bw&h=200&w=50

请注意,我做了一些假设...

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

告诉我你的想法。