mod_rewrite阻止在mod_autoindex上显示正确的文件类型图标

时间:2011-02-06 19:11:58

标签: mod-rewrite apache2 mod-autoindex

我似乎遇到了一个我一直在努力解决的问题。我在这里会有点帮助。 我有一个转储网站,我正在使用mod_autoindexFancyIndexing

我的FancyIndexing文件中定义了.htaccess个图标。我还使用mod_rewrite通过几个php脚本传递文件(取决于文件扩展名)。

一切都很好,除非在RewriteRule上匹配文件扩展名,Apache只显示它的默认图标,而不是指定的图标。

所有FancyIndexing资源都在/imgindex目录中,所有查看者都在/viewers目录中。

这是.htaccess文件的相关部分(我目前正在调整它,因此未进行优化):

Options +Indexes
IndexOptions +XHTML +HTMLTable +FancyIndexing +FoldersFirst +SuppressHTMLPreamble +IconsAreLinks +IgnoreCase +NameWidth=*
IndexIgnore *~ imgindex viewers favicon.ico
HeaderName /imgindex/header.html
ReadmeName /imgindex/footer.html

# ------ Fancy Indexing ----------
AddIcon /imgindex/image.png .jpg .jp2 .jif .jpeg .tiff .tif .pict .pct .bmp .gif .png .psd .tga .ai .indd .fh* .fh10 .xcf .svg
AddIcon /imgindex/app.png .app
AddIcon /imgindex/movie.png .mov .mpg .mpeg .m2v .avi .divx .xvid .swf .wmv .wma .wm* .ram .rm .ogm .ogv
AddIcon /imgindex/txt.png .txt .text .log
# etc, etc.
DefaultIcon /imgindex/text.png

# ------ Rewriting --------
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^viewers/(.*)$
RewriteCond %{REQUEST_URI} !^imgindex/(.*)$
RewriteRule ^(.*).(css|cs|cpp|h|hpp|pas|xml|js|asm|inc|as|sh|bat|cmd|html)$ /viewers/view_source.php?file=$1.$2&%{QUERY_STRING} [NC,L]

RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^viewers/(.*)$
RewriteCond %{REQUEST_URI} !^imgindex/(.*)$
RewriteRule ^(.*).(jpg)$ /viewers/viewjpg.php?file=$1.$2&%{QUERY_STRING} [NC,L]

# (etc, etc.)

正如我所说的,除了图标外,一切似乎都很有效。在上述情况中,所有.css, .cs, .cpp,(等)和所有.jpg文件都将使用DefaultIcon中定义的图标,而不是其文件类型的图标(在{{1}中定义) })。

如果我删除与该文件类型匹配的AddIcon,则会显示正确的图标。

这是正常的预期行为吗?有没有办法覆盖它,如果有的话?

此致

1 个答案:

答案 0 :(得分:1)

好吧,好像我发现了原因。 mod_rewrite由于某种原因(一个错误?)重新映射所有apr_read_dir()调用,mod_autoindex使用(我最终查看了mod_autoindex源代码)。由于它被认为是mapper模块上的子请求,作为一种解决方法,我刚刚添加了一个:

RewriteCond %{IS_SUBREQ} false

每个RewriteRules都神奇地工作了。当然,这只是一种解决方法,因为如果你真的需要对子请求进行重写,这可能不适合你。

我确实认为这是mod_autoindex上的一个错误,因为图标和/或描述的文件名绝对没有理由与实际打印输出数据的文件名不同。

虽然可能有一些不明原因。