#

Asp.Net: Benutzerfreundlichen URL-Pfad kodieren
 
Wie baut man eine klassische Webseite mit Seitenadressen und Parametern um in eine neue benutzerfreundliche Adressierung mit Pfadangaben?
 
Bewertung:
Google als Suchmaschinen-Monopol bewertet Webseiten, welche mit benutzerfreundlichen URL-Adressen ausgestattet sind, deutlich besser, als die üblichen, klassischen Webadressierungen.
Dabei ist gemeint, dass eine Webseite ähnlich zu einem Dateiverzeichnis aufgerufen werden soll wie: Domain/Pfad/Datei.
Normalerweise ist das Internet und die Verwaltung von Dokumenten nach dem Muster von Programmen verwaltet wie Webseite_mit_Pfad.aspx?ID=100. Hier wird direkt eine Seite aufgerufen und über die Querystring-Parameter hinter dem Fragezeichen bewirken, was damit geschehen soll. Der Vorteil der benutzerfreundlichen Pfad/Datei-Struktur ist, dass Google und Suchmaschienen dann eine Verwaltungsstruktur besser automatisch zusammenstellen können.
Aus einer Datei mit unbekannten Parametern kann eine Suchmaschine nur schwer den Bezug zum Inhalt strukturieren.
 
Beispiele von neuen benutzerfreundlichen Adressen:
 
Neue, benutzerfreundliche URL Adressen:
a) Übersichtsliste als Verteiler mit benutzerfreundlicher Pfad Angabe nach Themen.
https://microsoft-programmierer.de/Net-Framework/ASP_dot_Net/IIS-Server/Anleitungen
und
b) eine Detailseite mit den jeweiligen Artikeln, wobei der Themen-Pfad voransteht, und anschliessend die Inhaltsseite nach dem Titel angefügt ist
https://microsoft-programmierer.de/Net-Framework/ASP_dot_Net/IIS--Server/Anleitungen/Redirect-www-to-non--www-and-http_colon_-to-https_colon_?1981
 
Alte Adressierung:
Alte Adressierung mit page-Adresse und Querystring als Parameter
a) Verzeichnis
https://codedocu.com/Default?a=9&f=265&l=0&v=d&t=Tutorials
b) Detailseite, Artikelseite
https://codedocu.com/Details?d=1798&a=9&f=265&l=0&v=d&t=How-To:-Videos-for-your-own-website
 
 
 
Anleitung und Beschreibung zum Umbau.
 
1) neue Adressen anzeigen
Wenn man eine bestehende Webseite umbauen möchte in die neue benutzerfreundliche Pfad/Datei-Adressierung, dann kann man das dadurch erweitern, indem man im ersten Schritt in allen Dateien in Links die neue Adressierung anzeigt.
Dadurch funktioniert die eigenliche Querystring-Parametriesierung noch nach wie vor und bestehende Verlinkungen im Internet gehen nicht verloren.
 
2a) ankommende Adressen umrechnen
Wenn jetzt eine Anfrage an die Domain geleitet wird mit der neuen Adresse, dann würde diese ins Leere laufen, da es keine Landing-Page zu den neuen Adressen gibt.
Die neuen benutzerfreundlichen Adressen verwenden ja einen Pfad, welcher gar nicht als Dateiverzeichnis existiert.
Deshalb muss man die neuen URL Anfragen beim ankommen des Request umrechnen.
Dieses wird bei ASP.net Webform Anwendungen in der Global.asa umgesetzt.
Jede Web-Anfrage kommt in der Webanwendung erst

Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
'----------------< Application_BeginRequest() >----------------
' Wird zu Beginn jeder Anforderung ausgelöst
 
