本篇文章主要介紹了ASP.NET MVC製作404跳轉執行個體(非302和200) ,具有一定的參考價值,感興趣的小夥伴們可以參考一下
產生404的原因主要有以下:
1.瀏覽器和爬蟲:某些瀏覽器會請求網站的favicon.ico,而如果你的網站根目錄下沒有這個檔案,那麼瀏覽器會有一條404的log,同樣搜尋引擎會請求robots.txt。但這個影響不大。
2.使用者輸入了錯誤URL:某些使用者不小心在瀏覽器地址欄加了一個字元或者刪除了一個字元,導致伺服器找不到請求的路徑。
3.某些網站引用的地址過老:某個頁面已經被刪除,而其他網站依然引用,他人點擊的時候伺服器找不到請求的路徑。
404與SEO:
本網站由於經過改版,所以有很多失效的連結,而我也提交了死鏈給百度,但過了半個月也不見百度刪除那些失效的連結。後來我用站長工具查詢那些連結的HTTP狀態,發現竟然返回的是302,這就難怪了。
為了給方便使用的體驗,我製作了404頁面,並且在Application_Error中捕獲404,然後Response.Redicet()到404頁面。那時候因為不懂SEO,以為這就算做了404頁面。結果發現,這樣是做了一個302跳轉,這樣404的狀態代碼就變成了302,而搜尋引擎Spider請求的時候,返回的是302的話,它就會認為你這個網頁是正常的!導致網站的失效連結一直不被搜尋引擎刪除,久而久之,網站的死鏈過得,就會得到搜尋引擎的懲罰。所以,正確的404跳轉應該是返回友好頁面給使用者的同時,返回404的HTTP狀態代碼給Spider。
ASP.NET中404跳轉的解決方案:
上一篇講了ASP.NET中自訂錯誤頁的三種方法,這裡就不多說了!
使用的是第三種httpErrors也就是IIS錯誤頁,原因如下:
Application_Error:好像比較難做到404跳轉的同時又返回404狀態代碼,一般會返回302;
customErrors:博主嘗試使用的時候,失敗了,學藝不精啊,哎;
httpErrors:博主嘗試使用的時候,碰巧解決了,所以就是它了;
下面就來講具體如何操作!
IIS錯誤頁的使用又分三種情況:
1.返回靜態檔案 2.返回動態網頁面 3.302重新導向。
其中3直接忽略。
1.返回靜態檔案
使用此方法,需要準備一個靜態html頁面,然後放在硬碟裡,指定路徑的時候須給出絕對路徑。
web.config中的寫法
<system.webServer> <httpErrors errorMode="Custom" existingResponse="Replace"> <remove statusCode="404" subStatusCode="-1" /> <error statusCode="404" prefixLanguageFilePath="" path="D:\ErrorPage\404.html" responseMode="File" /> </httpErrors></system.webServer>
prefixLanguageFilePath表示用戶端語言的檔案目錄,path表示檔案相對於用戶端語言目錄的路徑,responseMode表示響應類型,這裡是File(檔案)
IIS中的操作
兩者選其一即可
由於博主嘗試使用檔案的時候以失敗告終,所以這裡不多說,說多了都是淚!
2.返回動態網頁面
web.config中的寫法
</system.webServer> <httpErrors errorMode="Custom" existingResponse="Replace"> <remove statusCode="404" subStatusCode="-1" /> <error statusCode="404" prefixLanguageFilePath="" path="/ErrorPage/NotFound" responseMode="ExecuteURL" /> </httpErrors></system.webServer>
與上面不同的就是responseMode="ExecuteURL"。
IIS中的操作
兩者選其一即可
博主最後選擇的這種方法,但是這種方法有幾個坑需要注意!
1.不能指定網站相對目錄下的靜態HTML檔案,比如404.html。
2.指定的動態網頁面cshtm、aspx等,需指定響應碼為404。
以上兩種情況如果不注意,那麼你的404返回的響應碼不是404也不是302而是200。
因為這種方法是返回網站根目錄下的一個網頁來作為404頁面,而靜態頁面只要能訪問到,那肯定就是200了。動態cshtml或者aspx如果沒指定響應碼,那麼返回200也不奇怪。
所以說具體做法如下(以ASP.NET MVC為例):
public class ErrorPageController : Controller{ public ActionResult NotFound() { Response.Status = "404 Not Found"; Response.StatusCode = 404; return View(); }}
建一個控制器ErrorPage,裡面可以定義各種錯誤頁面,這裡只是404頁面。
然後建一個NotFound視圖,把404頁面寫漂亮一點。
OVER。
這個時候再去請求不存在的路徑。
完美解決!