Главная / How-To / SysAdmin / mod_cache ignores mod_dir DirectoryIndex index files + workaround
mod_cache ignores mod_dir DirectoryIndex index files + workaround

An interesting problem with Apache’s mod_cache (even “production” in the 2.2.X branch) is that it does not cache mod_dir’s DirectoryIndex files. For instance, if you have a
DirectoryIndex index.html index.php
declaration, neither of which will be cached by mod_cache. I have only seen this be true for mod_disk_cache but assume it fails with mod_mem_cache as well. The reason for this is the very complex nature of mod_dir and how this would relate to caching of a file. There was a good email thread on dev@httpd.apache.org archived here: http://www.mail-archive.com/dev@httpd.apache.org/msg35291.html

I had to come up with a simple workaround - and the first thing to come to mind was trying to come up with a simple RewriteRule to circumvent the mod_dir DirectoryIndex. I came up with the following concoction which assumes that there is a
DirectoryIndex index.html index.php index.cfm
in the root httpd.conf declarations:

<VirtualHost *:80>


# "disable" the default httpd.conf DirectoryIndex
DirectoryIndex __NOFILE__

# simulate DirectoryIndex index.html index.php index.cfm
RewriteEngine On
RewriteCond %{REQUEST_URI} ^(.*)/$
RewriteCond "%{DOCUMENT_ROOT}%{REQUEST_URI}index.html" -f
RewriteRule "^(.*)$" "$1index.html" [R=301,NE]
RewriteCond %{REQUEST_URI} ^(.*)/$
RewriteCond "%{DOCUMENT_ROOT}%{REQUEST_URI}index.php" -f
RewriteRule "^(.*)$" "$1index.php" [R=301,NE]
RewriteCond %{REQUEST_URI} ^(.*)/$
RewriteCond "%{DOCUMENT_ROOT}%{REQUEST_URI}index.cfm" -f
RewriteRule "^(.*)$" "$1index.cfm" [R=301,NE]



This will force a SOE-compliant 301 Perm. Redirect for “directory” accesses with a valid existing [index.html|index.php|index.cfm] file - in that order. If neither of those 3 files exist, the normal order of operations will be carried out, i.e. directory listing if permissible, a forbidden error, a 404 missing error, etc.

This will also force mod_cache to work on your index files seeing as the actual REQUEST_URI contains a valid file. This should with with mod_mem_cache as well as mod_disk_cache. URL Strings will work with this and will be auto-appended to the new redirect location URL.

NOTE It is important to realize that any <FORM METHOD=”POST”> submission with a directory action, i.e. <FORM ACTION=”/subdir/” METHOD=”POST”> will lose the form variables in the 301 redirection. I’d stay away from loading the index files via proxy and do a SEO-compatible 301 permanent redirection. This means that any action declaration in your HTML will require the filename it will be submitting to, i.e. <FORM ACTION=”/subdir/index.php” METHOD=”POST”> instead

ANOTHER NOTE Do not forget the NE declaration so to not foul your URL “GET” variables during the redirect.

Подсмотрено тут

Добавлено: 2008/08/27
Обновлено: 2008/11/16

Обо мне | Портфолио | How-To | Мои ссылки | Фотоальбом | Смешно! | Контакты Адрес: Россия, Владивосток
Тел.: +7 (4232) 51-84-81