穷人的反向代理:使用 mod_rewrite 进行缓存
我确信有人已经以某种方式解决了这个问题。长话短说,我想缓存GET
对我的 PHP 脚本的请求。脚本将内容保存到文件中/cache/{uri}/index.{type}/index.{type}
。标头由同一目录中的 .htaccess 文件设置,例如RequestHeader set Content-type "application/json;charset=utf-8"
。
它看起来是这样的:
{webroot}/
.htaccess
cache/
caching/
test/
index.json/
.htaccess
index.json
index.php
内容{webroot}/.htaccess
:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
# Append ".html", if there is no extension...
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !\.\w+$
RewriteRule ^(.*?)$ /$1.html [L]
# ...and redirect to cache directory ("/cache")
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*?)\.(\w+)$ /cache/$1/index.$2/index.$2 [L]
</IfModule>
内容{webroot}/cache/.htaccess
:
<IfModule mod_rewrite.c>
RewriteEngine on
# If no file found, redirect back to index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*) /index.php?/$1 [L]
</IfModule>
内容{webroot}/cache/caching/test/index.json/.htaccess
:
<IfModule mod_rewrite.c>
RewriteEngine on
# Cache till 5th May, 2012
RewriteCond %{TIME} >20120518194510
RewriteRule ^(.*) /index.php?/$1 [L]
RequestHeader set Content-type "application/json;charset=utf-8"
</IfModule>
现在http://localhost/caching/test.json
提供缓存版本。但是,问题是该文件可以通过以下方式直接访问http://localhost/cache/caching/test/index.json/index.json
,我无法弄清楚如何通过抛出错误页面或重定向到 index.php 或任何其他方式阻止对它的访问。
非常欢迎明智的建议,因为我几乎不知道自己在做什么。
答案1
压缩对缓存目录的所有请求,这些请求没有环境变量表明它们已被根正确重定向。
更改根目录中的规则.htaccess
,用环境变量标记所有重定向请求,表明允许内部重定向,而不是直接访问:
RewriteRule ^(.*?)\.(\w+)$ /cache/$1/index.$2/index.$2 [L,ENV=FROM_ROOT:1]
棘手的部分是环境变量被重命名为内部重定向。因此,将类似以下内容添加到index.json/.htaccess
:
RewriteCond %{ENV:REDIRECT_FROM_ROOT} !1
RewriteRule ^(.*) /index.php?/$1 [L]