StackOverflow как URL-маршрутизация

Его понимание того, что вопросы в StackOverflow имеют следующий формат

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

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

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

У меня есть URL

http://stackoverflow.com/info/6291678/convert-input-string-to-a-clean-readable-and-browser-acceptable-route-data

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

http://stackoverflow.com/info/6291678/naveen

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

Ответ 1

Вы можете сделать это с помощью 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);
        }
    }
}

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

Ответ 2

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

Причины для этого достаточно очевидны: без этого вы можете построить тысячи URL-адресов, таких как http://stackoverflow.com/questions/6291678/foo, http://stackoverflow.com/questions/6291678/bar, http://stackoverflow.com/questions/6291678/blah; все указывающие на то же содержимое. Поисковые системы будут наказывать вас за дублированный контент.

Изменить

В вашем приложении 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.