2011-09-23 67 views
0

我使用asp.net 4,c#和路由爲我的網站。路由 - 解釋爲404頁

我的路線導致像

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

58mytitle代表IdTitle列在數據庫中我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或標題不不代表任何記錄在我的數據源中。

PS:我注意到,SO網站有類似的行爲,除了他們能夠重定向到404頁面,如果問題的ID不匹配。

我的問題:

  • 這是一種正常的行爲?
  • 如何重定向到404頁而不是?
  • 如果不可能使用404頁將使用canonical urls

我問,因爲我就在這種情況下,讓我們錯誤地假設一個網站鏈接到我的網站像

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

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

都將是我的索引搜索引擎和導致重複的內容(這是不好的)。

如果可能請給我一個代碼示例。感謝您對此的評論,謝謝!

回答

1

出現這種情況的原因是因爲它使用的數值id作爲搜索關鍵字(在這種情況下,無論如何,它都會查找58後)。

你可以做什麼要麼

  • 擺脫數字ID,並只用文字或
  • 堅持取回後,並驗證了「postslug」是正確的基礎上你從拉出數據庫。

通過使用只是文本,你會得到一個更乾淨的網址。但是,您必須依賴數據庫索引您的字符串,才能在postlug上進行高性能查找。你必須擔心重複的slu。。

通過使用混合,你有不太乾淨的URL(額外的信息),但你不必擔心整數查找性能太多。

你選擇哪一個不斷選擇,你在你的控制器驗證此信息,然後要麼返回查看,或返回HttpNotFound()

+0

抱歉,「postslug」是什麼意思? – GibboK

+0

「Slug」是給你的網址中的字符串(文章/文章等的文本標識符)的術語 –

+0

感謝您的命中:-) – GibboK

0

而不是傳遞ID和標題,我會建議保存標題作爲數據庫中的一個獨特的價值,所以你可以只具有:

http://mysite.com/article/title

如果有兩個會發生什麼冠軍?那麼,你可以創建一個循環,直到你找到一個獨特的一個是在結束遞增像一個整數

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

這都繞其是可能的URL的〜無限數量的問題這一切都指向同一個頁面(其中谷歌會恨你)


或者,如果你想保持你的URL既到位ID和標題,然後在您的網頁形式運行的if語句,其返回我有多少條記錄數據庫匹配變量。

喜歡的東西:

cmd.CommandText = "SELECT COUNT(*) FROM Table WHERE [email protected] AND [email protected]" 

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

感謝您的評論,我就約性能。在你的第一個建議中,ID是數據庫中的主鍵,我想找到標題應該更加昂貴。第二個是一個有趣的方法,但我需要在每個頁面請求上運行SQL,以便再次過熱...任何其他想法或解決方案?感謝您的時間! – GibboK