Я уверен, что stackoverflow.com создается с помощью ASP.NET, но независимо от того, где я нажимаю, я не вижу расширения .aspx в адресной строке. Как это делается и есть ли конкретная причина для этого?
Как сайты .NET скрывают расширение .aspx своих файлов?
Ответ 1
В случае stackoverflow они используют ASP.NET MVC, а не веб-формы ASP.NET. С веб-формами url указывает на файл на вашем диске, а MVC указывает на действие контроллера. Если вы используете веб-формы, вы хотите использовать переписывание URL-адресов. У Скотта Гатри есть хорошая статья о том, как переписывать URL.
Ответ 2
Этот сайт использует структуру MVC ASP.NET и карту Urls для маршрутизации не физических страниц. Маршрут переходит к контроллеру, который затем решает, как отображать страницу.
Ответ 3
Скорее всего, это сделано путем перезаписи URL-адресов...
Веб-сервер берет URL-адреса, подобные тем, которые находятся в адресной строке вашего браузера, и перенаправляет их на страницы ASPX за кулисами
Это можно сделать в .NET HTTP-модуле или в качестве обработчика ISAPI в IIS
У Скотта Гутье есть хорошая статья на его сайте о перезаписи URL-адресов
http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx
Ответ 4
Как и другие люди, StackOverflow построен с использованием ASP.NET MVC, а ASP.NET MVC использует System.Web.Routing. Однако System.Web.Routing не является частью ASP.NET MVC, это был RTMd с пакетом обновления 1 (SP1) и означает, что можно использовать его без ASP.NET MVC. Вы можете увидеть, как использовать его с WebForms здесь: http://haacked.com/archive/2008/03/11/using-routing-with-webforms.aspx и здесь: http://www.codeplex.com/ASPNET35Routing
Ответ 5
которую вы можете достичь, изменив файл web.config.
<configuration>
<system.webserver>
<rewrite>
<rules>
<rule name="RemoveASPX" enabled="true" stopProcessing="true">
<match url="(.*)\.aspx" />
<action type="Redirect" url="{R:1}" />
</rule>
<rule name="AddASPX" enabled="true">
<match url=".*" negate="false" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
<add input="{URL}" pattern="(.*)\.(.*)" negate="true" />
</conditions>
<action type="Rewrite" url="{R:0}.aspx" />
</rule>
</rules>
</rewrite>
</system.webserver>
</configuration>
Ответ 6
Вы можете сделать это и многое другое с помощью перезаписи ISAPI (для IIS). Он позволяет создавать дружественные URL-адреса без всех уродливых строк запросов. Это дает пользователям более дружественный интерфейс и может сделать ваш контент более доступным для поиска.
Если вы используете Apache, используйте mod_rewrite.
Основная предпосылка заключается в том, что они используют дружественный URL-адрес (например, тот, который вы видите для этого сайта), затем они преобразуют его, используя ряд правил (обычно это регулярные выражения, которые вы указываете), на внутренние URL-адреса или строки запросов, которые легко понимаемый кодом.
Примером может быть то, что они преобразуют posts/edit/<postnumber>
в editPost.aspx?postNumber=<postnumber>
с помощью правила преобразования.
Ответ 7
Код ниже работает отлично, если страницы .aspx,.ashx находятся в папке приложения. Приоритет - сначала разрешить страницу .aspx, а затем .ashx.
Например, если вы попробуете localhost/AppFolder/Time, он попытается решить localhost/AppFolder/Time.aspx, а если не найден, то localhost/AppFolder/Time.ashx.
P.S.
-
Я не полностью тестировал этот код, поэтому будьте осторожны.
-
Он не рассматривает папки, которые могут иметь файлы .aspx, поэтому, если вы попытаетесь получить доступ к/PhysicalApplicationPath/MYFOLDER/странице, то это не решит /PhysicalApplicationPath/MYFOLDER/page.aspx.
код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;
namespace NameSpace
{
public class Global : System.Web.HttpApplication
{
private void mapearUrlAmigaveis()
{
String url = Request.Path.ToString().ToLower();
int positionQuestionMarkParameter = url.IndexOf('?');
String urlSemParametros = (positionQuestionMarkParameter != -1) ? url.Substring(0, (positionQuestionMarkParameter - 1)) : url;
String[] splitBarra = urlSemParametros.Split('/');
int indexOfUltimaBarra = urlSemParametros.LastIndexOf('/');
if (splitBarra.Length > 0)
{
String ultimaBarra = splitBarra[(splitBarra.Length - 1)];
String caminhoLocalUltimaBarra = Request.PhysicalApplicationPath + ultimaBarra;
String parametros = ((positionQuestionMarkParameter != -1) ? url.Substring((positionQuestionMarkParameter - 1), (url.Length - 1)) : String.Empty);
if (System.IO.File.Exists(caminhoLocalUltimaBarra + ".aspx"))
{
Context.RewritePath(urlSemParametros + ".aspx" + parametros);
}
else if (System.IO.File.Exists(caminhoLocalUltimaBarra + ".ashx"))
{
Context.RewritePath(urlSemParametros + ".ashx" + parametros);
}
}
}
}
}
Ответ 8
Вы можете сделать это в С#.NET, чтобы использовать настроенное расширение в своем URL-адресе в ASP.NET.
Пусть ".recon" в коде будет вашим настроенным расширением. (замените ".recon" на собственное расширение)
protected void Application_BeginRequest(object sender, EventArgs e)
{
HttpApplication app = sender as HttpApplication;
if (app.Request.Path.ToLower().IndexOf(".recon") > 0)
{
string rawpath = app.Request.Path;
string path = rawpath.Substring(0, rawpath.IndexOf(".recon"));
app.Context.RewritePath(path+".aspx");
}
}
Ответ 9
и по причине:
- вы можете изменить технологию (скажем, на PHP) без индексированных или заблокированных URL-адресов.
- ваши URL-адреса более "REST'ful" и соответствуют ресурсам, а не только файлу
- вы можете запомнить URL-адрес или прочитать его кому-то по телефону более легко.