Der Artikel beschäftigt sich damit wie man in seinen eigenen ASP.NET Anwendungen und Seite suchmaschinenfreundliche URL’s integrieren kann.

Noch immer hat der Grundsatz, dass Suchmaschinen mit vielen Parametern in den URL’s nicht klar kommen. Es hat sich zwar zunehmend immer weiter gebessert, aber unbedingt darauf verlassen sollte man sich nicht. Zudem heracht zumindest das Gerücht, dass z.B. Google auch die Url’s mit indiziert, und dem Inhalt der URL’s eine nicht zu unterschätzende Gewichtung zukommen lässt. Glaubt man machen SEO Berichten, so haben die in den Url’s enthaltenen Begriffe die höchste Wertigkeit. Und zu guter Letzt ist es für den Besucher natürlich auch angenehmer wenn er URL’s zu Gesicht bekommt, aus deren er den Inhalt der Seite ablesen kann.

Ich kenne mittlerweile keine CMS Systeme mehr die darauf nicht Rücksicht nehmen würden, bzw. denen man die SEO Freundlichkeit nicht mit wenigen Handgriffen per Plugin oder Boardmitteln beibringen kann. Ich spreche hier als Anwendungsentwickler mit dem Schwerpunkt der Entwicklung von  Anwendungen auf WEB Basis. Nicht immer aber oft ist dabei auch die Suchmaschinenoptimierung ein wichtiger Bestandteil.

ASP.NET ist in der Hinsicht nicht immer ein Freund, aber es gibt Mittel und Wege.

Um Suchmaschinenfreundliche URL’s generell ind ASP.NET umsetzten zu können benötigen wir das URLRewrite Modul für den IIS. Dies ist in einer Srandard Installation des IIS nicht vorhanden. Diese kann man sich leicht von der Seite http://www.iis.net über den Web Platform Installer runter laden und installieren.

Das URLRewrite Modul lässt sich dann nachdem es installiert und in der IIS Website Konfiguration aktiviert wurde,  mit Rewriteregeln in der Web.config mit den entsprechenden regeln füttern.

Dazu erstsellt man unter dem Tag <system.webServer> folgende Struktur:

<rewrite>
<rules>
<rule name=”Rewrite Rule”>
<match url=”^cms/([0-9]+)”/>
<action type=”Rewrite” url=”Zielseite.aspx?c={R:1}”/>
</rule>
</rules>
</rewrite>

Rule name kann ein beliebger Name für die Regel sein.

Match Url enthält die Regexpression für die Regel.

Action Type gibt in diesem Fall an wo hin der Request weitergeleitet werden soll, als die Url die wir “verschleiern wollen.

Beispiel mit einem Parameter

<rule name="CMS Rewrite">
<match url="^cms/([0-9]+)"/>
<action type="Rewrite" url="cms.aspx?c={R:1}"/>
</rule>

Diese Regel wertet die suchmaschinenfreundliche URL aus welche cms/ enhält. Die nach dem / angehängte Zahl gibt den eigentlichen Content (z.B. ID des Datensatzes) an der angezeigt werden soll. Die dabei ausgewertete ID wird an die richtige Server Url per Parameter mit dem Tag {R:1} angehängt.

Aus http://www.angermeier.net/cms.aspx?c=123 würde damit eine suchmaschinenfreundliche Url http://www.angermeier.net/cms/123

Beispiel mit 2 Paraneter

<rule name=”Produkt Image Rewrite”>
<match url=”^produkt/([0-9]+)/([0-9]+)”/>
<action type=”Rewrite” url=”produkt.aspx?p={R:1}&amp;img={R:2}”/>
</rule>

Hier ist der Aufbau wieder ähnlich dem ersten Beispiel, enthält aber 2 Parameter die wir über die Rewrite Regeln suchmaschinenfreundlich Gestalten werden. {R:1} gibt dabei den ersten Parameter an, {R:2} den zweiten Parameter.

