是否可以在已经重写的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]
第二次可以重写已重写的网址吗?
第二部分是否正确?
如果有可能合并这两个规则集,你能告诉我怎么做吗?
答案 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