.htaccess% {REQUEST_URI} косая черта и Zend Cache - PullRequest
2 голосов
/ 06 февраля 2012

У меня есть система кэширования php (на основе Zend Static Cache) ... которая создает статические html-файлы из динамических страниц. Он использует REQUEST_URI для создания имен файлов. Для REQUEST_URI, как это /somedir/otherdir/file.html он создает файл в кэшированном каталоге (на моем сервере), например, /cached/somedir/otherdir/file.html.

Затем я использую htaccess для перенаправления будущих запросов в статический файл, если он существует:

RewriteCond %{DOCUMENT_ROOT}/cached/%{REQUEST_URI}\.html -f
RewriteRule .* /cached/%{REQUEST_URI}\.html [L]

Проблема, с которой я столкнулся, заключается в том, что когда REQUEST_URI оканчивается на "/" (в основном каталог), кеш создает файл с именем thedirectory.html.

Так что, если REQUEST_URI это / thedirectory / ... я получаю этот файл cached / thedirectory.html.

Как бы я перенаправил такой запрос в нужный файл?

Спасибо. PS: я в основном следовал этой статье , чтобы реализовать мой кеш. Я использую файлы Zend Cache только в пользовательских приложениях php.

EDIT:

Я думаю, что нет хорошего способа заставить это работать без редактирования файлов php. Вот как я использую Zend Cache:

$tagCache = Zend_Cache::factory('Core', 'File', array('automatic_serialization' => true),
    array('cache_dir' => $cfg['instdir']. 'Cache_dir'));
    $cache = Zend_Cache::factory('Capture', 'Static', array(), array('public_dir' => $cfg['instdir']. 'Cached/',
    'tag_cache' => $tagCache)); 
    $id = bin2hex($name);
    $cache->start($id, array());

Кто-нибудь знает, какие файлы могут содержать код для генерации имени файла кэша? Я отредактировал пару интерфейсов, бэкэндов ... но, похоже, ничего не происходит.

Я пытаюсь сделать что-то вроде (незадолго до того, как ZEND получит REQUEST_URI):

if(substr($_SERVER["REQUEST_URI"],strlen($_SERVER["REQUEST_URI"])-1,1)=="/")

{

$ _ SERVER [ "REQUEST_URI"] = $ _ SERVER [ "REQUEST_URI"] "index.html";.

}

также заставьте кеш добавить файл index.html для каталогов.

1 Ответ

1 голос
/ 06 февраля 2012

Попробуйте исключить каталоги, как показано ниже

#only if it is not a directory
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{DOCUMENT_ROOT}/cached/%{REQUEST_URI}\.html -f
RewriteRule .* /cached/%{REQUEST_URI}\.html [L]

РЕДАКТИРОВАТЬ

Мне нужно {REQUEST_URI}, заканчивающийся на /, чтобы перенаправить в файл, который точно{REQUEST_URI} без последнего / (и .html в конце)

Попробуйте добавить это правило перед любыми существующими правилами в вашем .htaccess

#redirect all requests with a trailing slash to the html versions
RewriteRule ^(.+)/$  $1.html [L,R=301] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...