Essayez de réécrire dans une URL différente si cela aboutissait

0

Je développe un serveur tomcat local pour utiliser mon instance IIS locale en tant que proxy.

Je le fais parce que le déploiement du serveur est un processus difficile, car une grande partie du contenu n'est pas (ce que je décrirais comme) totalement indépendante. Le contenu de différents projets est essentiellement copié à la racine du serveur. Je ne voulais pas m'occuper de cette installation fastidieuse, alors avec l'aide du module de réécriture, je pouvais réécrire les URL dans des répertoires virtuels pour la plupart.

par exemple.,

/js/* -> /someproject/js/*
/css/* -> /someproject/css/*
/**/*.pdf -> /someotherproject/pdf/*

Cependant, il existe quelques cas où ce schéma ne fonctionne pas, en particulier lorsque les répertoires de destination se chevauchent. Dans le déploiement, certaines ressources sont placées dans le même répertoire; il n’ya donc aucun moyen de distinguer qui est lequel. Il n'y a pas de modèle strict pour ces fichiers, c'est un sac mélangé.

par exemple.,

/someproject1/file1.txt -> /file1.txt
/someproject2/book2.doc -> /book2.doc

Donc, étant donné une url /file1.txt, Je ne saurais pas si je peux réécrire pour aller à someproject1 ou someproject2. Donc, je pense que je pourrais faire en sorte que cela fonctionne s'il y avait une sorte de hiérarchie vers laquelle les URL à essayer de réécrire. Donc, je pourrais prendre une URL comme /file3.txt, réécrivez le premier de ces modèles qui semble valide.

/someproject1/file3.txt     # if 404, try the next
/someproject2/file3.txt     # if 404, try the next
/someotherproject/file3.txt # if 404, try the next
/file3.txt                  # fallback

Est-ce quelque chose qui ne peut être exprimé qu'en utilisant le module de réécriture d'URL?

Jeff Mercado
la source
Avez-vous pensé à utiliser des liens pour que le même fichier apparaisse dans tous les répertoires de projet pertinents?
AFH
Peut-être, mais je ne sais pas si cela fonctionnerait pour mon scénario. S'il existait un moyen de faire en sorte qu'un seul répertoire fasse référence à plusieurs répertoires, je le ferais alors. Mais autant que je sache, ça ne marche pas comme ça. Si cela était possible, je l'accepterais aussi.
Jeff Mercado
Il y a bien longtemps que je n'utilise pas IIS et je n'ai pas encore de version test, mais je pense que, à l'instar des autres serveurs Web que j'ai utilisés, un alias peut être défini pour pointer vers n'importe quel répertoire, sans restriction pour plusieurs liens dans le même répertoire. En fait, je l’utilise pour les capitalisations, par exemple http://{Site}/music et http://{Site}/Music les deux pointent au même {Drive}:\{Path}\SharedMusic.
AFH
Pour ma situation, il faudrait que je fasse l'inverse. Ce que vous décrivez, je peux le faire, plusieurs chemins virtuels peuvent désigner un seul chemin physique. Mais idéalement, j'aurais besoin de plusieurs chemins physiques vers un seul chemin virtuel. Pour autant que je sache, ce n'est pas possible.
Jeff Mercado
Le mieux que vous puissiez faire est de créer un répertoire de liens: vous pouvez le créer à la volée et configurer le travail pour qu'il s'exécute périodiquement. Utilisez une commande comme for /r %i in (*.*) do mklink /h "{CombinedPath}\%~nxi" "%i" (doubler le % dans un fichier batch). Vous devrez d'abord effacer le {CombinedPath} répertoire avec del {CombinedPath}\*.*. Vous pouvez essayer de créer des liens symboliques (omettre /h ), mais je ne sais pas si IIS les gérera correctement.
AFH

Réponses:

0

J'ai pu faire en sorte que cela fonctionne.

Le premier obstacle était que je ne réalisais pas que tous les types de correspondance conditionnelle n'étaient pas disponibles dans la portée globale (c'est là que j'écrivais mes règles). Seulement Pattern était disponible. Je devais changer la portée en portée "distribuée" (règles par site) pour avoir accès au IsFile et IsDirectory types de correspondance.

Ensuite, à partir de là, je pourrais écrire mes règles avec une sorte de hiérarchie. Commencez par réécrire pour faire correspondre le motif que je veux essayer en premier, puis si cela ne résout pas en fichier, réécrivez-le au prochain motif et répétez l'opération.

<rule name="try in project/content" stopProcessing="false">
    <match url=".*" />
    <action type="Rewrite" url="project/content/{R:0}" />
</rule>
<rule name="verify project/content" stopProcessing="false">
    <match url="(project)/content(/.*)" />
    <conditions logicalGrouping="MatchAll">
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
    </conditions>
    <action type="Rewrite" url="{R:1}{R:2}" />
</rule>

Dans mon cas particulier, je voulais d'abord essayer un sous-répertoire particulier, puis les répertoires parents s'ils n'existaient pas. Mais, théoriquement, je pourrais le faire pour n’importe quel ensemble de chemins, à condition de savoir dans quel ordre les essayer.


Donc, pour mon exemple dans la question, je définirais ces règles:

<rule name="try in someproject1" stopProcessing="false">
    <match url=".*" />
    <action type="Rewrite" url="someproject1/{R:0}" />
</rule>
<rule name="try in someproject2 otherwise" stopProcessing="false">
    <match url="someproject1/(.*)" />
    <conditions logicalGrouping="MatchAll">
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
    </conditions>
    <action type="Rewrite" url="someproject2/{R:1}" />
</rule>
<rule name="try in someotherproject otherwise" stopProcessing="false">
    <match url="someproject2/(.*)" />
    <conditions logicalGrouping="MatchAll">
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
    </conditions>
    <action type="Rewrite" url="someotherproject/{R:1}" />
</rule>
<rule name="fallback to root otherwise" stopProcessing="false">
    <match url="someotherproject/(.*)" />
    <conditions logicalGrouping="MatchAll">
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
    </conditions>
    <action type="Rewrite" url="{R:1}" />
</rule>
Jeff Mercado
la source