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.
Ответ 3
Вы можете использовать переписывание URL-адресов IIS или Маршрутизация ASP.NET
Проверьте эту статью для подробного сравнения:
http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/