2012-04-11 17 views
1

Ich habe mit Backbone für ein Projekt experimentiert, an dem ich gerade arbeite, und ich habe Probleme damit, Backbones "PushState" so zu funktionieren, wie ich es möchte.HTML5 PushState Regex Problem

Ich habe ein einfaches Projekt, bestehend aus 4 Ansichten und einem Router. Ich leite über die ID der Elemente, wenn es in diesem Fall darauf ankommt. Wenn ich für eine der Ansichten zum Hash gehe (http://example.com/backbontest/ # step1), wird es korrekt angezeigt, und die URL wird geändert. Dies ist, was ich hier erwarten würde, aber das Problem kommt, wenn ich versuche, zu demselben Ding ohne den darin enthaltenen Hash zu navigieren (http://example.com/backbontest/ step1). Ich bekomme eine 404 auf dem Server (IIS), die zu erwarten ist, da die Seite nicht existiert.

Was ich den ganzen Tag versucht habe, ist einen Regex-Ausdruck für IIS zu schreiben, der die URL fängt und umschreibt und das Fragment am Ende der URL entfernt, damit die Seite korrekt bedient wird. Ich würde die URL lieber einfach neu schreiben, als eine physische Datei mit dem gleichen Namen zu haben, da der Inhalt der Seite dynamisch generiert wird und Skripte erforderlich sind, um den Inhalt trotzdem zu erhalten.

Das Problem, auf das ich gestoßen bin, hängt möglicherweise damit zusammen, wie ich die Ordner/Scripts/Stile im Dateisystem strukturieren muss. Ich hatte gehofft, das ganze Beispiel im Ordner /backbonetest/ enthalten zu können. Für Skripte, "Backbone-Test/Skripte" und so weiter.

Ich habe eine Liste von URLs, die ich habe gegen meine Regex Ausdrücke getestet, und die Ergebnisse, die ich zu erreichen versucht habe:

 
    Input:     Output: 

    2      
    a2      
    ab2      
    ab22      
    step2     
    script.js    script.js 
    scripts/    scripts/ 
    555/stuff    555/stuff 
    scripts/script.js  scripts/script.js 

Edit: Ich habe das seit fand die Die URL, die verwendet wird, enthält den vorangestellten Schrägstrich nicht, weshalb die Lösung von Qtax in IIS nicht funktioniert. Die neue Eingabestruktur ist oben gezeigt.

Die '/ 555/stuff' URL würde ich 404 erwarten wie normal. Ich möchte die URL nur dann neu schreiben, wenn keine anderen Unterverzeichnisse als die aktuelle definiert sind und wenn die URL nicht auf eine explizite Datei verweist (z. B. eine mit einer Erweiterung).

Ich habe den ganzen Tag nach einer Lösung für dieses Problem gesucht und experimentiert mit regexr, aber es ist mir nicht gelungen, die richtige Lösung für mein Problem zu finden. Nachdem ich nirgendwo eine einzige Sache gefunden habe, denke ich, dass ich das falsch ansehen muss ...

Kann mir bitte jemand weiterhelfen?

+0

Sie wissen nicht, über IIS, aber die regex umschreiben Sie verwenden könnte, ist '^/[^ /. ] + $ 'zu'/'. – Qtax

+0

Dies funktioniert perfekt mit meinen Testdaten und mit dem Tester im IIS-Manager, aber aus irgendeinem Grund werden die URLs entweder nicht korrekt abgefangen oder sie wurden an die falsche Stelle geschrieben. – brins0

+0

Ich habe herausgefunden, dass die Eingabe, die ich hier gegeben habe, nicht genau das ist, was IIS für die Rewrite-Regeln verwendet, und erklärt, warum es nicht funktioniert hat. Was müsste ich in Qtax 'vorgeschlagenem Ausdruck ändern, damit er für die neue Eingabezeichenfolge funktioniert? – brins0

Antwort

2

Nach viel Kopf/Schreibtisch schlagen, habe ich die Lösung gefunden. Es ist irritierend einfach für die ganze Aufregung sie verursacht hat:

^[^\./]+$

Im Wesentlichen:

ersetzen, wenn die URL nicht ein ‚/‘ oder enthält ‚‘ irgendwo drin.

Dies sollte jetzt eine Lösung für jeden sein, der IIS mit Backbone und HTML5 Push-Status verwendet. Öffne es einfach in der web.config im Stammverzeichnis deiner App und ändere die Umschreibeaktion in "." Und es sollte einfach funktionieren.

1

Das schmolz mein Gehirn den ganzen Morgen!

Ich habe hinzugefügt - In meinem Szenario habe ich ein API-Projekt, das in einem virtuellen API-Verzeichnis sitzt (um die Notwendigkeit für CORS zu beseitigen) - ich möchte natürlich keine der PAI-Aufrufe neu schreiben, so dass ich wieder schrieb Mine wie folgt - Sie können für Ihre API-URLs ähnlich tun, wenn nötig ...

 <rule name="Handle PushState"> 
     <match url="^[^\./]+[^\./api]+(.*)$" /> 
     <conditions> 
      <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> 
      <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> 
     </conditions> 
     <action type="Rewrite" url="." /> 
     </rule>