Wie kann eine URL in einer ASP.NET MVC-Anwendung korrekt kanonisiert werden?

8

Ich versuche, eine gute allgemeine Möglichkeit zu finden, URLs in einer ASP.NET MVC 2-Anwendung zu kanonisieren. Hier ist, was ich bis jetzt gefunden habe:

%Vor%

Jetzt kann ich meine Controller wie folgt markieren:

%Vor%

Das alles scheint ziemlich gut zu funktionieren, aber ich habe folgende Bedenken:

  1. Ich muss immer noch die CanonicalizeAttribute zu jedem Controller (oder jeder Aktionsmethode) hinzufügen, die kanonisiert werden soll, wenn es schwer ist, an eine Situation zu denken, in der ich dieses Verhalten nicht möchte. Es scheint, als sollte es eine Möglichkeit geben, dieses Verhalten standortweit zu erhalten, anstatt nur einen Controller gleichzeitig.

  2. Die Tatsache, dass ich die "Force-zu-Klein" -Regel im Filter implementiere, scheint falsch zu sein. Sicher wäre es besser, dies irgendwie in die Routen-URL-Logik einzuordnen, aber ich kann mir keinen Weg vorstellen, dies in meiner Routing-Konfiguration zu tun. Ich dachte über das Hinzufügen von @"[a-z]*" constraints zu den Controller- und Aktionsparametern (sowie allen anderen String-Routeparametern), aber ich denke, dies wird dazu führen, dass die Routen nicht übereinstimmen. Da die Kleinbuchstabenregel nicht auf der Routenebene angewendet wird, können Links auf meinen Seiten generiert werden, die Großbuchstaben enthalten, was ziemlich schlimm erscheint.

Gibt es etwas Offensichtliches, das ich hier übersehen habe?

    
Bennor McCarthy 26.09.2010, 09:19
quelle

3 Antworten

18

Ich habe das gleiche "Juckreiz" in Bezug auf die entspannte Art der ASP.NET MVC Standardrouting, Ignorieren Briefumschlag, Schrägstriche, etc .. Wie Sie, wollte ich eine allgemeine Lösung für das Problem, vorzugsweise als Teil der Routing-Logik in meinen Anwendungen.

Nachdem ich das Internet hoch und runter durchsucht habe und keine brauchbaren Bibliotheken gefunden habe, habe ich beschlossen, selbst eines zu erstellen. Das Ergebnis ist Canonicalize , eine Open-Source-Klassenbibliothek, die die ASP.NET-Routing-Engine ergänzt.

Sie können die Bibliothek über NuGet installieren: Install-Package Canonicalize

Und in Ihrer Routenregistrierung: routes.Canonicalize().Lowercase();

Neben Kleinbuchstaben sind mehrere andere URL-Kanonisierungsstrategien im Paket enthalten. Erzwinge www domain prefix on oder off, erzwinge einen bestimmten Hostnamen, einen nachgestellten Schrägstrich, usw. Es ist auch sehr einfach, benutzerdefinierte URL-Kanonisierungsstrategien hinzuzufügen, und ich bin sehr offen, Patches zu akzeptieren, die dem "offiziellen" System weitere Strategien hinzufügen. Canonicalize Verteilung.

Ich hoffe, Sie oder jemand anderes wird das hilfreich finden, auch wenn die Frage ein Jahr alt ist:)

    
Jørn Schou-Rode 05.10.2011, 15:58
quelle
7

MVC 5 und 6 bietet die Möglichkeit, URLs in Kleinbuchstaben für Ihre Routen zu erstellen. Meine Routenkonfiguration ist unten gezeigt:

%Vor%

Mit diesem Code sollten Sie die URLs nicht mehr benötigen, da dies für Sie erledigt ist. Ein Problem, das auftreten kann, wenn Sie HTTP- und HTTPS-URLs verwenden und eine kanonische URL dafür möchten. In diesem Fall ist es ziemlich einfach, die obigen Ansätze zu verwenden und HTTP durch HTTPS oder umgekehrt zu ersetzen.

