asp.net用url重寫URLReWriter出現任意2級網域名稱

來源:互聯網
上載者:User

來找這篇文本作品的,應該都明白什麼叫2級網域名稱吧,廢話就不說了.但是研討前,先要明白一個的思想痛點.
很多哥們一直策劃不清(我前幾天也一直搞不明白)的痛點是,我鍵入一個的地址後,怎樣那個url就被重寫了?
第一步:在瀏覽器鍵入了一個的地址,比如http://love.kerry.com,點斷行符號後,都除了了什麼?
為了把痛點簡單化,我來那樣解釋:
第二步:首先,鍵入的地址被解析,最終來到了一台web伺服器.交給IIS處理.在.net的全球中,IIS會把那樣的請求再交給一個的web處理器 處理,最後,該 web處理器 把處理的結果返回給瀏覽器,顯示給使用者看.
請不用忽略那樣一個的痛點,第二步的所有事件都是在伺服器端做的.在這一些事件停止的時間,使用者端的瀏覽器上面的地址不會改變.即使最後 web處理器 把處理結果返回來的時間,上面的地址也不會改變.
一開始鍵入的url,只是起一個的敲門的功能,門敲完了,功能就算結束了,只有你的眼睛沒成績看到那個地址,瀏覽器,伺服器等都不明白那個地址.
然後要明白的痛點是,所謂url重寫,也只是web開發明白的內幕情況,使用者根本不明白除了了什麼,他以為自己鍵入的地址那是應該出來螢幕上顯示的結果.也那是說,咱們在幕後控制要顯示的內容.
接下來要策劃的是,怎樣樣控制顯示的內容?
從上面說的過程,很明顯要在 web處理器 的打工這一步動手腳.

一個的最簡單的策劃是,使用者敲入了一個的簡單的不帶任何參數地址, http://love.kerry.com然後咱們把那個地址改成一個的符合程式需求的帶參數的地址, http://kerry.com?lover=us,最後處理之.
所謂的url重寫,那是在這一步.
用.net的術語來說,咱們需求給實際運用程式註冊一個的httpmodule,用來處理特定的url
註冊httpmodule,在web.config,
處理url,在咱們協助的httpmodule程式中

大體相當於那樣的一段程式

//用咱們的httpmodule程式截獲原始url
String OriginalUrl=” http://love.kerry.com”;
//處理原始url,得到最後需求的url,value為http://kerry.com?lover=us
String FinalUrl=Rerecord(OriginalUrl);
// context重新將url在內部發送給IIS處理
context.RerecordPath(FinalUrl);

接下來,咱們來出現url重寫.
第一步:確定要對哪些url運行重寫,即制定重寫規則
第二步:編寫httpmodule處理常式
第三步:將編寫的httpmodule整合入web程式,開始打工.

上面那是url重寫的基本學識,而用url重寫出現2級網域名稱,過程相同.由於無論是2級網域名稱還是第三層網域名,都是一個的url地址.只要咱們截獲那個url地址,就沒成績在處理的時間動手腳.

這一些打工挺麻煩,但是互連網上已經有高人給咱們寫了那樣的程式,參看下面的文本作品:

http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx

http://www.cnblogs.com/jzywh/archive/二零零五/09/29/246650.靜態網頁

http://www.cnblogs.com/jzywh/archive/二零零六/02/20/334004.靜態網頁

文本作品結束了.

在實施過程中會碰到一些痛點,大多是由於看上面的文本作品不仔細產生的,但是說實話,那麼長的文本作品要看完也不簡易.下面我來記錄一些很重要的痛點.其中最後的兩個痛點,用具體的原始碼展示了如何處理重寫的目的url以達到咱們的要求

Microsoft的URLRerecordr是什麼?那個工程在哪裡下載的?
那個是在msdn上一篇介紹URLRerecordr的文本作品中協助的樣本程式,沒成績在那裡下載到
http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx

怎樣應用這一些原始碼?麻煩嗎?
肯定的說,不麻煩,要做的事件有:
下載原始碼到你的機器上.
安裝後,把URLRerecordr那個工程添加到你自己的工程中
按照上面給的地址裡的竅門,改正原始碼
配置web.config,開始應用.

什麼是httpmodule?

簡單理解,那是一塊處理http請求的程式
更詳細的理解,請查閱sdk文檔.

怎樣樣出現泛解析?

首先,在網域名稱服務 (DNS)商那裡添加一個的*.kerry.com的2級網域名稱,指向你的伺服器ip
然後,在IIS裡建立一個的網站,那個網站的主機頭留空,一般連接埠是80. 那個網站那是整個伺服器連接埠80的預設互連網.
給那個網站添加一個的萬用字元實際運用程式映射(IIS網站屬性 ->主列表 ->  配置),那個映射的目的是要asp.net ISAPI接管任何沒有在IIS裡明確的2級網域名稱網站.