Aus http://www.angermeier.net/produkt.aspx?p=123&img=456 würde damit eine suchmaschinenfreundliche Url http://www.angermeier.net/produkt/123/456

Dieses Szenario lässt sich sicherlich noch wesentlich verbessern, indem man am ende der url einfach den Namen des Produktes anhängt. Wie zum Beispiel:

http://www.angermeier.net/produkt/3838/1/Aqua_science_blue_54W_22K_T5.html

Die Regexpression sucht nach dem Wortteil Produkt, gefolgt von zwei Nummern. Alles was danach noch angehängt wird, wird nicht berücksichtigt. Dies lässt sehr viel Freiraum für die eigene Kreativität.

Mit dieser Rewrite Engine und den Regexpressions hat man sehr viel Spielraum für seine eigene Vorstellung, und kann sich optimal auf die Gegebenheiten einstellen. Dieser Beitrag ist keine Anleitung wie man Suchmaschinenoptimierte URL’s am besten optimiert, sondern wie man dies grundsätzlich bei ASP.NET Anwendungen umsetzten kann. Dazu finden sich im Web einige sehr spannende Anleitungen und How To’s.

AquaticSport.de - Alles rund um den Wassersport
 

Suchmaschinenoptimierung ist in alle Munde bei den Website Entwicklern. Bei ASP.NET gibt viele Dinge zu beachten, denn man wird mit den ein oder anderen Stolpersteinen konfrontiert werden, und die ein oder andere Unwegsamkeit entdecken. Der folgende Artikel Handelt von der Suchmaschinenoptimierung mit ASP.NET in Verbindung mit dem Viewstate.

Meine Artikel beschränken sich hier auf ASP.NET, hier ist die Dichte von entsprechenden Artikeln ziemlich gering im Internet. Vorweg, ich bin sicherlich kein SEO Experte, das ist eine Wissenschaft für sich. Sollte ich in diesem oder einen der folgenden Beiträge Fehlinformationen vebreiten, so würde ich mich freuen wenn Ihr mich darüber informiert. Gerne auch über die Kommentarfunktion!

Der Viewstate

Ich denke der Viestate hat in diese Zusammenhang eine große Bedeutung. Der Viewstate speichert Inhalte von Steuerelementen der angezeigten Website um diese bei einem Postback oder Callback an den Server zu übermitteln. Der Viewstate wird in einer verschlüsselten Weise im Head abgelegt. Und genau hier liegt das Problem was die SEO Optimierung betrifft. Der Viewstate kann je nach Dichte der angezeigten Steuerelemente sehr umfangreich werden. Ich habe Projekte da erreicht der Viewstate gut und gerne mal 512 KB und mehr. Mehr als 5 bis 10 KB Viewstate können bereits ein Problem darstellen. Google liest zum einen nicht die Gesamte Seite, sondern nur einen Bestimmten Teil (mir leider unbekannt) von Anfang der Seite. Des Weiteren bewertet Google den Content nach seine Position in der Seite, sprich Keywords haben eine höhere Gewichtung je weiter oben Sie stehen. Genau diese Gewichtung verringert uns im Idealfall der Viewstate, ist der Viewstate zu groß kann es u.U, sogar dazu führen dass Google gar keinen Content zu Gesicht bekommt.

Die Lösung(en)

Ich stelle nun zwei Möglichkeiten vor wie man diesem Problem entgegen wirken kann. Die erste Lösung ist so einfach wie ein Radio auszuschalten. Der Viewstate lässt sich durch eine Page Direktive schlicht deaktivieren.

<%@ Page Enableviewstate=”false” %> 

Allerdings ist diese Variante nicht immer erwünscht, denn der Viewstate macht in manchen Situationen durchaus auch Sinn und wird benötigt. Die zweite Lösung liegt darin, den Viewstate an eine Stelle zu verschieben, an dem er bei Google und Co. keinen Schaden anrichten kann. Sehr gute Erfahrungen habe ich gemacht in dem ich den Viewstate in eine Session Variable geschrieben habe. Damit bekommt Google und auch der Client erst den Viewstate gar nicht zu Gesicht, und sorgt nebenbei auch noch dafür dass etwas Traffik gespart wird, bzw. sich die Seite schneller aufbaut.