Ein weiteres Problem besteht darin, dass externe Websites, die auf Ihre Website verweisen, den abschließenden Schrägstrich weglassen oder Großbuchstaben hinzufügen. Dazu sollten Sie eine permanente 301-Weiterleitung an die richtige URL mit dem abschließenden Schrägstrich durchführen. Die vollständige Nutzung und den Quellcode finden Sie in meinem Blogpost und dem RedirectToCanonicalUrlAttribute -Filter:

%Vor%

Verwendungsbeispiel, um sicherzustellen, dass alle Anfragen auf die korrekte kanonische URL umgeleitet werden:

%Vor%     
Muhammad Rehan Saeed 30.09.2014 14:21
quelle
4

Unten ist, wie ich meine kanonischen URLs in MVC2 mache. Ich benutze IIS7 Rewrite Modul v2, um alle meine URLs Kleinbuchstaben zu machen und auch Schrägstriche abzustreifen, so müssen sie nicht aus meinem Code tun. ( Vollständiger Blogbeitrag )

Fügen Sie dies wie folgt in die Masterseite im Kopfbereich ein:

%Vor%

Erstellen Sie ein Filterattribut (CanonicalURL.cs):

%Vor%

Rufen Sie dies aus Ihren Aktionen auf:

%Vor%

Für einige andere interessante Artikel auf Search Engine Related Beiträge lesen Sie Matt Cutts Blog

    
Andrew 15.11.2010 21:00
quelle
Django: Verwenden von Annotate, Count und Distinct in einem Queryset ___ answer3780476 ___

Die Python-Dokumentation enthält eine Seite zum Einbetten von Python in eine C- oder C ++ - Anwendung.

    
___ answer3780571 ___

Warum nicht Boost.Python? Sie können Ihre Datenklassen Python aussetzen und ein Skript / eine Funktion ausführen, wie in hier .

    
___ answer3780440 ___

Wie wäre es mit einer JavaScript-Engine wie V8 ?

?     
___ answer3780626 ___

Vergessen Sie nicht den Grand-Daddy der eingebetteten Skriptsprache - tcl.

tcl hat einen netten C ++ - Wrapper (der auf boost.python basiert), der es einfach macht, Callbacks zu Ihrem Code aufzurufen und zu verkabeln

    
___ answer3780670 ___

Lua funktioniert auch ziemlich gut, vor allem, weil es klein ist, ansi c-konform ist, einen niedrigen Speicher-Footprint zusammen mit einer tollen Wiki- und Messaging-Liste hat. Wenn Sie noch mehr Geschwindigkeit benötigen, gibt es eine x86 32 und 64 bit jit Version (luajit). Das Binden kann mit einem Array von Werkzeugen / Bibliotheken wie swig oder lunar erfolgen (das Wiki listet sie alle auf). Das einzige Problem, das ich sehen kann, ist das Binden der Struktur-Mitglieder, so dass sie direkt referenziert werden können (zB: struct.member = 4), obwohl es möglich ist, dies mit Metatabellen einzurichten, die get- und set-Methoden an Variablennamen gebunden haben >     

___ answer3781157 ___

Für etwas so einfaches wie Sie beschreiben, könnten Sie einen Interpreter für Ihre eigene "kleine Sprache" implementieren. Man könnte es sogar "Robin" nennen. ; -)

    
___ answer3780753 ___

Sie sagen, dass Sie nicht nach etwas suchen, um Ihre C ++ Funktionen / Klassen in eine Python-Schnittstelle zu packen, aber wenn Sie wollen, dass Python-Code auf Mitglieder Ihrer C ++ %code% -Struktur verweisen kann, umschließt C ++ - Klassen in einer Python-Schnittstelle. Natürlich können Sie beliebig viele oder beliebig viele Klassen umbrechen - in diesem Beispiel würden Sie %code% umbrechen, dann würden Sie bette einen Python-Interpreter ein um Sachen mit %code% zu machen.

    
___ answer3780470 ___