隨便輸入2級網域名稱的時間,除了了什麼?
當IIS檢查測試到傳入的url是一個的2級網域名稱的時間,它會先檢查IIS上有沒有註冊了那個2級網域名稱的網站,假如有,就轉入到那個網站,否則,就會轉到預設網站,那個預設網站那是之前配置的主機頭為空白的那個網站.所以,一個的連接埠只能有一個的主機頭為空白的網站.
咱們已經設定由asp.net ISAPI接管這一些沒有家的孩子.寫程式,策劃傳入的url,運行重寫.

為什麼我的httpmodule好像沒有起功能?

在httpmodule程式裡設定斷點後,無論怎樣樣,程式都沒有從那裡走.理由在於,你沒有向web程式註冊你的httpmodule程式.那個打工需求在web.config中完成.
<system.web>
<httpModules>
<add type="URLRerecordr.ModuleRerecordr, URLRerecordr"  title="ModuleRerecordr" />
</httpModules>
</system.web>

為什麼總是提示我”未知的配置節RerecordrConfig錯誤”

這是由於你沒有向web程式註冊你的RerecordrConfig配置節. 那個打工需求在web.config中完成.
<configSections>
<section title="RerecordrConfig" type="URLRerecordr.Config.RerecordrConfigSerializerSectionHandler, URLRerecordr" />
</configSections>
然後,你沒成績在<configuration>裡應用RerecordrConfig節配置規則了.

url是在httpmodule的哪個部份處理的?

大多的打工是在URLRerecordr. ModuleRerecordr. Rerecord()竅門裡.關鍵階段是那裡:
if (re.IsMatch(requestedPath))
很明顯,那個判斷傳入的url也許是咱們要重寫的url,接著看,
String sendToUrl = RerecordrUtils.ResolveUrl(app.Context.Request.ApplicationPath, re.Resocate(requestedPath, rules[i].SendTo));
那裡接受到web.config中配置的要轉到的目的url
RerecordrUtils.RerecordUrl(app.Context, sendToUrl);
在內部把url重寫.

我不想把2級網域名稱寫死在web.config中,而且我要重寫的目的url也不能寫死.比如咱們有那樣的需求
Love.kerry.com實際的處理頁面是kerry.com/action.aspx?id=1
call.kerryl.com實際的處理頁面是kerry.com/action.aspx?id=2
walkwith.kerry.com實際的處理頁面是kerry.com/walk.aspx
要怎樣處理?

那個時間,就需求在上面說的那幾個原始碼裡做手腳.
if (re.IsMatch(requestedPath))
{

//找到url裡的2級網域名稱
string [] UserHost = app.Request.Url.Host.Split ( new Char [] { '.' } );
string domain2=UserHost [0];

//根據需求設定要重寫的目的url
string sendToUrl ;
if(domain2==” Love”)
  sendToUrl =” /action.aspx?id=1”;
else if(domain2==” call”)
  sendToUrl =” /action.aspx?id=2”;
else i f(domain2==” walkwith”)
  sendToUrl =” /walk.aspx”;

RerecordrUtils.RerecordUrl(app.Context, sendToUrl);
    
}

在web.config裡配置規則的時間,需求那樣
<RerecordrRule>
<LookFor>http://(/w+)/.kerry/.com</LookFor>
<SendTo>/test.aspx</SendTo>
</RerecordrRule>
(/w+)用來匹對相配任意char串
那裡的test.aspx隨便寫別的也沒成績,由於咱們根本沒有用它.

我有好多不確定2級網域名稱的網站,但是每個網站的頁面確定,每個2級網域名稱網站的內容實際上根劇不相同的id從資料庫調,
情況如那樣
http://localhost/kerry/action.aspx?id=1 love.kerry.com/walk.aspx

http://localhost/kerry/action.aspx?id=14 like.kerry.com/walk.aspx

目前傳上去,不能顯示id參數,都改成2級網域名稱的方法. 那個時間該怎樣辦?

首先配置規則
<RerecordrRule>
<LookFor>http://(/w+)/.kerry /.com/ walk.aspx</LookFor>
<SendTo>/action.aspx</SendTo>
</RerecordrRule>
然後在程式裡那樣處理
//擷取2級網域名稱
string [] UserHost = app.Request.Url.Host.Split ( new Char [] { '.' } );
string domain2=UserHost [0];
根據網域名稱獲得不相同的編號
int id=getIDfromDomain(domain2);
//獲得要轉向的基本url
 string sendToUrl = RerecordrUtils.ResolveUrl(app.Context.Request.ApplicationPath, re.Resocate(requestedPath, rules[i].SendTo));
//加上id參數
if(id>0)
sendToUrl=string.Format ( "{0}?id={1}" , sendToUrl , id );
else
    sendToUrl=”error.aspx”;
//重寫
RerecordrUtils.RerecordUrl(app.Context, sendToUrl);

我搜到網上還有另外一種解決辦法…

或許你是指這篇文本作品

http://blog.csdn.net/mengyao/archive/二零零七/01/25/1493537.aspx

沒成績看到,其基本的竅門都是相同的.之所以沒有把那個列在最前面,是由於那個做法有些取巧,估計一開始不是那麼好理解.但是我相信看到最後的哥們再看這篇文本作品,應該都會會心的一笑
Happy programming 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.