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。


    這個時候再去請求不存在的路徑。

 

 

請求錯誤路徑

404狀態

 

 


完美解決!
 
Demo下載地址: 點擊進入

  出自:不落閣(博主個人網站)

  地址:www.leo96.com

  轉載請注明出處!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM