很抱歉,如果这是重复的:我发现很多关于缓存系统的问题,但我的问题似乎与整个脚本在子文件夹中工作的事实有关。
我需要做的就是为我的网站实现一个简单的缓存系统,但我无法让它工作。
这是我的.htaccess
文件(广泛评论清楚 - 抱歉,如果有太多评论令人困惑):
RewriteEngine on
# Map for lower-case conversion of some case-insensitive arguments:
RewriteMap lc int:tolower
# The script lives into this subfolder:
RewriteBase /mydir/
# IMAGES
# Checks if cached version exists...
RewriteCond cache/$1-$2-$3-{lc:$4}.$5 -f
# ...if yes, redirects to cached version...
RewriteRule ^(hello|world)\/image\/([a-zA-Z0-9\.\-_]+)\/([a-zA-Z0-9\.\-_]+)\/([a-zA-Z0-9\.\-_\s]+)\.(png|gif|jpeg?|jpg)$ cache/$1-$2-$3-{lc:$4}.$5 [L]
# ...if no, tries to generate content dynamically.
RewriteRule ^(hello|world)\/image\/([a-zA-Z0-9\.\-_]+)\/([a-zA-Z0-9\.\-_]+)\/([a-zA-Z0-9\.\-_\s]+)\.(png|gif|jpeg?|jpg)$ index.php?look=$1&action=image&size=$2&data=$3&name=$4&format=$5 [L,QSA]
# OTHER
# This is always non-cached.
RewriteRule ^(hello|world)\/([a-zA-Z0-9\.\-_\s]+)\/([a-zA-Z0-9\.\-_\s]+)?\/?$ index.php?look=$1&action=$2&name=$3 [QSA]
现在,问题是RewriteCond
似乎总是失败,因为服务的图像总是由PHP生成。我也试过预先加%{DOCUMENT_ROOT}
,但仍然没有用。如果我将整个脚本移动到根目录,它会神奇地开始工作。
我做错了什么?
答案 0 :(得分:0)
你做错了一件事是尝试在.htaccess
文件中使用重写映射。首先。根据{{3}}:
RewriteMap
部分或<Directory>
部分中可能未使用.htaccess
指令。您必须在服务器或虚拟主机上下文中声明映射。您可以在这些范围内的RewriteRule
和RewriteCond
指令中使用地图。你不能在这些范围内声明它。
如果您的ISP / sysadmin已经定义了lc映射,那么您可以使用它。如果没有,那么你只能在Linux上进行区分大小写的文件缓存,因为它的FS命名区分大小写。但是,由于这些是内部生成的图像,只需放弃大小写转换并坚持使用小写。
在某些共享主机配置上执行mod_rewrite时,可能无法正确设置%{DOCUMENT_ROOT}。有关更多提示,请参阅我的Apache documentation。这里还有我博客.htaccess
FYI的等效内容。 DR变量在这里工作,但不适用于我之前的ISP,因为我不得不对该部分进行硬编码
# For HTML cacheable blog URIs (a GET to a specific list, with no query params,
# guest user and the HTML cache file exists) then use it instead of executing PHP
RewriteCond %{HTTP_COOKIE} !blog_user
RewriteCond %{REQUEST_METHOD}%{QUERY_STRING} =GET [NC]
RewriteCond %{DOCUMENT_ROOT}html_cache/$1.html -f
RewriteRule ^(article-\d+|index|sitemap.xml|search-\w+|rss-[0-9a-z]*)$ \
html_cache/$1.html [L,E=END:1]
请注意,如果用户已登录或发布了帖子,并且设置了任何查询参数,我会绕过缓存。
您的匹配模式很复杂,因为您没有使用正则表达式的语法:使用\w
而您无需在.
或[ ]
中转义/
。还有jpeg不对吗?那么为什么不呢:
RewriteRule ^(hello|world)/image/([.\w\-]+)/([.\w\-]+)/([\w\-]+\.(png|gif|jpe?g))$ \
cache/$1-$2-$3-$4 [L]
等。或者甚至(假设文件规则只匹配缓存中的有效文件)
RewriteRule ^(hello|world)/image/(.+?)/(.+?)/(.*?\.(png|gif|jpe?g))$ \
cache/$1-$2-$3-$4 [L]
非贪婪修饰符意味着(.+?)
与([^/]+)
相同,因此像../../../../etc/passwd
这样的黑客行为不会走在文件层次结构中。