StackOverflow как URL-маршрутизация - PullRequest
11 голосов
/ 09 июня 2011

Насколько я понимаю, вопросы в StackOverflow имеют следующий формат

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

Таким образом, в основном вопрос извлекается с использованием идентификатора вопроса.поэтому любое значение, которое я даю слагу, нематериально.

Сначала я хотел бы знать, неверно ли это понимание:)

У меня есть URL

/8104019/preobrazovanie-vhodnoi-stroki-v-chistye-chitaemye-i-priemlemye-dlya-brauzera-dannye-marshruta

Затем яизменил слизняк вручную следующим образом.

/8104019/preobrazovanie-vhodnoi-stroki-v-chistye-chitaemye-i-priemlemye-dlya-brauzera-dannye-marshruta

Но он изменился на исходный слаг.Firebug показал мне постоянный редирект 301 на измененном URL.Как реализовать этот функционал?

Ответы [ 3 ]

8 голосов
/ 09 июня 2011

Вы можете сделать это с Response.RedirectPermanent, доступным начиная с ASP.NET 4.0:

http://msdn.microsoft.com/en-us/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);
        }
    }
}

С другой стороны, хотелось бы подумать, что переполнение стека не сохраняет слаг в базе данных. Он создается динамически из заголовка , используя что-то вроде этого . Я просто изменил название своего вопроса, и пули изменились. Хранить слаг в базе данных будет необязательно, поскольку он избыточен для заголовка.

5 голосов
/ 09 июня 2011

Это делается с помощью 301 перенаправления на предпочтительный канонический URL .Сценарий проверяет запрошенный URL-адрес, чтобы определить, соответствует ли URL-адрес «предпочтительной» версии URL-адреса.Если нет, он отправляет 301 редирект в браузер и сообщает, что страница навсегда переместилась в это место.

Причины этого довольно очевидны: без этого вы можете создать тысячи URL-адресов, таких как /8104019/preobrazovanie-vhodnoi-stroki-v-chistye-chitaemye-i-priemlemye-dlya-brauzera-dannye-marshruta, /8104019/preobrazovanie-vhodnoi-stroki-v-chistye-chitaemye-i-priemlemye-dlya-brauzera-dannye-marshruta, /8104019/preobrazovanie-vhodnoi-stroki-v-chistye-chitaemye-i-priemlemye-dlya-brauzera-dannye-marshruta;все указывает на один и тот же контент.Поисковые системы будут наказывать вас за дублирование контента.

Редактировать

В приложении ASP.Net вы можете сравнить слаг, предоставленный браузером, с слагом, хранящимся в базе данных.Если они не совпадают, отправьте 301 редирект.Вы, вероятно, не можете сделать это через web.config или что-то еще, так как база данных вовлечена.Вот пример кода, который я опубликовал в своем блоге некоторое время назад (не уверен, будет ли он работать):

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

Я предполагаю, что вы уже реализовали некоторую форму перезаписи URL, которая генерирует любой запрос на /\d+/.+ на страницу asp.net.

1 голос
/ 09 июня 2011

Можно использовать Перезапись URL-адреса IIS или Маршрутизация ASP.NET

Проверьте эту статью для подробного сравнения: http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/

...