[TOC] 因項目需要,對於部分控制器需要實現偽靜態方便搜索引擎優化(SEO),過程比較曲折,簡單的記錄一下。 1.什麼是偽靜態?為什麼要實現偽靜態? 偽靜態:動態網頁通過重寫URL的方法實現去掉動態網頁的參數,但在實際的網頁目錄中並沒有必要實現存在重寫的頁面。 例如:我們當訪問地址http://w ...
目錄
因項目需要,對於部分控制器需要實現偽靜態方便搜索引擎優化(SEO),過程比較曲折,簡單的記錄一下。
1.什麼是偽靜態?為什麼要實現偽靜態?
偽靜態:動態網頁通過重寫URL的方法實現去掉動態網頁的參數,但在實際的網頁目錄中並沒有必要實現存在重寫的頁面。
例如:我們當訪問地址http://www.cnblogs.com/ForEvErNoME/archive/2012/06/05/2529259.html時,你會認為在站點伺服器下存在名為2529259.html文件,其實實際上它可能是不存在的,而可能你看到的內容是通過重定向/archive/article.aspx?year=2012&month=06&day=05&id=2529259顯示出來的。
為什麼要這樣做呢?
(1)增強URL的友好性,方便用戶記憶URL。
(2)提高搜索引擎抓取,很多搜索引擎更看好靜態HTML頁。
(3)加強安全性,因為隱藏了參數"year"、"month"、"day"、"id",使網站沒有那麼容易受到攻擊。
以上內容摘選自:ASP.NET偽靜態實現
2.實現APS.NET MVC偽靜態的方式有哪些?
- 通過實現介面IHttpHandler來接管HTTP請求,這裡需要使用URLRewriter這個擴展,大家可以在NuGet管理工具中下載。想通過這種方式大家可以參考這篇幾篇文章:ASP.NET偽靜態實現ASP.NET MVC4通過UrlRewriter配置偽靜態
- 通過配置預設路由的方式來實現偽靜態。這種是比較常用的方法之一,大家可以參考這篇文章:asp.net mvc5 偽靜態 WebForm
- 通過使用ASP.NET MVC5特性路由的方式,這就是本文使用的方式,為什麼筆者使用這種方式呢?是因為我們項目是一個老項目添加新功能,如果貿然全站偽靜態那麼很多寫好的代碼需要返工,如果項目中只有少數幾個控制器需要偽靜態那麼我也建議使用這種方式。
3.那麼如何實現使用ASP.NET MVC5的偽靜態呢?
同樣,分為幾個步驟。
(1)在路由註冊中啟用特性路由
如果大家不懂什麼是特性路由,可以參考這篇文章
就是在/App_Start/RouteConfig.cs中添加一行代碼.
routes.MapMvcAttributeRoutes();
(2)為需要偽靜態的方法添加特性路由
筆者是News Action需要實現偽靜態。
[Route("~/News")]
[Route("~/News/{page:int}.html")]
(3) 在Web.Config中,為*.html路徑配置處理程式。
在這裡筆者需要給大家科普一下,網上有很多帖子都是直接在Web.Config配置節中添加這樣一句配置代碼。在前面asp.net mvc5 偽靜態 WebForm中作者也是這麼做的,但是我們是不推薦使用這種方式。因為它有較大的性能損失。
我會在本文解釋一下原因,想深入探究的朋友可以參考:Link
<modules runAllManagedModulesForAllRequests="true" />
大家可以看下圖,這是IIS 7.0的處理機制,大家可以看到ExecuteHandler這個部分,預設情況下的話是通過這樣一個機制來處理,如果我們使用這個配置項,那麼不管是CGI、靜態文件都是通過ISAPI也就是我們的ASP.NET程式來執行,一些Js文件、css文件或者圖片都會走我們的ASP.NET程式,那麼將會造成很多性能損失,這是我所在乎的一個原因,當然還有關於IIS身份驗證等問題。有興趣的朋友可以參考這篇文章:Link
所以基於上面這樣一些原因,我們使用單獨配置只對*.html進行配置,那麼其它靜態文件都是走IIS 7.0預設處理程式,只有需要達到偽靜態的.html才進入ASP.NET進行處理。以下是配置節。
<system.webServer>
<handlers>
<add name="Static64" path="*.html" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="Static32" path="*.html" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="(Static) ExtensionlessUrlHandler-Integrated-4.0" path="*.html" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
大家可以發現我分別添加了Static64、Static32、(Static) ExtensionlessUrlHandler-Integrated-4.0三個配置,其中主要的功能就是將*.html為後戳的請求交給aspnet_isapi進行處理。關於該配置節的具體信息,大家可以參考MSDN
(4) 驗證
已經可以正常訪問,通過我們的偽靜態請求,完成了項目需求。
筆者水平有限,如果錯誤歡迎大家批評指正!
參考文檔
https://www.cnblogs.com/ForEvErNoME/archive/2012/06/14/2549313.html
https://www.cnblogs.com/ForEvErNoME/archive/2012/06/14/2549313.html
http://blog.csdn.net/just_shunjian/article/details/51132866
https://www.cnblogs.com/zengpeng/p/5899885.html
https://www.cnblogs.com/zengpeng/p/5899885.html
https://www.cnblogs.com/xishuai/archive/2015/01/06/Styles-Render-runAllManagedModulesForAllRequests-true.html
http://blog.csdn.net/shandian84/article/details/40903663
https://msdn.microsoft.com/zh-cn/library/bb763179%28v=vs.100%29.aspx