MVC實現偽靜態

2022-02-09 01:12:47 字數 3415 閱讀 1176

1.什麼是偽靜態?為什麼要實現偽靜態?

偽靜態:動態網頁通過重寫url的方法實現去掉動態網頁的引數,但在實際的網頁目錄中並沒有必要實現存在重寫的頁面。

例如:我們當訪問位址http://*/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)為需要偽靜態的方法新增特性路由

筆者是news action需要實現偽靜態。

[route("

~/news")]

[route(

"~/news/.html

")]

(3) 在web.config中,為*.html路徑配置處理程式。

在這裡筆者需要給大家科普一下,網上有很多帖子都是直接在web.config配置節中新增這樣一句配置**。在前面asp.net mvc5 偽靜態 webform中作者也是這麼做的,但是我們是不推薦使用這種方式。因為它有較大的效能損失。

我會在本文解釋一下原因,想深入**的朋友可以參考:link

大家可以看上圖,這是iis 7.0的處理機制,大家可以看到executehandler這個部分,預設情況下的話是通過這樣乙個機制來處理,如果我們使用這個配置項,那麼不管是cgi、靜態檔案都是通過isapi也就是我們的asp.net程式來執行,一些js檔案、css檔案或者都會走我們的asp.net程式,那麼將會造成很多效能損失,這是我所在乎的乙個原因,當然還有關於iis身份驗證等問題。有興趣的朋友可以參考這篇文章:link

所以基於上面這樣一些原因,我們使用單獨配置只對*.html進行配置,那麼其它靜態檔案都是走iis 7.0預設處理程式,只有需要達到偽靜態的.html才進入asp.net進行處理。以下是配置節。

"

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

" />

"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

" />

"(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

" />

大家可以發現我分別新增了static64、static32、(static) extensionlessurlhandler-integrated-4.0三個配置,其中主要的功能就是將*.html為後戳的請求交給aspnet_isapi進行處理。關於該配置節的具體資訊,大家可以參考msdn

(4) 驗證

已經可以正常訪問,通過我們的偽靜態請求,完成了專案需求。

mvc做專案的過程中不是所有的請求都是對映到controller的action,有時候我們也需要提供,css,js,html這些靜態檔案。當我們的web伺服器接收到乙個mvc的路由url的時,預設是會檢查對應的資源檔案在是否在硬碟中存在,如果存在就直接返回,不會走去路由表中找,也就不會走路由流程。現在做**越來越重視seo了,雖然mvc頁面的路由的ulr比原來的.aspx對seo好,但是.html對seo是最好的。所以很多人還是會採用mvc的偽靜態。

用mvc的偽靜態url寫成xx.html的下形式更利於seo,一般有兩種方法:

1、registerroutes中加入

routes.routeexistingfiles = true;
2、繼承routebase類自定義乙個customroute類,重寫getroutedata方法,最後在registerroutes中加入下面**:

routes.add(new customroute(dicpattern));
最近遇到乙個問題,我們要放乙個資料夾,裡面放一些靜態html檔案。我們輸入html的全路徑「/subject/index.html」這樣的url時會直接返回index.htm的內容。但是如果輸入是「/subject/」這樣的url就不會返回index.html的,即使我們在iis中將index.html配置了預設的起始頁面。

解決辦法:

在global中的registerroutes方法中加入下面**:

routes.ignoreroute("

subject/*

");

表示,路由忽略subject目錄下面的所有的檔案,這樣設定的index.html為預設頁面有可以了。最後輸入「/subject」和「/subject/」都可以返回index.html了。

**於

mvc實現偽靜態

也不知道我寫的算不算的偽靜態,反正是可以更改url的字尾名 新手,見諒 首先新增乙個testroute類 然後在我們的global檔案裡定義我們自己的路由規則 protected void public static void registerroutes routecollection route...

mvc 路由偽靜態實現

很多 都採用偽靜態,例如以html shtml等結尾的url,mvc的路由可以輕鬆實現。mvc的路由原理是從上往下匹配的,所以只需要在後面新增自己配置的路由即可 public static void registerroutes routecollection routes axd routes.m...

mvc 路由偽靜態實現

很多 都採用偽靜態,例如以html shtml等結尾的url,mvc的路由可以輕鬆實現。mvc的路由原理是從上往下匹配的,所以只需要在後面新增自己配置的路由即可 public static void registerroutes routecollection routes axd routes.m...