11 Stimmen

StackOverflow-ähnliche URL-Routing

Mein Verständnis ist, dass die Fragen in StackOverflow das folgende Format haben:

http://stackoverflow.com/questions/{question-id}/{slug-made-from-question-title}

Also wird die Frage im Wesentlichen mithilfe der Frage-ID abgerufen. Also ist es unerheblich, welchen Wert ich dem Slug gebe.

Zuerst möchte ich wissen, ob dieses Verständnis falsch ist :)

Ich habe eine URL

http://stackoverflow.com/questions/6291678/convert-input-string-to-a-clean-readable-and-browser-acceptable-route-data

Dann habe ich den Slug manuell geändert.

http://stackoverflow.com/questions/6291678/naveen

Aber er wurde auf den ursprünglichen Slug zurückgesetzt. Firebug hat mir eine permanente Weiterleitung 301 auf die geänderte URL gezeigt. Wie implementiere ich diese Funktionalität?

8voto

aKzenT Punkte 7655

Sie können dies mit Response.RedirectPermanent tun, das seit ASP.NET 4.0 verfügbar ist:

http://msdn.microsoft.com/de-de/library/system.web.httpresponse.redirectpermanent.aspx

protected void Page_Load(object sender, EventArgs e)
{
    if(!IsPostBack)
    {
        string id = RouteData.Values["id"].ToString();
        string passedSlug = RouteData.Values["name"].ToString();
        //get the original slug from database / dymanic method
        string originalSlug = GetSlugFromID(id);

        if(!originalSlug.Equals(passedSlug))
        {
            var url = String.Format("~/test/{0}/{1}", id, originalSlug);
            Response.RedirectPermanent(url, true);
        }
    }
}

In einem nicht verwandten Nebensatz möchte ich glauben, dass Stack Overflow den Slug nicht in der Datenbank speichert. Es wird dynamisch aus dem Titel verwendend etwas wie dies erstellt. Ich habe gerade den Titel meiner Frage geändert und der Slug hat sich geändert. Es ist unnötig, den Slug in der Datenbank zu speichern, da er redundant zum Titel ist.

5voto

Salman A Punkte 246207

Dies erfolgt über 301 Weiterleitung zur bevorzugten kanonischen URL. Das Skript überprüft die angeforderte URL, um zu sehen, ob die URL mit der "bevorzugten" Version der URL übereinstimmt. Wenn nicht, sendet es eine 301 Weiterleitung an den Browser und teilt ihm mit, dass die Seite dauerhaft an diesen Ort verschoben wurde.

Die Gründe dafür sind ziemlich offensichtlich: Ohne dies können Sie Tausende von URLs wie http://stackoverflow.com/questions/6291678/foo, http://stackoverflow.com/questions/6291678/bar, http://stackoverflow.com/questions/6291678/blah konstruieren, die alle auf denselben Inhalt verweisen. Suchmaschinen würden Sie für doppelten Inhalt bestrafen.

Bearbeiten

In Ihrer ASP.Net-Anwendung können Sie den vom Browser bereitgestellten Slug mit dem im Datensatz gespeicherten Slug vergleichen. Wenn sie nicht übereinstimmen, senden Sie eine 301 Weiterleitung. Sie können dies wahrscheinlich nicht über die web.config oder etwas anderes tun, da die Datenbank involviert ist. Hier ist ein Beispielcode, den ich vor einiger Zeit in meinem Blog gepostet habe (ich bin mir nicht sicher, ob er funktioniert):

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim myId As Integer = 1234
    Dim mySlug As String = "preferred-slug"
    If Request.Url.AbsolutePath.Equals("/" & myId & "/" & mySlug) = False Then
        Response.Clear()
        Response.Status = "301 Moved Permanently"
        Response.AddHeader("Location", "http://" & Request.Url.Host & "/" & myId & "/" & mySlug & Request.Url.Query)
        Response.End()
    End If
End Sub

Ich gehe davon aus, dass Sie bereits eine Form von URL-Umschreibung implementiert haben, die jede Anfrage für /\d+/.+ an Ihre asp.net-Seite weiterleitet.

1voto

Jakub Konecki Punkte 44858

Sie können entweder IIS-URL-Umschreibung oder ASP.NET-Routing verwenden

Überprüfen Sie diesen Artikel für einen detaillierten Vergleich: http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X