Wenn Sie einfach Python-Skripte von C / C ++ ausführen möchten, verwenden Sie die Python-C-API . In Ihrem C / C ++ Code:

%Vor%

Für kompliziertere Dinge müssen Sie sich die API-Dokumentation ansehen, aber es ist ziemlich einfach.

    
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ answer3781199 ___

Ich rate mit Lua als interne Scripting-Engine. Implementierung ist nur ein paar Zeilen, und obwohl leicht, hat die Sprache genügend Kraft. Also keine Notwendigkeit für TCL. Sie können sich auch Python ansehen, die Integration in C ++ ist ziemlich einfach, da es ein Boost.Python Implementierung erleichtert die Integration.

Aber je nach Anwendung würde ich Lua immer noch empfehlen.

    
___ tag123embedding ___ Eine Einbettung ist eine Instanz einer Struktur, die in einer anderen Instanz enthalten ist, z. B. eine Gruppe, die eine Untergruppe ist. ___ tag123scripting ___ Scripting ist eine Form der Programmierung, die im Allgemeinen durch geringe Formalität, lose Typisierung und keine explizite Kompilierung gekennzeichnet ist. Es gibt zahlreiche Skriptsprachen, die in einer Vielzahl von Szenarien verwendet werden - Befehlszeilenanwendungen, GUIs, serverseitige Anwendungen, Erweiterungsmodule. ___ tag123python ___ Python ist eine dynamische und stark typisierte Programmiersprache, die die Usability betont. Zwei ähnliche, aber größtenteils inkompatible Versionen von Python sind weit verbreitet (2 und 3). Wenn Sie eine versionsspezifische Python-Frage haben, sollten Sie die Tags [python-2.7] oder [python-3.x] zusätzlich zum Tag [python] verwenden. Wenn Sie eine Python-Variante wie jython, pypy, iron-python usw. verwenden, kennzeichnen Sie diese bitte entsprechend. ___ qstntxt ___

Ich bin wirklich neu in C ++ und bin auf ein Problem gestoßen, das ich durch das Lesen von Dokumentationen nicht lösen konnte.

Ich möchte eine Skriptsprache in meine C ++ - Anwendung einbetten. Diese Sprache könnte Javascript, Lua oder vorzugsweise Python sein.

Ich bin nicht auf der Suche nach etwas wie Boost.Python / swig, etwas, das in der Lage ist, meine C ++ - Funktionen / -Klassen in eine Python-Schnittstelle einzubinden, sondern eher eine %code% -Funktion.

Ich habe eine ganze Reihe von Strukturen, die ein paar ganze Zahlen enthalten:

%Vor%

Nun möchte ich etwas Mathematik mit diesen ganzen Zahlen machen, zum Beispiel:

%Vor%

Die Mathematik, die ich machen möchte, wird sich in der Zukunft stark verändern und ich brauche andere Leute, die anders als ich in der Lage sind, die Mathematik zu ändern, ohne Zugriff auf den C ++ - Code zu haben.

Ich denke über eine Code-Struktur wie folgt nach:

  1. Ich initialisiere meine Struktur und fülle sie mit den Startwerten
  2. Ich lade eine externe Python-Funktion, sagen wir "my_python_function", die die Struktur als Argument annimmt und damit vor der Rückgabe rechnet.
  3. Ich bekomme meine Struktur wie %code%

Ist so etwas möglich? Ich habe viel gegoogelt, aber das einzige, was ich zu finden scheint, sind Wrapper, die c ++ - & gt; Python (oder andersherum) Funktionalität, ohne wirklich mit Variablen zu interagieren.

Ich wäre wirklich dankbar für jede Hilfe,
Robin.

    
___