某系統改版後,舊版的系統的訪問鏈接已經無效,但有一些路徑已經被搜索引擎收錄,所以當用舊的鏈接訪問系統時會出現404頁面。
用戶在用舊鏈接訪問時如果出現404頁面則將頁面跳轉到首頁,實現這個需求有多種方式,當時考慮了兩種方案:
一、在nginx上配置404頁面跳轉。由於修改nginx配置需要聯繫運維幫忙,所以考慮在tomcat裏進行實現。(tomcat我們有權限操作)
nginx配置404跳轉參考:http://www.cnblogs.com/jiangyao/archive/2010/07/10/1774981.html
二、在tomcat裏實現,實現方式如下:
1)修改對應項目的WEB-INF/web.xml文件,在web.xml中加入如下代碼
<error-page>
<error-code>404</error-code>
<location>404Redirect.html</location>
</error-page>
2)在404Redirect.html中寫入如下代碼
<html>
<head>
<meta http-equiv="refresh" content="0; url=/"/>
</head>
</html>
開始測試,chrome和firefox均符合期望,IE10上測試依然還是404頁面。後來發現IE中有一項設置可以阻止refresh跳轉。
所以將404Redirect.html修改爲通過js跳轉,如下
<html>
<head>
<script type="text/javascript">
window.location.href = "/";
</script>
</head>
</html>
經測試,IE10上依然不行,還是404頁面。但通過調試,發現響應正文部分確實是我的代碼,卻沒有顯示。
後來通過在google發現IE瀏覽器在返回狀態爲404的時候,如果頁面內容長度小於512bytes,它會用瀏覽器自己的錯誤頁面代替我設置的404Redirect.html。
好吧,用一個最愚蠢的辦法騙過最聰明的IE吧,修改後的404Redirect.html代碼如下
<html>
<head>
<script type="text/javascript">
window.location.href = "/";
</script>
</head>
<body style="display:none">
body中的內容對用戶沒有任何實際意義,它存在的唯一目的就是讓響應內容長度大於512bytes,
以此騙過“聰明”的IE。
IE瀏覽器在返回狀態爲404的時候,如果頁面內容長度小於512bytes,它會用瀏覽器自己的默認錯誤頁面代替響應頁面的內容。
</body>
</html>
再次進行測試,chrome、firfox、IE均OK。