'--------< Redirect if URL_Userfriendly >--------
Dim sFilePath As String = Request.FilePath
'< check >
If sFilePath Like "*.aspx" Then
'is a real file with extension
Exit Sub '*break
ElseIf sFilePath Like "*.axd" Then
'is resource (after server transfer from /Userfriendly to /File.aspx
Exit Sub '*break
ElseIf sFilePath Like "/Default" Or sFilePath Like "/Details" Or sFilePath Like "/e" Or sFilePath Like "/zz" Then
'*is real page, exceptions
Exit Sub '*break
End If
'</ check >
..

 
Ablauf-Schema zur Vergabe neuer URL Adressen (1) und anschliessender Verarbeitung in der Global.asax (2) ,
welche abschliessend wieder zur regulären Adresser auf die page.aspx führt.

 
 
Kodieren und Decodieren von URL Adressen.
 
Normalerweise werden für das sichere Übertragen von Zeichenketten über eine URL Adresse die allgemeine Funktion
Neue_URL=httpUtility.EncodeURL(alter_String)  und zur Rückumwandlung die httpUttility.DecodeURL(neue_URL) verwendet.
 
Allerdings führt diese einfache Umwandlung immer wieder zu Sicherheits-Fehlermeldungen durch die web.config Einstellungen im IIS Webserver auf unterer Ebene.
Deshalb empfiehlt es sich nach meiner Feststellung, die Stings mit eigenen Funktionen in eine neue URL-Taugliche Zeichenkette umzuwandeln.
Im Prinzip müssen nur die Leerstellen durch einen Bindestrich ersetzt werden und Sonderzeichen wie Doppelpunkt und Punkt ebenfalls kodiert werden.
 
Eigene Kodierung und Dekodierung von URL Adressen.

Public Shared Function encode_Segment_of_Path(ByVal sPath As String) As String
'--------------------< encode_Path() >--------------------
'*Escape Problems with: HttpUtility.UrlEncode(sPath)
sPath = Replace(sPath, "-", "--")
sPath = Replace(sPath, " ", "-")
sPath = Replace(sPath, ":", "_colon_")
sPath = Replace(sPath, ".", "_dot_")
Return sPath
'--------------------</ encode_Path() >--------------------
End Function
 
Public Shared Function decode_Segment_of_Path(ByVal sPath As String) As String
'--------------------< decode_Segment_of_Path() >--------------------
'*Escape Problems with: HttpUtility.Urldecode(sPath)
 
sPath = Replace(sPath, "--", "xxDashxx")
sPath = Replace(sPath, "-", " ")
sPath = Replace(sPath, "xxDashxx", "-")
sPath = Replace(sPath, "_colon_", ":")
sPath = Replace(sPath, "_dot_", ".")
 
Return sPath
'--------------------</ decode_Segment_of_Path() >--------------------
End Function

 
Wenn man dann einen Link zu einer Detailseite erstellen möchte, dann läuft die übliche Adressierung auf die Detail.aspx Seite mit den Parametern in einem Html Querystring der Weise:  Detail.aspx?IDDetail=1000
 
 
2) Umwandeln in der Global.asax in konventionelle Page-Adressen
 
Beispiel der Weiterleitung:
Mit der Server.Transfer(ziel-page.aspx) Funktion, kann im Server die aktuelle Bearbeitung des Request umgeleitet werden auf die Ziel-Seite mit der richtigen Adressierung aus echtem Pfad und echtem Dateiname mit Extension und Querystring.
In diesem Beispiel wird die Anfrage auf die Seite Default.aspx weitergeleitet, wobei sich die Seite direkt im Hauptverzeichnis ~/ der Domain befindet.
Dabei werden die Parameter im Querystring hinter dem Fragezeichen ? in der Kombination Parameter=Wert übergeben.

Server.Transfer("~/Default.aspx?s=" & sFolder, True)
 

 
 
Beispiel Code einer Weiterleitung in der Global.asax.vb

Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
'----------------< Application_BeginRequest() >----------------
..Umrechungs-Code
..
End Sub

 
Als komplettes Beispiel.
Bei jeder Kombination wird erst geprüft, welcher Pfad voran liegt und anschliessend entschieden ob es sich um eine Liste oder eine Einzel-Ausgabe handelt.
Abschliessend wird die Request Anfrage immer mit einer Server.Transfer WEiterleiung beendet.