Zunächst braucht man dafür eine neue Klasse in ASP.NET:

Partial Public Class BasePage
    Inherits System.Web.UI.Page
Protected Overrides Sub SavePageStateToPersistenceMedium(ByVal viewState As Object)
        Dim Key As String = Request.Url.ToString & "__VIEWSTATE"
        Dim memStream As New System.IO.MemoryStream
        _formatter.Serialize(memStream, viewState)
        memStream.Flush()
        Session(Key) = memStream
        Writelog("SavePageStateToPersistenceMedium", "Time")
    End Sub

    Protected Overrides Function LoadPageStateFromPersistenceMedium() As Object
        LoadPageStateFromPersistenceMedium = ""
        Dim Key As String = Request.Url.ToString & "__VIEWSTATE"
        If Not Session(Key) Is Nothing Then
            Dim memStream As System.IO.MemoryStream = CType(Session(Key), System.IO.MemoryStream)
            memStream.Seek(0, IO.SeekOrigin.Begin)
            Return _formatter.Deserialize(memStream)
        End If
        Writelog("LoadPageStateFromPersistenceMedium", "Time")
    End Function
End Class

 


Diese Klasse muss dan auf der ASP.NET Seite in der Code behind Datei anstatt System.Web.UI.Page per Inherit importiert werden. Die Basisklasse System.Web.UI.Page wird dabei mit vererbt.

Die Beiden Funktionen Überschrieben Funktionen aus der Basisklasse und sorgen dafür dass der Viewstate in einer Session Variable gespeichert, bzw. abgerufen wird.

Fazit

Wenn Möglich sollte man auf den Viewstate verzichten, in den meisten Fällen ist dies problemlos möglich. Denn der Viewstate bringt leider auch noch ein paar weitere Unwegsamkeiten mit sich. Diese hat wie die Session nur eine bestimmte Lebenszeit bis er in einen Timeout läuft. Das bedeutet dass der Viewstate nach Ablauf des Time to Live ungültig wird, und ein Postback oder Callback in eine Exception läuft.

Sollte dies nicht möglich sein, so empfiehlt sich die Verwendung der obigen Lösung. Es gibt noch eine dritte Lösung inder der Viewstate ans Seitenende in ein Hiddenfield verschoben wird. Diese Variante habe ich bislang noch nicht eingesetzt oder getestet. Sollte ich das mal tun, werde ich meine Erfahrungen damit hier veröffentlichen.

 

Mit der folgenden Funktion kann man ein Zufalls – Passwort generieren. Die Funktion verwendet dazu die Zeichen die in der Variable “AllowedChars” definiert werden. Die Länge des Passwortes lässt sich mit der Variable “PasswordLenth” festlegen. Man muss keine Variablen übergeben, als Rückgabewert erhält man das Passwort im String Format. Übrigens diese Funktion läuft nicht nur in ASP.NET sondern kann auch in VB.NET verwendet werden.

 Public Function CreateRndPassword()
        ' Hier die Zeichen angeben die im Passwort vorkommen dürfen
        Dim AllowedChars As String = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,1,2,3,4,5,6,7,8,9,0,!,@,#,$,%,&,?,/,\"
        ' Wie lange soll das Passwort sein?
        Dim PasswordLenth As Integer = 10
        Dim AllowedCharsArry() As String = Split(AllowedChars, ",")
        Dim PasswordStr As String = ""
        Dim PasswordTmp As String = ""
        Dim iRnd As Random = New Random
        For i = 0 To PasswordLenth - 1
            Dim RndNumber As Integer = iRnd.Next(0, AllowedCharsArry.Length - 1)
            PasswordTmp = AllowedCharsArry(RndNumber)
            PasswordStr = PasswordStr + PasswordTmp
        Next
        Return PasswordStr
    End Function
© 2012 www.coral-riff.net Suffusion theme by Sayontan Sinha