穷人的反向代理:使用 mod_rewrite 进行缓存

穷人的反向代理:使用 mod_rewrite 进行缓存

穷人的反向代理:使用 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]

相关内容