Dim sSQL As String = ""
Dim row As DataRow = Nothing
Dim sArea As String = ""
Dim sFolder As String = ""
Dim IDArea As String = 0
'----< Is Default >----
Dim pos_NextFolder = sFilePath.Length
Dim posFolder As Int16 = sFilePath.LastIndexOf("/", pos_NextFolder)
 
sFolder = sFilePath.Substring(posFolder + 1, pos_NextFolder - posFolder - 1)
sFolder = clsPath.decode_Segment_of_Path(sFolder)
If posFolder = 0 Then
'----< 1-Folder=AREA >----
'*if Path with 1-Slash is Area like /Software
sArea = sFolder
sSQL = "SELECT TOP 1 IDArea FROM tblSYS_AREAS WHERE [Title0]='" & sFolder & "'"
row = clsSpeicher.ladeDatarow(UCase("spUserfriendly_Area_" & sFolder), , , sSQL, bErzwingen:=False, parMinuten:=60)
If Not row Is Nothing Then
'--< Area found >--
'*if no match, then as search-list
IDArea = clsDB.dbLong(row("IDArea"))
Server.Transfer("~/Default.aspx?a=" & IDArea, True)
Exit Sub '*break ---->>>>
'--</ Area found >--
End If
 
'< Area not found >
'*goto search
Server.Transfer("~/Default.aspx?s=" & sFolder, True)
Exit Sub '*break if Area ---->>>>
'</ Area not found >
End If
'----</ 1-Folder=AREA >----
 
'----< Search >----
Dim pos_End_Area = sFilePath.IndexOf("/", 1)
sArea = sFilePath.Substring(1, pos_End_Area - 1)
'*goto search
If UCase(sArea) Like "SEARCH" Then
Dim sSearch As String = sFilePath.Substring(pos_End_Area + 1)
Server.Transfer("~/Default.aspx?s=" & sSearch, True)
Exit Sub '*break if Area ---->>>>
'</ Area not found >
End If
'----</ Search >----
 
'------< FastFind: if 1-Folder >--------
'*check last Path-Segment as Folder Like /Area/Folder1 to get Folder1
 
sSQL = "SELECT TOP 2 IDFolder, IDParent FROM tblSYS_Folders WHERE [Title0] LIKE '" & sFolder & "'"
'< Folders laden >
Dim dt As DataTable = clsSpeicher.ladeDatatable(UCase("spUserfriendly_Folders_" & sFolder), , , sSQL, bErzwingen:=False, parMinuten:=60)
'</ Folders laden >
 
'< Kontrolle >
If dt Is Nothing Then
'--< error in db >--
'*if no match, then as search-list
Dim sSearch = sFilePath.Replace("/", "+")
Server.Transfer("~/Default.aspx?s=" & sSearch, True)
Exit Sub
'--</ error in db >--
ElseIf dt.Rows.Count = 0 Then
'--< Folder not found >--
'*if no match, then as search-list
Dim sSearch = sFilePath.Replace("/", "+")
Server.Transfer("~/Default.aspx?s=" & sSearch, True)
Exit Sub
'--</ Folder not found >--
ElseIf dt.Rows.Count = 1 Then
'--< 1-Ident Folder >-
'*folder exists only one time with that name
IDFolder = clsDB.dbText(dt.Rows(0)("IDFolder"))
Server.Transfer("~/Default.aspx?f=" & IDFolder, True)
Exit Sub
'--</ 1-Ident Folder >-
Exit Sub
End If
'</ Kontrolle >
'</ Daten >
'------</ FastFind: if 1-Folder >--------
 
'------< @Loop: Folder Left to Right >--------
'*If not Area /Area and not unique-Folder like /Area/Unique_123
'*From here: Is Folder loop from Folder left to right
IDFolder = clsPath.get_IDFolder_by_Path(sPath)
IDArea = clsPath.get_IDArea_by_IDFolder(IDFolder)
 
'------</ @Loop: Folder Left to Right >--------
Server.Transfer("~/Default.aspx?a=" & IDArea & "&f=" & IDFolder, True)
'--------</ Redirect if URL_Userfriendly >------

 
 
 
Mobile

.

123movies