[英].htaccess mod_rewrite: enabling caching via checking if file exists
我正在为动态生成的图像实现缓存系统。 该脚本通过/img/type/param1/param2.png
,其中可能有多种类型,参数数量是可变的。 该脚本生成映像并将其转储到磁盘。
我想要.htaccess
规则,该规则在请求图像生成脚本时:
到目前为止,我有一个稍微修改的逻辑:
如果有更好的方法可以做到这一点,我很想听听。 无论如何,我的.htaccess文件的相关部分是:
RewriteRule ^img/(type1|type2)/(.*)$ /images/cache/$1/$2
RewriteCond /^(.*)$ !-f
RewriteRule images/cache/(.*) /img/$1
这似乎不太正确。 为了调试它,我在第一个RewriteRule之后插入了以下内容(目标页面只是转储其输入):
RewriteRule ^(.*)$ /htaccess.php?url=$1 [END]
结果,我得到:
Array
(
[url] => /images/cache/a/l/300.png/a/l/300.png
)
我不明白为什么$2
包含l/300.png/a/l/300.png
而不是l/300.png
。
如果我首先更改RewriteRule使其包含[L]
,则将得到预期的结果。 但是,我在第二个RewriteRule上遇到了完全相同的“双重匹配”问题,该问题将请求还原回非缓存版本。 但是,在第二个RewriteRule中添加[L]
:
RewriteRule ^img/(type1|type2)/(.*)$ /images/cache/$1/$2 [L]
RewriteCond /^(.*)$ !-f
RewriteRule images/cache/(.*) /img/$1 [L]
产生内部服务器错误。
我在做什么错,如何解决这个问题?
您拥有的第一个逻辑就是您想做的事情,它绕过了可能的循环问题。 您只需要从%{REQUEST_URI}
提取相关位,然后使用%
引用进行反向引用即可。 因此,例如:
RewriteCond %{REQUEST_URI} ^/img/(.*)$
RewriteCond %{DOCUMENT_ROOT}/images/cache/%1 -f
RewriteRule ^img/(.*)$ /images/cache/$1 [L]
或使用您拥有的正则表达式模式:
RewriteCond %{REQUEST_URI} ^/img/(type1|type2)/(.*)$
RewriteCond %{DOCUMENT_ROOT}/images/cache/%1/%2 -f
RewriteRule ^img/(.*)$ /images/cache/$1 [L]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.