Я почти уверен, что кто-то уже как-то решил эту проблему. Короче я хочу кешировать 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, или любым другим способом.
Мудрый совет очень приветствуется, потому что я почти не знаю, что делаю.
Сдавите любые запросы к каталогу кеша, у которых нет переменной среды, указывающей, что они были правильно перенаправлены корнем.
Измените свое правило в корне .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]