
Ich habe einen lokalen Tomcat-Server, den ich entwickle, um meine lokale IIS-Instanz als Proxy zu verwenden.
Ich mache das, weil die Bereitstellung des Servers ein mühsamer Prozess ist, da viele Inhalte nicht (wie ich es beschreiben würde) in sich geschlossen sind. Inhalte aus verschiedenen Projekten werden im Wesentlichen in das Stammverzeichnis des Servers kopiert. Ich wollte mich nicht mit dem Aufwand der Einrichtung herumschlagen, also konnte ich mit Hilfe des Umschreibmoduls URLs größtenteils in virtuelle Verzeichnisse umschreiben.
z.B,
/js/* -> /someproject/js/*
/css/* -> /someproject/css/*
/**/*.pdf -> /someotherproject/pdf/*
Es gibt jedoch einige Sonderfälle, in denen dieses Schema nicht funktioniert, insbesondere wenn es Überschneidungen in den Zielverzeichnissen gibt. Bei der Bereitstellung werden einige Ressourcen im selben Verzeichnis abgelegt, sodass es keine wirkliche Möglichkeit gibt, zu unterscheiden, welches welches ist. Es gibt kein striktes Muster für diese Dateien, es ist alles ein Sammelsurium.
z.B,
/someproject1/file1.txt -> /file1.txt
/someproject2/book2.doc -> /book2.doc
Bei einer gegebenen URL /file1.txt
wüsste ich also nicht, ob ich sie umschreiben kann, um zu someproject1
oder zu gelangen someproject2
. Ich denke also, dass ich das hinbekommen könnte, wenn es eine Art Hierarchie gäbe, in welche URLs umgeschrieben werden soll. Ich könnte also eine URL wie nehmen und /file3.txt
sie in das erste dieser Muster umschreiben, das gültig erscheint.
/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
Kann dies nur mit dem URL-Umschreibmodul ausgedrückt werden?
Antwort1
Ich konnte es zum Laufen bringen.
Das erste Hindernis war, dass ich nicht erkannt hatte, dass nicht alle bedingten Übereinstimmungstypen im globalen Bereich verfügbar sind (wo ich meine Regeln geschrieben habe). Nur Pattern
war verfügbar. Ich musste den Bereich auf den „verteilten“ Bereich (Regeln pro Site) ändern, um Zugriff auf die Übereinstimmungstypen IsFile
und zu erhalten.IsDirectory
Von dort aus könnte ich dann meine Regeln in einer Art Hierarchie aufschreiben. Zuerst so umschreiben, dass sie dem Muster entsprechen, das ich zuerst ausprobieren möchte, und dann, wenn es nicht in eine Datei aufgelöst wird, entsprechend dem nächsten Muster umschreiben und wiederholen.
<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>
In meinem speziellen Fall wollte ich zuerst ein bestimmtes Unterverzeichnis ausprobieren und dann übergeordnete Verzeichnisse, falls diese nicht vorhanden waren. Theoretisch könnte ich dies jedoch für jeden beliebigen Pfadsatz tun, solange ich weiß, in welcher Reihenfolge ich sie ausprobieren muss.
Für mein Beispiel in der Frage würde ich also diese Regeln festlegen:
<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>