Versuchen Sie, die URL auf eine andere umzuschreiben, wenn dies zu 404 führen würde.

Versuchen Sie, die URL auf eine andere umzuschreiben, wenn dies zu 404 führen würde.

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.txtwüsste ich also nicht, ob ich sie umschreiben kann, um zu someproject1oder 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.txtsie 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 Patternwar verfügbar. Ich musste den Bereich auf den „verteilten“ Bereich (Regeln pro Site) ändern, um Zugriff auf die Übereinstimmungstypen IsFileund 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>

verwandte Informationen