在重写的URL上应用htaccess重写规则

时间:2011-08-23 09:41:44

标签: .htaccess mod-rewrite

是否可以在已经重写的URL上应用.htaccess重写规则?

实施例: 我想用timthumb.php调整我的照片大小(最新版本,因此不再存在安全漏洞)。但是URL应该看起来很好,因此我创建了这个重写规则:

RewriteRule ^rz/(.*)x(.*)/r/(.*) /themes/Nerdtalk/timthumb.php?src=$3&h=$2&w=$1&q=80

这个规则工作正常,但在启动timthumb.php之前可能会重定向到缓存文件,我希望Apache检查,如果文件存在并让Apache重定向到缓存文件,那么timthumb.php赢了开始吧。 因此我创建了这个规则集:

RewriteCond %{SCRIPT_FILENAME} timthumb.php
RewriteCond %{QUERY_STRING} src=(.*)\.(png|jpe?g)&h=([0-9]+)&w=([0-9]+)&q=([0-9]+)
RewriteCond %{DOCUMENT_ROOT}/cache/%1-%4-%3-1-%5.%2 -f
RewriteRule ^.* /cache/%1-%4-%3-1-%5.%2 [L]
  1. 第二次可以重写已重写的网址吗?

  2. 第二部分是否正确?

  3. 如果有可能合并这两个规则集,你能告诉我怎么做吗?

2 个答案:

答案 0 :(得分:2)

  

第二次可以重写已重写的网址吗?

是。当重写发生时(带有[L]标志或htaccess结束的规则),mod_rewrite进入下一次迭代并从start开始再次开始匹配所有规则。这就是为什么你需要用重写循环来构建你的规则(特别是如果你使用这种模式^(.*)$进行匹配)。

如果你编写一个没有[L]标志的规则,那么在同一次迭代中继续重写,因此任何放在当前的规则可能会再次将URL重写为完全不同的。

  

第二部分是否正确?

我会说是(虽然没有检查实际的Apache)。我只是不确定第一次重写条件(我从未使用%{SCRIPT_FILENAME}这么不确定它是如何工作的) - 我会使用%{REQUEST_URI} timthumb\.php$或类似的东西。

我要添加的唯一内容是重写目标?以摆脱新创建的(上面的1条规则)查询字符串:RewriteRule ^.* /cache/%1-%4-%3-1-%5.%2? [L]。但它现在应该可以正常工作。

  

如果有可能合并这两个规则集,你能不能   告诉我怎么样?

按照您在此处的顺序依次放置它们。您无法将其作为单一规则,因为第二条规则仅在已缓存缩略图时才有效。

如果它不能立即起作用(因为Apache的变量(%{SCRIPT_FILENAME}, %{QUERY_STRING}等)可能没有正确的值)尝试将[L]标志添加到第一次重写规则 - 它将强制下一次迭代使用正确的值填充这些变量,并且,根据您在此之前可能具有的其他规则,它将达到第二次重写将发生的第二个规则集。

如果你想 - 你可以完全重写它以立即检查和提供缓存文件(如果存在)然后(如果仍然没有)重写图像以由timthumb.php处理,但这将完成相同的工作如上所述,只是略有不同。

答案 1 :(得分:0)

第二次可以重写已重写的网址吗?

是的,它可以。这是默认行为,如果您想要更改它,可以使用[L]之类的标志: http://httpd.apache.org/docs/current/rewrite/flags.html

第二部分是否正确?

我不确定你是否可以在RewriteCond指令中使用%1等

如果有可能合并这两个规则集,你能告诉我怎么做吗?

我会将缓存放在与原始网址相同的文件夹中:^ rz /(。)x(。)/ r / 如果它存在 - 只是服务它,如果不存在 - 使用php