子文件夹中的Htaccess缓存系统无法正常工作

时间:2014-06-08 19:44:28

标签: .htaccess caching

很抱歉,如果这是重复的:我发现很多关于缓存系统的问题,但我的问题似乎与整个脚本在子文件夹中工作的事实有关。

我需要做的就是为我的网站实现一个简单的缓存系统,但我无法让它工作。

这是我的.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},但仍然没有用。如果我将整个脚本移动到根目录,它会神奇地开始工作。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

你做错了一件事是尝试在.htaccess文件中使用重写映射。首先。根据{{​​3}}:

  

RewriteMap部分或<Directory>部分中可能未使用.htaccess指令。您必须在服务器或虚拟主机上下文中声明映射。您可以在这些范围内的RewriteRuleRewriteCond指令中使用地图。你不能在这些范围内声明它。

如果您的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这样的黑客行为不会走在文件层次结构中。