Wie bekommt saubere URLs wie Stack-Überlauf?
-
10-07-2019 - |
Frage
Bei einigen .NET angetrieben Websites URLs mit asp.net Seitennamen nicht, wie default.aspx enden, sondern sie verwenden ein Muster http://sitename.com oder http://sitename.com/subdirectory/subdirectory. Die Website wird als Unterverzeichnisse von der Wurzel abgebildet, dh. / Tags, / Benutzer / Abzeichen, würden die URLs sein / Tags / Benutzer / Abzeichen sind.
Stack-Überlauf, das ein spezielles Beispiel zu verwenden, verwendet Frage URLs der Form Wie bekommt saubere URLs wie Stackoverflow? . Welches ist ideal, um die Seite für Suchmaschinen zu optimieren.
Ist das HTTP-Handler implementiert? Filtriert die GET-Anfrage basierend auf dem Weg und die ganze Antwort wird in dem Handler selbst auf der Grundlage der Frage id gebildet? Sonst noch jemand darauf zu spekulieren?
Lösung
Es ist ASP.Net MVC, die das .NET-Routing mehr oder weniger hat eingebaut. Das Routing für nicht MVC-Projekte zur Verfügung als auch, obwohl
http://msdn.microsoft.com/en-us/library/ cc668201.aspx
Es ist nur ein DLL Sie in Ihrem Ordner ist fallen können. Grundsätzlich verwendet es reguläre Ausdrücke Ihre URLs auf Seiten / Vorlagen entsprechen.
Andere Tipps
Dies wird erreicht mit mod_rewrite in Apache oder ähnlichen Methoden url_rewriting auf IIS .
. Hinweis: SOFlow verwendet das letztere
Die URLs sind in diesem Format folgenden REST Prinzipien , in dem alles ist eine Ressource mit einem eindeutige URL.
Ich glaube, ich irgendwo im Blog gelesen, dass dies durch die Verwendung erreicht ASP.NET MVC-Framework .
Ich weiß, dass Stack-Überlauf des ASP.NET MVC-Framework verwendet, die vermutlich eine URL Einbau-Überschreibungssystem hat. Für Nicht-Windows-System ist Apache mod_rewrite sehr verbreitet.
Zum Beispiel kann eine Wiki-Seite: http://server.com/wiki/Main_Page
Anfrage wird vom Webserver behandelt. Es übersetzt in /wiki/index.php?page=Main_Page
Hier ist ein Beispiel von URL in Apache Umschreiben:
RewriteEngine on
RewriteRule ^forum-([0-9]+)\.html$ forumdisplay.php?fid=$1 [L,QSA]
RewriteRule ^forum-([0-9]+)-page-([0-9]+)\.html$ forumdisplay.php?fid=$1&page=$2 [L,QSA]
RewriteRule ^thread-([0-9]+)\.html$ showthread.php?tid=$1 [L,QSA]
RewriteRule ^thread-([0-9]+)-page-([0-9]+)\.html$ showthread.php?tid=$1&page=$2 [L,QSA]
Was dies sagt, ist, wenn die URL, die in kommt, ist forum-##.html
dann Prozess, fordern, als ob es forumdisplay.php?fid=##
waren. Das gleiche gilt für die thread-##.html
Regeln.
Sie können es in ASP.net tun, indem Sie mit Context.RewritePath
.
Global.asax , erstellen Sie eine Application.BeginRequest Ereignishandler.
Zum Beispiel, wenn Sie wollen Anfragen machen
example.com/questions
Rückkehr tatsächlich die Ergebnisse von
example.com/Questions/Default.aspx
Global.asax :
<%@ Application Language="C#" %>
<script runat="server">
void Application_BeginRequest(Object sender, EventArgs e)
{
string originalPath = HttpContext.Current.Request.Path.ToLower();
if (originalPath.Contains("/questions"))
{
String newPath = originalPath.Replace("/questions", "/Questions/Questions.aspx");
Context.RewritePath(newPath);
}
}
</script>
Wenn Sie Ihre Web-Site ist alles läuft, bevor .NET Framework 4, werden Sie manuell auf dem runAllManagedModulesForAllRequests
drehen müssen in web.config , da sonst die Beginrequest Veranstaltung wird nicht gefeuert werden:
<configuration>
...
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
</configuration>