2010-07-15 5 views
1

J'utilise Iirf v2.0.RewriteCond Vérifiez si le fichier existe dans un sous-répertoire

J'ai la structure de répertoire suivant:

/ 
/library 
/library/index.php 
/webroot 
/webroot/images 
/Iirf.ini 

Là où j'ai un dossier de bibliothèque qui contient ma demande, un dossier de Webroot (qui contient des images, feuilles de style, etc.) et un fichier de configuration Iirf.ini.

Je souhaite rediriger toutes les demandes vers /library/index.php si le fichier n'existe pas sous le site Webroot.

par exemple:

Request    Response 
/images/blah.png -> /webroot/images/blah.png 
/news   -> /library/index.php 

config Mon Iirf.ini a:

RewriteEngine ON 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ /library/index.php [L] 

qui redirige tout à /library/index.php mais je vais avoir du mal à travailler sur la façon de vérifier si le REQUEST_FILENAME existe sous Webroot. J'ai regardé this question mais je n'ai pas accès à DOCUMENT_ROOT. Il me donne ce qui suit (pris du journal):

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' 

Toute aide serait grandement appréciée.

--- EDIT -

J'ai mis à jour ma config après plus de lecture et les suggestions de Tim à être:

RewriteCond $0 !^/webroot 
RewriteRule ^.*$ /webroot$0 [I] 

RewriteCond $0 !-f 
RewriteRule ^/webroot/(.*)$ /library/index.php [I,L,QSA] 

Et il passe à /library/index.php correctement mais il reste doesn ne vérifie pas un fichier existant (même s'il semble dire que c'est le cas).

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 

Je pense que je vais devoir contacter l'auteur du filtre.

+0

Hmm, qu'en 'RewriteCond% {de APPL_PHYSICAL_PATH} $ 0 -f' dans ce second cas (l'URL relative est pas un filepath, ce wouldn ne travaillons pas dans 'mod_rewrite')? (Ou avez-vous déterminé que '% {APPL_PHYSICAL_PATH}' n'était pas ce que j'avais espéré?) –

+0

L'utilisation de '% {APPL_PHYSICAL_PATH}' donne un chemin comme 'C: \ chemin \ vers \ dossier \ webroot/images/boutons/submit.gif' que vous penseriez serait bon, mais il échoue toujours. –

+0

Hmm, (en regardant le code source) il s'appuie sur la valeur de retour de la fonction de l'API Windows 'CreateFile' pour vérifier si le fichier existe ... Ce qui ne devrait pas poser de problème pour trouver ce chemin, donc je ne comprends, bah. –

Répondre

0

J'ai fini par avoir à échanger à l'aide le filtre Helicon Tech ISAPI_Rewrite 3.

Le fichier htaccess je fini par utiliser est:

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

Hmm ... Je n'avais jamais entendu parler d'IIRF auparavant, des trucs sympas. Après avoir parcouru la documentation pour voir quelles sont les différences entre elle et mod_rewrite, j'ai deux choses que vous pourriez essayer.

Le premier est d'échanger %{DOCUMENT_ROOT} pour %{APPL_PHYSICAL_PATH} dans la réponse que vous avez trouvée. DOCUMENT_ROOT est une variable de serveur Apache, et d'après ce que je peux dire la variable IIS correspondante devrait être APPL_PHYSICAL_PATH. Je sais que d'après la documentation de l'IIFF, cette variable est disponible, mais je ne suis pas sûr à 100% si elle indique ou non la racine de votre site. L'autre est de faire ce qui suit, ce qui peut encore fonctionner selon que j'ai bien compris la documentation, comment votre fichier index.php obtient les informations de chemin pertinentes pour traiter la requête, et une foule d'autres choses. Il est vrai que je pense que cela est une solution idéale à moins de (par rapport à ce que j'avais d'abord pensé à faire en fonction de la façon dont mod_rewrite fait les choses), mais peut-être que ça va marcher:

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 
Questions connexes