RewriteCond Проверить, существует ли файл в подкаталоге - PullRequest
1 голос
/ 15 июля 2010

Я использую 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.

Я смотрел на этот вопрос , но у меня нет доступа к 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'

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

--- РЕДАКТИРОВАТЬ -

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

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

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

Ответы [ 2 ]

1 голос
/ 15 июля 2010

Хм ... я раньше не слышал о 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
0 голосов
/ 19 июля 2010

Мне пришлось переключиться на использование фильтра 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]
...