国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

淺析ASP.NET MVC中關于URL Rewrite的實現

開發 后端
我們這里將介紹在ASP.NET MVC中使用IIS級別的URL Rewrite,希望本文能對大家有所幫助。

本文將為大家講述如何在ASP.NET MVC中使用IIS級別的URL Rewrite,這種方法雖然用的不是很廣泛,但也有其作用,51CTO編輯向您推薦《ASP.NET MVC框架視頻教程》。

大約一年半前,我在博客上寫過一系列關于URL Rewrite的文章(2、3、4),把ASP.NET平臺上進行URL Rewrit的方式和各自地特點進行了較為詳細的描述。應該來說,已經講的非常具體,可以應對90%的情況。其實IIS Rewrite的原理非常容易理解,進行一些簡單的變化和推斷之后,便可以得出一些問題的原因和解決方案。現在我們就來看一個真實案例:在ASP.NET MVC中使用IIS級別的URL Rewrite。

在當時的文章中我談到,URL Rewrite分有IIS級別和ASP.NET兩種級別,并且各有各的特點和限制。在ASP.NET MVC中我們常用的方式是ASP.NET級別的URL Routing,它的作用是從URL中捕獲數據并交給程序使用(當然還有“構造”的功能,稍候再談)。因此,在ASP.NET MVC中我們往往不需要使用ASP.NET級別的URL Rewrite。而如今使用IIS級別的URL Rewrite,也正是因為有某些特殊問題無法回避才“不得已而為之”的。

以下涉及到的URL都以http://51programming.com為例,這個域名已經被我泛解析為127.0.0.1,如果您需要的話可以用它來做實驗。

在許多年前,一個URL的Path就是普通的路徑,而動態的參數,如查詢路徑,是通過Query String提供的,例如:

http://51programming.com/products?keywords=helloworld為了避免混淆,在這里我們先來澄清一些概念。什么是URL,什么是Path,而什么是QueryString。例如在上面的地址,這三者分別是:

  1. URL:http://51programming.com/products?keywords=helloworld   
  2. Path:http://51programming.com/products   
  3. Query String:keywords=helloworld 

后來SEO興起之后,有人說這樣的“動態地址”不利于搜索引擎中的權重優化,因此建議把關鍵字作為Path的一部分。于是就出現了這樣的URL:

http://51programming.com/products/helloworld這么看來問題并不大,但是您要知道,關鍵字往往是由用戶輸入的,可能會輸入特殊字符。例如,如果用戶輸入了“200%”作為關鍵字,則兩種形式下的URL就分別是:

http://51programming.com/products?keywords=200%25
http://51programming.com/products/200%25如果您嘗試一下便可以知道,***個URL可以正常訪問,而第二個URL便會引發Bad Request異常:

錯誤頁面

這是因為URL的Path部分出現了特殊字符,而這種字符只能出現在Query String中。

看到這個畫面,您還意識到了什么信息?在定位問題的原因,以及設法解決問題的時候,首先要明確的是到底是哪里出現了問題。例如看到這個畫面,您應該清楚地意識到一點:這是ASP.NET拋出的異常,換句話說,IIS并沒有把它當作是非法的URL,它還是老老實實地將URL交給ASP.NET ISAPI處理。因此,我們便可以動用IIS級別的URL Rewrite,在進入ASP.NET執行引擎之前,就把URL替換成可接受的形式:

RewriteRule  ^/products/([^\?]*)\?(.+)    /products?$2&keywords=$1     [I,L,U]

