Назад | Перейти на главную страницу

Обратный прокси для бедняков: кеширование с помощью 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, или любым другим способом.

Мудрый совет очень приветствуется, потому что я почти не знаю, что делаю.

Сдавите любые запросы к каталогу кеша, у которых нет переменной среды, указывающей, что они были правильно перенаправлены корнем.

Измените свое правило в корне .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]