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

1546
Jeff Mercado

Ich habe einen lokalen Tomcat-Server, den ich für die Verwendung meiner lokalen IIS-Instanz als Proxy entwickle.

Ich mache das, weil die Bereitstellung des Servers ein schmerzhafter Prozess ist, da ein Großteil der Inhalte (was ich als beschreiben würde) nicht eigenständig ist. Inhalte aus verschiedenen Projekten werden im Wesentlichen in das Stammverzeichnis des Servers kopiert. Ich wollte mich nicht mit dem Aufwand auseinandersetzen, mit dem ich das einrichten konnte. Mit Hilfe des Moduls zum Umschreiben konnte ich die URLs zum größten Teil in virtuelle Verzeichnisse umschreiben.

z.B,

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

Es gibt jedoch einige Fälle, in denen dieses Schema nicht funktioniert, insbesondere wenn sich die Zielverzeichnisse überschneiden. In der Bereitstellung werden einige Ressourcen im selben Verzeichnis abgelegt, sodass es keine echte Möglichkeit gibt, zu unterscheiden, welches das ist. Es gibt kein strenges Muster für diese Dateien, es ist alles eine gemischte Tüte.

z.B,

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

/file1.txtWenn ich also eine URL habe, würde ich nicht wissen, ob ich umschreiben kann, um zu someproject1oder zu gehen someproject2. Ich denke also, ich könnte dies zum Laufen bringen, wenn es eine Art Hierarchie für die URLs gibt, in die geschrieben werden soll. Ich könnte also eine URL nehmen /file3.txt, um das erste dieser Muster, das als gültig erscheint, neu zu schreiben.

/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-Umschreibemodul ausgedrückt werden?

0
Haben Sie über die Verwendung von Links nachgedacht, damit in allen relevanten Projektverzeichnissen dieselbe Datei angezeigt wird? AFH vor 9 Jahren 0
Vielleicht, obwohl ich nicht weiß, ob das für mein Szenario funktionieren würde. Wenn es eine Möglichkeit gäbe, ein einzelnes Verzeichnis auf mehrere Verzeichnisse zu verweisen, dann würde ich das tun. Aber AFAIK, so funktioniert das nicht. Wenn das möglich wäre, würde ich das auch akzeptieren. Jeff Mercado vor 9 Jahren 0
Es ist schon lange her, seit ich IIS verwendet habe, und ich habe jetzt keine Testversion, aber ich glaube, dass wie bei den anderen Webservern, die ich verwendet habe, ein Alias ​​so definiert werden kann, dass er auf ein beliebiges Verzeichnis verweist, ohne Beschränkung auf mehrere Links zum selben Verzeichnis. Tatsächlich verwende ich dies für Großbuchstaben, z. B. zeigen "http: // / music" und "http: // / Music" auf dasselbe ": \ \ SharedMusic". AFH vor 9 Jahren 0
Für meine Situation müsste ich andersherum gehen. Was Sie beschreiben, kann ich tun, mehrere virtuelle Pfade können auf einen einzigen physischen Pfad zeigen. Idealerweise würde ich jedoch mehrere physische Pfade zu einem einzigen virtuellen Pfad benötigen. Das ist meines Wissens nicht möglich. Jeff Mercado vor 9 Jahren 0
Das Beste, was Sie dann tun können, ist ein Verzeichnis mit Links zu erstellen: Sie können dieses Verzeichnis schnell erstellen und den Job so einstellen, dass er regelmäßig ausgeführt wird. Verwenden Sie einen Befehl wie `for / r% i in (*. *) Do mklink / h" \% ~ nxi ""% i "` (Verdoppeln des `% 'in einer Batchdatei). Sie müssen zunächst das Verzeichnis `` mit `del \ *. *` Löschen. Sie können versuchen, symbolische Links zu erstellen (lassen Sie `/ h` weg), aber ich bin nicht sicher, ob IIS diese korrekt verarbeitet. AFH vor 9 Jahren 0

1 Antwort auf die Frage

0
Jeff Mercado

Ich konnte das zum Laufen bringen.

Die erste Hürde war, dass ich nicht wusste, dass nicht alle bedingten Übereinstimmungsarten im globalen Gültigkeitsbereich verfügbar sind (in dem ich meine Regeln schrieb). Nur Patternwar vorhanden. Ich musste den Geltungsbereich in den "verteilten" Geltungsbereich (Regeln pro Standort) ändern, um Zugriff auf die IsFileund IsDirectoryÜbereinstimmungstypen zu erhalten.

Von dort aus konnte ich meine Regeln mit einer Art Hierarchie aufschreiben. Zuerst schreiben Sie das Muster nach, das ich zuerst ausprobieren möchte. Wenn es sich nicht in eine Datei auflöst, schreiben Sie es in das nächste Muster und wiederholen Sie es.

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

In meinem speziellen Fall wollte ich zuerst ein bestimmtes Unterverzeichnis ausprobieren und dann übergeordnete Verzeichnisse ausprobieren, falls diese nicht vorhanden waren. Aber ich könnte dies theoretisch für alle Pfade tun, solange ich weiß, in welcher Reihenfolge ich sie ausprobieren möchte.


Für mein Beispiel in der Frage würde ich folgende Regeln festlegen:

<rule name="try in someproject1" stopProcessing="false"> <match url=".*" /> <action type="Rewrite" url="someproject1/" /> </rule> <rule name="try in someproject2 otherwise" stopProcessing="false"> <match url="someproject1/(.*)" /> <conditions logicalGrouping="MatchAll"> <add input="" matchType="IsFile" negate="true" /> </conditions> <action type="Rewrite" url="someproject2/" /> </rule> <rule name="try in someotherproject otherwise" stopProcessing="false"> <match url="someproject2/(.*)" /> <conditions logicalGrouping="MatchAll"> <add input="" matchType="IsFile" negate="true" /> </conditions> <action type="Rewrite" url="someotherproject/" /> </rule> <rule name="fallback to root otherwise" stopProcessing="false"> <match url="someotherproject/(.*)" /> <conditions logicalGrouping="MatchAll"> <add input="" matchType="IsFile" negate="true" /> </conditions> <action type="Rewrite" url="" /> </rule>