【发布时间】:2011-03-16 08:31:36
【问题描述】:
我正在使用Iirf v2.0。
我的目录结构如下:
/
/library
/library/index.php
/webroot
/webroot/images
/Iirf.ini
我有一个包含我的应用程序的库文件夹、一个 webroot 文件夹(其中包含图像、样式表等)和一个 Iirf.ini 配置文件。
我想将所有请求重定向到 /library/index.php 如果该文件在 webroot 下不存在。
例如:
Request Response
/images/blah.png -> /webroot/images/blah.png
/news -> /library/index.php
我的 Iirf.ini 配置有:
RewriteEngine ON
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /library/index.php [L]
它将所有内容重定向到/library/index.php,但我无法确定如何检查REQUEST_FILENAME 是否存在于webroot 下。
我查看了this question,但我无权访问DOCUMENT_ROOT。它给了我以下信息(取自日志):
Thu Jul 15 11:46:21 - 760 - ReplaceServerVariables: VariableName='REQUEST_FILENAME' Value='C:\web\favicon.ico'
Thu Jul 15 11:46:21 - 760 - ReplaceServerVariables: in='%{DOCUMENT_ROOT}/webroot/%{REQUEST_FILENAME}' out='DOCUMENT_ROOT/webroot/C:\web\favicon.ico'
任何帮助将不胜感激。
--- 编辑 --
在阅读更多内容和 Tim 的建议后,我更新了我的配置:
RewriteCond $0 !^/webroot
RewriteRule ^.*$ /webroot$0 [I]
RewriteCond $0 !-f
RewriteRule ^/webroot/(.*)$ /library/index.php [I,L,QSA]
它正确地传递给/library/index.php,但它仍然不检查现有文件(即使它似乎说它确实如此)。
Thu Jul 15 14:47:30 - 3444 - EvalCondition: checking '/webroot/images/buttons/submit.gif' against pattern '!-f'
Thu Jul 15 14:47:30 - 3444 - EvalCondition: cond->SpecialConditionType= 'f'
Thu Jul 15 14:47:30 - 3444 - EvalCondition: Special: it is not a file
我想我得联系过滤器的作者了。
【问题讨论】:
-
嗯,在第二种情况下
RewriteCond %{APPL_PHYSICAL_PATH}$0 !-f怎么样(相对 URL 不是文件路径,这在mod_rewrite中也不起作用)? (或者你确定%{APPL_PHYSICAL_PATH}确实不是我所希望的?) -
使用
%{APPL_PHYSICAL_PATH}会产生类似C:\path\to\folder\webroot/images/buttons/submit.gif的路径,您认为这是正确的,但它仍然失败。 -
嗯,(查看源代码)它依赖于 Windows API 函数
CreateFile的返回值来检查文件是否存在......这应该没有问题找到那个路径,所以我不明白,呸。 -
是的,我也不明白。我已经在网站的留言板上发布了一条消息。希望作者能回复我。感谢您的帮助。
标签: iis mod-rewrite rewrite iirf