1: ปัญหาการลบระหว่างการเขียนใหม่ใน asp.net1.1! - -
เช่นนิพจน์ทั่วไปต่อไปนี้:
<กฎ>
<กฎนักเขียนใหม่>
<มองหา>
<LookFor>~/(d{4})/(d{2}).html</LookFor>---------<1>
<LookFor>~/(d{4})/(d{2})/</LookFor>--------------<2>
<LookFor>~/(d{4})/(d{2})</LookFor>-----------<3>
<LookFor>~/(d{4})/(d{2})/index.html</LookFor>----<4>
</มองหา>
<SendTo>~/Pro.aspx?year=$1&month=$2</SendTo>
</กฎนักเขียนใหม่>
</กฎ>
ในหมู่พวกเขา 1 และ 4 สามารถแมปกับเพจที่เกี่ยวข้องได้ตามปกติ
แต่ 2 และ 3 จะทำให้เกิดข้อผิดพลาด http404! - -
เหตุผลอยู่ที่ขั้นตอนการประมวลผลของ IIS เอง วิธีแก้ไขคือเขียนการประมวลผลข้อผิดพลาด 404 บนเว็บไซต์ใหม่! - -
1: กำหนด URL สำหรับการจัดการข้อผิดพลาด 404 เอง (กำหนดค่าใน IIS การกำหนดค่าใน web.config ไม่มีประโยชน์สำหรับการเขียนใหม่)
2: เพิ่มส่วนต่อไปนี้ลงในส่วน System.Web:
<httpHandlers>
<เพิ่มกริยา = "*" path = "404.aspx" type = "lt.Http404,lt"></add>
</httpตัวจัดการ>
<httpโมดูล>
<เพิ่มประเภท = "lt.ReWriteModule, lt" name = "ModuleRewriter" />
</httpModules>
รหัสที่มาจะเป็นดังนี้:
ระดับสาธารณะ Http404:System.Web.IHttpHandler
-
Http404() สาธารณะ
-
-
// สิ่งที่ต้องทำ: เพิ่มตรรกะคอนสตรัคเตอร์ที่นี่
-
-
#region IHttpHandler สมาชิก
โมฆะสาธารณะ ProcessRequest (บริบท System.Web.HttpContext)
-
// สิ่งที่ต้องทำ: เพิ่มการใช้งาน Http404.ProcessRequest
สตริง errorPath=context.Request.RawUrl.Split (อักขระใหม่ [] {';'}) [1];
สตริง appPath=context.Request.ApplicationPath;
int ipos=errorPath.IndexOf(appPath);
string url=errorPath.Substring(ipos+appPath.Length );
// if(!url.EndsWith("/"))
-
// url+="/";
-
// url+="index.html";
// context.Response.Write (url);
// context.RewritePath(url);
//context.Response.Write(url);
url="~"+url;
สตริง newUrl =lt.ReWriteModule.GetUrl (บริบท, url);
//context.Response.Write(newUrl);
ถ้า (newUrl != null)
-
//cxt.Response.Filter = ResponseFilter ใหม่ (cxt.Response.Filter,cxt.Request.Path);
context.Response.Write("เส้นทางที่ร้องขอ:" + url);
context.Response.Write("<BR>");
context.Response.Write ("URL ปลายทางที่เปลี่ยนเส้นทาง: " + newUrl);
context.Response.Write("<BR>");
บริบท RewritePath (newUrl);
-
อื่น
-
context.Response.Write("ไม่มีทรัพยากรที่คุณต้องการ!!");
บริบทการตอบสนองสิ้นสุด ();
-
}
บูลสาธารณะ IsReusable
-
รับ
-
// สิ่งที่ต้องทำ: เพิ่มการใช้งาน getter Http404.IsReusable
กลับเท็จ;
-
}
///////////////// httpModule ในการประมวลผลส่วนการกำหนดค่ามีดังนี้:
คลาสสาธารณะ ReWriteModule:System.Web.IHttpModule
-
ReWriteModule สาธารณะ ()
-
-
// สิ่งที่ต้องทำ: เพิ่มตรรกะคอนสตรัคเตอร์ที่นี่
-
-
#region IHttpModule สมาชิก
โมฆะสาธารณะ Init (บริบท System.Web.HttpApplication)
-
// สิ่งที่ต้องทำ: เพิ่มการใช้งาน ReWriteModule.Init
context.BeginRequest+=new EventHandler(this.ReWrite);
-
System.Xml.XmlDocument ส่วนตัวแบบคงที่ lawDoc = null;
System.Xml.XmlDocument GetRuleConfig แบบคงที่ส่วนตัว (แอป System.Web.HttpContext)
-
ถ้า (ruleDoc == null)
-
RuleDoc = System.Xml.XmlDocument ใหม่ ();
RuleDoc.Load(app.Server.MapPath("~/rule.xml"));
-
กลับกฎDoc;
-
สตริงสาธารณะ GetUrl (System.Web.HttpContext cxt, เส้นทางสตริง)
-
System.Xml.XmlDocument doc = GetRuleConfig(cxt);
System.Xml.XmlNodeList lst= doc.GetElementsByTagName("RewriterRule");
สตริงตบ = "";
foreach (System.Xml.XmlNode nd ใน lst)
-
System.Xml.XmlNodeList ย่อย = nd.ChildNodes[0].ChildNodes;
foreach (System.Xml.XmlNode chk ในย่อย)
-
ตบ = "^" + chk.InnerText+"$";
System.Text.RegularExpressions.Regex reg = ใหม่ System.Text.RegularExpressions.Regex (pat, System.Text.RegularExpressions.RegexOptions.Compiled | System.Text.RegularExpressions.RegexOptions.IgnoreCase);
ถ้า (reg.IsMatch (เส้นทาง))
-
กลับ reg.Replace (เส้นทาง nd.ChildNodes [1] .InnerText);
-
-
-
กลับเป็นโมฆะ;
}
โมฆะส่วนตัว ReWrite (ผู้ส่งวัตถุ, EventArgs e)
-
System.Web.HttpContext cxt = (ผู้ส่งเป็น System.Web.HttpApplication).Context;
ถ้า (cxt.Request.ContentType != "image/pjpeg")
-
ประเภทสตริง = cxt.Request.ContentType.ToLower();
เส้นทางสตริง = cxt.Request.Path;
apppath สตริง = cxt.Request.ApplicationPath;
path = path.Remove (0, apppath.Length);
เส้นทาง = "~" + เส้นทาง;
สตริง newUrl = GetUrl(cxt, path.TrimEnd().TrimStart());
ถ้า (newUrl != null)
-
//cxt.Response.Filter = ResponseFilter ใหม่ (cxt.Response.Filter,cxt.Request.Path);
cxt.Response.Write("เส้นทางที่ร้องขอ:" + เส้นทาง);
cxt.Response.Write("<BR>");
cxt.Response.Write("URL ปลายทางที่เปลี่ยนเส้นทาง: " + newUrl);
cxt.Response.Write("<BR>");
cxt.RewritePath(newUrl);
-
//อื่น
-
// cxt.Response.Write(cxt.Request.Path + "<BR>");
// cxt.Response.Write("ไม่มีทรัพยากรที่คุณร้องขอหรือคุณไม่ได้รับอนุญาตให้เข้าถึง!");
// cxt.Response.Flush();
// cxt.Response.End();
-
-
-
โมฆะสาธารณะกำจัด ()
-
// สิ่งที่ต้องทำ: เพิ่มการใช้งาน ReWriteModule.Dispose
}
#endregion
}
---------rule.xml ได้รับการกำหนดค่าดังนี้:
<?xml version="1.0" encoding="utf-8" ?>
<กฎ>
<กฎนักเขียนใหม่>
<มองหา>
<LookFor>~/(d{4})/(d{2}).html</LookFor>
<LookFor>~/(d{4})/(d{2})/</LookFor>
<LookFor>~/(d{4})/(d{2})</LookFor>
<LookFor>~/(d{4})/(d{2})/index.html</LookFor>
</มองหา>
<SendTo>~/Pro.aspx?year=$1&month=$2</SendTo>
</กฎนักเขียนใหม่>
<กฎนักเขียนใหม่>
<มองหา>
<LookFor>~/Pro.aspx?year=(d{4})&month=(d{2})</LookFor>
</มองหา>
<ส่งถึง>~/(d{4})/(d{2}).html</ส่งถึง>
</กฎนักเขียนใหม่>
<กฎนักเขียนใหม่>
<มองหา>
<LookFor>~/pc</LookFor>
</มองหา>
<SendTo>~/Test2.aspx</SendTo>
</กฎนักเขียนใหม่>
<กฎนักเขียนใหม่>
<มองหา>
<LookFor>~/index.html</LookFor>
<LookFor>~/default.html</LookFor>
</มองหา>
<SendTo>~/default.aspx</SendTo>
</กฎนักเขียนใหม่>
</กฎ>
/////////สำหรับการเปลี่ยนแปลงการกระทำที่เกิดจากการเขียนใหม่ โปรดดูที่ปัญหาของ urlMappings ใน asp.net2.0 ที่เขียนโดยฉัน! - - - -