Маршрутизация - Объяснение для 404 страницы - PullRequest
0 голосов
/ 23 сентября 2011

Я использую asp.net 4, c # и Routing для своего веб-сайта.

Мой результат маршрута как

A) http://mysite.com/article/58/mytitle   (result my article all is fine)

58 и mytitle представляют в столбце Id и Title в базе данных для моей таблицы Articles.

Я замечаю, что ... если я прошу:

http://mysite.com/article/2000000000/mytitle (a not existing ID)

Я получаю страницу ошибки .

Если вместо этого я попытаюсь:

B) http://mysite.com/article/58/mytitttttttle (title misspelled)

Я все еще получаю свою страницу http://mysite.com/article/58/mytitle

Мне нужно, чтобы мой веб-сайт перенаправлялся на страницу 404, если ни ID, ни TITLE не представляют записи в моем источнике данных.

PS: я заметил, что веб-сайт SO ведет себя аналогично, за исключением того, что он может перенаправлять на страницу 404, если идентификатор вопроса не совпадает.

Мои вопросы:

  • это нормальное поведение?
  • как перенаправить на 404 страницы вместо?
  • , если невозможно использовать 404 страницы, можно использовать канонические ссылки ?

Я спросил, потому что я рассматриваю этот сценарий, давайте представим, что сайт неправильно ссылается на мой сайт, например

http://mysite.com/article/58/mytitttttttle (title misspelled)

или

http://mysite.com/article/58/mytitttttttle2222 (title misspelled)

оба будут индексировать мою поисковую систему, что приведет к дублированию контента (и это не хорошо).

Пожалуйста, предоставьте мне пример кода, если это возможно. Спасибо за ваш комментарий, спасибо!

Ответы [ 3 ]

1 голос
/ 23 сентября 2011

Привет, я недавно сделал это и использовал этот блог, который очень помог

http://weblogs.asp.net/paxer/archive/2010/05/31/asp-net-http-404-and-seo.aspx

http://searchengineland.com/url-rewriting-custom-error-pages-in-aspnet-20-12234

1 голос
/ 23 сентября 2011

Причина, по которой это происходит, заключается в том, что он использует числовой идентификатор в качестве ключа поиска (в данном случае он ищет сообщение 58 независимо от того, что).

То, что вы можете сделать, это либо

  • избавьтесь от числового идентификатора и придерживайтесь только текста ИЛИ
  • получить сообщение и убедиться, что "postslug" является правильным на основании того, что вы извлекли из базы данных.

Используя только текст, вы получите более чистый URL. Однако вы должны полагаться на свою базу данных, индексирующую ваши строки, чтобы иметь высокую производительность поиска на вашем постслуге. И вам нужно беспокоиться о дублирующих слизняках.

Используя гибрид, вы получаете менее чистый URL (дополнительная информация), но вам не нужно слишком беспокоиться о производительности целочисленного поиска.

Какой бы вариант вы ни выбрали, вы проверяете эту информацию в своем контроллере, затем либо возвращаете View, либо возвращаете HttpNotFound ()

0 голосов
/ 23 сентября 2011

Вместо того, чтобы передавать идентификатор и заголовок, я бы рекомендовал сохранить заголовок в качестве уникального значения в базе данных, чтобы вы могли просто иметь:

http://mysite.com/article/title

Что произойдет, если есть два названия?Ну, тогда вы можете создать цикл, пока не найдете уникальный, увеличивающий целое число в конце, например:

http://mysite.com/article/title-2

Это решает проблему ихявляясь ~ бесконечным числом возможных URL-адресов, все из которых указывают на одну и ту же страницу (за что Google вас ненавидит)


В качестве альтернативы, если вы хотите сохранить свой URL-адрес с указанным идентификатором и заголовком,затем в веб-форме запустите оператор if, который возвращает количество записей в базе данных, соответствующих переменным.

Что-то вроде:

cmd.CommandText = "SELECT COUNT(*) FROM Table WHERE ID=@ID AND Title=@Title"

if ((int)cmd.executescalar == 0){
   Response.Redirect("404.aspx");
}
...