使用HttpModule實現URL重寫
使用HttpModule實現URL重寫
Request.PathInfo技術的替換方法是,利用ASP.NET提供的HttpContext.RewritePath方法。這個方法允許開發人員動態地重寫收到的URL的處理路徑,然後讓ASP.NET使用剛重寫過後的路徑來繼續執行請求。
譬如,我們可以選擇向大眾呈示下列URL:
http://www.store.com/products/DVDs.aspx
http://www.store.com/products/CDs.aspx
在外界看來,網站上有三個單獨的網頁(對搜尋爬蟲而言,這看上去很棒)。通過使用 HttpContext的RewritePath方法,我們可以在這些請求剛進入伺服器時,動態地把收到的URL重寫成單個Products.aspx網頁接受一個查詢字串的類別名稱或者PathInfo引數。譬如,我們可以使用Global.asax中的Application_BeginRequest事件,來這麼做:
string fullOrigionalpath = Request.Url.ToString();
if (fullOrigionalpath.Contains("/Products/Books.aspx")) {
Context.RewritePath("/Products.aspx?Category=Books");
}
else if (fullOrigionalpath.Contains("/Products/DVDs.aspx")) {
Context.RewritePath("/Products.aspx?Category=DVDs");
}
}
手工編寫象上面這樣的編碼的壞處是,很枯燥乏味,而且容易犯錯。我建議你別自己寫,而是使用網上現成的HttpModule來完成這項工作。這有幾個你現在就可以下載和使用的免費的HttpModule:
這些模組允許你用宣告的方式在你應用的web.config檔案裡表達匹配規則。譬如,在你應用的web.config檔案裡使用UrlRewriter.Net模組來把上面的那些URL對映到單個Products.aspx頁上,我們只要把這個web.config檔案新增到我們的應用裡去就可以了(不用任何編碼):
<configuration>
<configSections>
<section name="rewriter"
requirePermission="false"
type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter" />
</configSections>
<system.web>
<httpModules>
<add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter"/>
</httpModules>
</system.web>
<rewriter>
<rewrite url="~/products/books.aspx" to="~/products.aspx?category=books" />
<rewrite url="~/products/CDs.aspx" to="~/products.aspx?category=CDs" />
<rewrite url="~/products/DVDs.aspx" to="~/products.aspx?category=DVDs" />
</rewriter>
</configuration>
上面的HttpModule URL重寫模組還支援正規表示式和URL模式匹配(以避免你在web.config 檔案裡硬寫每個URL)。所以,不用寫死類別名稱,你可以象下面這樣重寫匹配規則,把類別名稱動態地從任何/products/[類別].aspx組合的URL裡取出來:
<rewrite url="~/products/(.+).aspx" to="~/products.aspx?category=$1" />
</rewriter>
這使得你的編碼極其乾淨,並且擴充套件性非常之好。
樣例下載:我建立的一個使用UrlRewriter.Net模組展示這個技術的樣例應用可以在這裡下載。
這個樣例和這個技術的很好的地方在於,為部署使用這個方法的ASP.NET應用,不需作任何伺服器配置改動。在設定為中等信任安全等級(medium trust)的共享主機的環境裡,這個技術也行之有效 (只要把檔案FTP/XCOPY到遠端伺服器就可以了,不需要安裝)。
相關文章
- Nginx實現URL重寫Nginx
- PHP實現url重寫和.htaccessPHP
- 在struts2中實現去掉字尾及url重寫
- URL重寫(rewrite)的具體實現與異常問題解決
- nginx TP5 URL 重寫Nginx
- 【ASP.NET Core】URL重寫ASP.NET
- IIS SSL認證流程& url重寫
- Laravel重寫資源路由自定義URLLaravel路由
- Nginx URL重寫規則配置詳解Nginx
- 用RecyclerView 重寫LayoutManager實現BannerViewView
- ThinkPHP5.0 Linux Apache/Nginx重寫URL配置PHPLinuxApacheNginx
- 【iis】URL重寫可以引用原地址內容
- 應用Url重寫時CSS引用問題CSS
- Feign實現動態URL
- 手把手教你寫網路爬蟲(7):URL去重爬蟲
- IIS7.0設定 url重寫成html(偽靜態)HTML
- NodeJS 說說“重寫” 自定義stream 的實現NodeJS
- GitLab 實現動態 Environment URLGitlab
- 使用LangChain實現自動寫作LangChain
- js實現重寫new Date()相容IE6以上JS
- 給第三方使用介面的 URL 簽名實現
- sql改寫優化:簡單規則重組實現SQL優化
- 短址(short URL)原理及其實現
- js實現獲取URL引數JS
- 前端專案透過‘URL 重寫’部署在 IIS 中,訪問 WebAPI 介面前端WebAPI
- 使用url()後出現No input file specified.
- 使用 Rust 語言編寫 Java JNI 實現RustJava
- 使用Java和Spring Retry實現重試機制JavaSpring
- Angular 4.x HttpModule 揭祕AngularHTTP
- Laravel+vue實現history模式URL可行方案LaravelVue模式
- nginx實現網站url帶參跳轉Nginx網站
- [需求建議]希望OT實現URL別名
- 使用 Guava Retry 優雅的實現重試機制Guava
- 使用SpringBoot實現微服務超時重試模式 - VinsguruSpring Boot微服務模式
- 使用 Resilience4j 框架實現重試機制框架
- 使用react-hook 重寫 react-reduxReactHookRedux
- Spring Cloud Ribbon之URL重構(三)SpringCloud
- 從零開始寫 Docker(十四)---重構:實現容器間 rootfs 隔離Docker
- 【Spring】重構--手寫Spring核心邏輯(三)實現IOC/DI(context包)SpringContext