我似乎遇到了一个我一直在努力解决的问题。我在这里会有点帮助。
我有一个转储网站,我正在使用mod_autoindex
和FancyIndexing
。
我的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
,则会显示正确的图标。
这是正常的预期行为吗?有没有办法覆盖它,如果有的话?
此致
答案 0 :(得分:1)
好吧,好像我发现了原因。 mod_rewrite由于某种原因(一个错误?)重新映射所有apr_read_dir()调用,mod_autoindex使用(我最终查看了mod_autoindex源代码)。由于它被认为是mapper模块上的子请求,作为一种解决方法,我刚刚添加了一个:
RewriteCond %{IS_SUBREQ} false
每个RewriteRules都神奇地工作了。当然,这只是一种解决方法,因为如果你真的需要对子请求进行重写,这可能不适合你。
我确实认为这是mod_autoindex上的一个错误,因为图标和/或描述的文件名绝对没有理由与实际打印输出数据的文件名不同。
虽然可能有一些不明原因。