RewriteRule  ^/products/([^\?]*)          /products?keywords=$1     [I,L,U]***行應對的是帶有Query String的情況,而第二行則是沒有Query String的情況。這里用到的組件是IIRF(Ionic's Isapi Rewrite Filter),這是一款開源產品,一年半前的文章里我推薦的也是這個,現在它已經有了升級。它的功能便是在進入ASP.NET ISAPI之前,就將URL重寫為其他形式:

流程圖

原本在第3步會出現的Bad Request,由于已經在第2步被URL Rewrite成合法的形式。因此剩余的處理也就沒有任何問題了。

這些內容在一年半前的文章內已經提過,不過現在既然有了ASP.NET MVC,則事情又變得更為復雜。因為ASP.NET Routing除了“匹配”URL的功能之外,還擔負著“組裝”URL的職責。因此,讓ASP.NET Routing能夠識別出Rewrite后的URL不難,但是如何同時讓它又可以“組裝”出Rewrite前的URL,這就需要一些小技巧了。例如以下的Route配置只能識別出URL輸入(/products?keywords=xxx)但不能組裝出我們需要的URL(/products/xxx):

  1. routes.MapRoute(  
  2.     "Product.List",  
  3.     "products",  
  4.     new { controller = "Product", action = "List" }); 

因此,我們必須這么做:

  1. routes.MapRoute(  
  2.     "Product.List",  
  3.     "products/{*keywords}",  
  4.     new { controller = "Product"action = "List"keywords = "" }); 

請注意我們讓keywords匹配Path后端全部內容,而由于我們又提供了keywords的默認值,因此即使是“/products”這樣的Path輸入,也能正確匹配到這條Route規則——只不過此時的Route Value中的keywords字段已經不是用戶輸入的內容了(因為用戶輸入的/products/xxx,已經被重寫為/products?keywords=xxx)。換句話說,如果有如下的Action,那么它的keywords參數則永遠是空字符串:

public ActionResult List(string keywords) { ... }幸好,ASP.NET MVC中存在Model Binder機制,我們可以編寫一個Model Binder來指定這個參數的獲取位置:

  1. public class FromQueryBinder : IModelBinder  
  2. {  
  3.     public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)  
  4.     {  
  5.         return controllerContext.HttpContext.Request.QueryString[bindingContext.ModelName];  
  6.     }  

再將其運用到List的keywords參數上去:

  1. public ActionResult List(  
  2.     [ModelBinder(typeof(FromQueryBinder))]string keywords) 

由于參數名是keywords,因此bindingContext.ModelName也是keywords,于是從Query String中便可以取到我們需要的內容了。至于在進行URL生成的時候,我們還是可以之間一樣添加一個keywords字段到Route Value中去,于是在我們先前配置的Route規則中便會組裝成合適的Path了(即/products/xxx)。

在這個例子中,我們讓keywords匹配Path后端全部內容,但是如果是Path中間某一段需要有特殊字符怎么辦呢?其實也一樣,只是在進行URL Rewrite的時候,需要在最終重寫的時候填寫一個“假”的值就可以了,如這樣的Route規則:

  1. routes.MapRoute(  
  2.     "Product.List",  
  3.     "products/{keywords}/page",  
  4.     new { controller = "Product", action = "List" }); 

而IIS級別的URL Rewrite重寫的規則就可以是:

RewriteRule  ^/products/([^/]*)/(.*)     /products/useless-segement/$2?keywords=$1     [I,L,U]這樣,如果用戶輸入/products/xxx/2就會被重寫成/products/useless-token/2?keywords=xxx——事實上,在***個示例中我們也可以這么做,只是我“不習慣”增加一個偽造的值而已。

以上解決方案可以在IIS 6與IIS 7的Classic Mode中正常使用,只可惜在IIS 7的Intergrated Mode中,可能是由于ASP.NET接管了IIS的部分邏輯,因此會很早拋出“IIS級別”,而不是“ASP.NET級別”的Bad Request異常。如果您遇到了這種方式,就必須通過以下三個步驟來擺脫這個麻煩的問題了:

設置AllowRestrictedChars:KB820129(讓IIS 7接受特殊字符)

設置VerificationCompatibility:KB826437中除了“安裝.NET 1.1 SP1”以外的步驟(讓ASP.NET接受特殊字符)

將ASP.NET頁面的ValidateRequest設為False

其實您只要經過了這三步修改,對于目前這個案例,即使不用IIS級別的URL Rewrite應該也沒有問題了。

本文來自趙劼博客園文章《在ASP.NET MVC中使用IIS級別的URL Rewrite

【編輯推薦】

  1. 詳解ASP.NET MVC分頁的實現方法
  2. ASP.NET MVC與WebForm區別談
  3. ASP.NET MVC應用程序執行過程分析
  4. ASP.NET MVC分頁控件的實現
  5. 有關ASP.NET MVC框架的一些基礎知識
責任編輯:彭凡 來源: 博客園
相關推薦

2009-07-22 14:23:39

URL RewriteASP.NET

2009-01-04 13:27:10

URL RewriteIISASP.NET

2009-07-31 12:43:59

ASP.NET MVC

2009-07-27 17:15:51

URL RewriteASP.NET

2009-07-23 14:31:20

ASP.NET MVC

2009-08-05 13:16:43

ASP.NET URL

2009-08-05 14:46:17

ASP.NET url

2009-04-08 09:58:07

ASP.NET MVCTempData框架

2009-07-30 13:45:40

ASP.NET開發模式MVC模式

2009-07-07 10:14:57

基于URL權限控制

2009-07-20 10:33:02

ASP.NET MVC

2009-07-20 15:44:32

ASP.NET MVC

2009-07-24 11:20:43

ASP.NET MVC

2010-03-26 09:16:44

2009-07-31 09:58:20

URL映射ASP.NET

2009-08-04 10:02:36

中國站長站

2009-07-28 10:01:16

ASP.NET Exc

2009-12-21 10:05:10

ASP.NET MVC

2009-07-28 14:47:18

ASP.NET MVC

2009-07-24 10:55:00

asp.net mvc
點贊
收藏

51CTO技術棧公眾號

日韩中文字幕视频在线| 久久av超碰| 91xxxxx| 国产日韩欧美一区二区| xvideos成人免费中文版| 日韩精品一区二区三区swag | 欧美国产日韩一区二区在线观看| 久久夜色精品国产欧美乱极品| 欧美1区2区3区| 林ゆな中文字幕一区二区| 日皮视频在线观看| 一级片在线观看| 日本在线中文电影| 91淫黄看大片| www.av毛片| av日韩一区二区三区| 日韩欧美精品一区二区三区经典| 成人在线观看91| 成人三级在线| 日本伊人精品一区二区三区介绍| 色偷偷噜噜噜亚洲男人| 亚洲欧美日韩图片| 色婷婷综合五月| 精品久久久久久亚洲国产300| 欧美激情一区在线观看| 久久久一区二区三区| 人人狠狠综合久久亚洲婷婷| 日本中文字幕在线视频| 午夜影院在线观看视频| 美女视频免费观看网站在线| 丁香六月婷婷| 亚州av中文字幕在线免费观看| 最近中文字幕mv2018在线高清 | 国产精品久久久久久久久久新婚 | 亚洲美女视频一区| 麻豆精品精品国产自在97香蕉| 另类ts人妖一区二区三区| 高清久久一区| 四虎884aa成人精品最新| 巨人精品**| 国产精品视频一区二区三区综合 | 中文字幕精品—区二区| 久久露脸国产精品| 丝袜情趣国产精品| 国产激情视频一区| 成人综合色站| 亚洲国产欧美不卡在线观看 | 欧美不卡高清一区二区三区| 97色婷婷成人综合在线观看| 国产小黄视频| 你懂的在线免费观看| av丝袜在线| 国产欧美88| 99国产精品一区二区| 国产精品成人一区二区网站软件| 99精品福利视频| 26uuu国产在线精品一区二区| 国产成a人亚洲| 综合久久给合久久狠狠狠97色 | 一区二区三区四区在线播放| 日韩午夜在线观看视频| 欧美日韩成人黄色| 蜜桃av噜噜一区二区三| 日韩av手机版| 182tv在线播放| 亚洲免费专区| 国产美女av一区二区三区| 亚洲精品视频免费观看| 亚洲午夜激情av| 91精品国产色综合久久ai换脸| 日韩在线国产精品| 免费成人深夜夜行视频| 成人毛片免费在线观看| 欧美人与禽性xxxxx杂性| gogo久久日韩裸体艺术| 免费人成精品欧美精品| 亚洲国产综合在线| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产精品777| av黄色免费在线| **日韩最新| 国产成人免费视| 欧美一级搡bbbb搡bbbb| 欧美午夜精品久久久久久久| 日韩中文字在线| 亚洲精品免费一区二区三区| 2222www色视频在线观看| 澳门av一区二区三区| 麻豆免费看一区二区三区| 欧美高清激情brazzers| 国产狼人综合免费视频| 天天噜天天色| free性欧美16hd| 日韩高清电影免费| 亚洲人成精品久久久久| 亚洲成人激情图| 成人精品一区二区三区电影黑人| 杨幂毛片午夜性生毛片 | 国产精品免费av| 亚洲成色777777女色窝| 色噜噜狠狠色综合网| 亚洲淫性视频| 国产麻豆精品theporn| 亚洲免费人成在线视频观看| 欧美黑人在线观看| 超碰在线资源| 狠狠色丁香久久婷婷综| 亚洲国语精品自产拍在线观看| 国产成人亚洲欧美| 男女羞羞视频在线观看| 蜜臀国产一区二区三区在线播放| 欧美一级高清大全免费观看| 欧美一二三区| 电影k8一区二区三区久久| 国产成人午夜99999| www.欧美免费| 黄页在线播放| 国产精选在线| 久久香蕉网站| 成人欧美一区二区三区小说| 国产精品美乳在线观看| 色成人亚洲网| 亚州国产精品| 欧美日韩国产美女| 成人一对一视频| 盗摄牛牛av影视一区二区| 国产精品拍天天在线| 亚洲淫片在线视频| 福利在线午夜| heyzo一本久久综合| 一区二区av在线| 啊啊啊一区二区| 欧美国产另类| 亚洲一级黄色片| av超碰在线| 久久爱另类一区二区小说| 亚洲第一区在线| 男女高潮又爽又黄又无遮挡| 欧美自拍偷拍| 日韩av中文在线| 超碰在线首页| 国产成人精品免费网站| 99视频国产精品免费观看| 四虎视频在线精品免费网址| 亚洲男女一区二区三区| 日本一区二区三区视频在线观看| 欧美成人高清视频在线观看| 亚洲精品免费在线播放| 亚洲最新在线| 日韩深夜福利| 日韩av在线网站| 91在线九色porny| 国产日韩欧美一区在线| 欧美在线www| 国产精品欧美一区二区三区不卡| 91传媒视频在线播放| 欧美精品第三页| 影音先锋亚洲一区| 欧美视频一区二区在线观看| 日日躁夜夜躁aaaabbbb| 日一区二区三区| 91啪国产在线| 久久99高清| 久久久久国产精品一区| 日本在线中文字幕一区二区三区| 日韩女优毛片在线| 国产黄在线看| 香蕉av福利精品导航| 国产高潮免费视频| 91日韩在线专区| 99c视频在线| 98精品久久久久久久| 国产精品99久久久久久久久久久久| free欧美| 精品福利av导航| 天堂аⅴ在线地址8| 偷偷要91色婷婷| 狠狠色一日本高清视频| 久久精品视频一区二区| 国产超碰在线播放| 国产欧美日韩视频一区二区| 无码精品a∨在线观看中文| www.成人在线| 日韩一区二区三区不卡视频| 亚洲欧洲无码一区二区三区| 免费看的国产视频网站| 亚洲成a人片在线观看中文| 黄色毛片在线看| 精品久久99ma| 在线观看福利电影| 日韩在线观看网址| 国产精品一区三区在线观看| 97av在线视频| 男男gay无套免费视频欧美| 国产成人精品免高潮在线观看| 日韩欧美视频| 久久国产精品久久| 国产a视频精品免费观看| www浪潮av99com| 欧美日韩免费观看一区二区三区|