2010-07-15 6 views
1

Я использую Iirf v2.0.RewriteCond Проверьте, существует ли файл в подкаталоге

У меня есть следующая структура каталогов:

/ 
/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 существует в корневой директории.

Я смотрел 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' 

Любая помощь была бы принята с благодарностью.

--- EDIT -

Я обновил свой конфиг после более чтений и предложения Тима быть:

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 

Я думаю, что мне нужно связаться с автором фильтра.

+0

Хм, как насчет 'RewriteCond% {APPL_PHYSICAL_PATH} $ 0 -f' в этом втором случае (относительный URL не путь_к_файл, это Wouldn Не работает ли в mod_rewrite? (Или вы определили '% {APPL_PHYSICAL_PATH}' действительно не то, что я надеялся?) –

+0

Использование '% {APPL_PHYSICAL_PATH}' приводит к пути, подобному 'C: \ path \ to \ folder \ webroot/images/buttons/submit.gif', который, по вашему мнению, был бы прав, но он все еще терпит неудачу. –

+0

Хм, (глядя на исходный код) он полагается на возвращаемое значение из функции Windows API «CreateFile», чтобы проверить, существует ли файл ... У чего не должно быть проблемы с поиском этого пути, поэтому я не Получи это, ба. –

ответ

0

Я закончил тем, что поменять, чтобы с помощью фильтр Helicon Tech ISAPI_Rewrite 3.

Файл Htaccess Я закончил с использованием был:

RewriteEngine On 

# Check whether the file exists and if not, check whether the request starts 
# with webroot. Prepend webroot if it doesn't. 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI}  !^webroot 
RewriteRule ^.*$ webroot/$0 [NI] 

# Check whether the file exists, if not, send the request off to library/index.php 
RewriteCond %{DOCUMENT_ROOT}/$0 !-f 
RewriteRule ^(webroot/)?(.*)$ library/index.php [I,L,QSA] 
1

Хмм ... Я раньше не слышал о IIRF, классный материал. После просмотра документации, чтобы узнать, какие различия между ней и mod_rewrite, у меня есть две вещи, которые вы могли бы попробовать.

Первый заключается в замене %{DOCUMENT_ROOT} на %{APPL_PHYSICAL_PATH} в ответе, который вы нашли. DOCUMENT_ROOT - это переменная сервера Apache, и из того, что я могу сказать, соответствующая переменная IIS должна быть APPL_PHYSICAL_PATH. Я знаю, основываясь на документации IIRF, что эта переменная доступна, но, по общему признанию, я не уверен на 100% независимо от того, указывает ли она на ваш корень сайта.

Другой должен сделать следующее, что может снова работать или не работать на основании того, правильно ли я понял документацию, как ваш файл index.php получает соответствующую информацию о пути для обработки запроса и множество других вещей. Правда, я думаю, что это меньше, чем идеальное решение (по сравнению с тем, что я первоначально думал, что делать, основываясь на том, как mod_rewrite делает вещи), но, возможно, он будет работать:

RewriteEngine ON 

# This should rewrite to /webroot/whatever then restart the ruleset, 
# apparently...On Apache in a per-dir context, this would alter the 
# %{REQUEST_FILENAME} for the next run-through. I'm assume it does 
# here too, but I might be wrong. 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI}  !^/webroot 
RewriteRule ^.*$ /webroot/$0 

# The file still doesn't exist, rewrite it back to its original form, 
# but move on to the next rule instead of restarting processing. This 
# may not even be necessary, but I was hoping this rewrite would have 
# side-effects that would make it as if the above rewrite didn't happen. 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(/webroot/)?(.*)$ $0 [NI] 

# Now, if it still doesn't exist, we'll rewrite it to our 
# /library/index.php file, but this may not work based on how you 
# get the original request information. Adding the [U] flag will 
# create a new header that preserves the "original" URL (I'm not 
# sure what it takes the value from if the URL has already been 
# rewritten in a previous step), which might be useful. 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^.*$ /library/index.php