1: مشكلة الحذف أثناء إعادة الكتابة في asp.net1.1! ! !
مثل التعبير العادي التالي:
<Rules>
<قاعدة كتابة>
<البحث>
<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>
</RewriterRule>
</Rules>
من بينها، يمكن تعيين 1 و4 إلى الصفحة المقابلة بشكل طبيعي
، ولكن 2 و3 سيتسببان في حدوث خطأ http404! ! !
السبب يكمن في تدفق معالجة IIS نفسه. الحل هو إعادة كتابة معالجة الأخطاء 404 على الموقع نفسه! ! !
1: قم بتخصيص عنوان URL لمعالجة أخطاء 404 (تم تكوينه في IIS، التكوين في web.config غير مفيد لإعادة الكتابة)
2: أضف القسم التالي إلى قسم System.Web:
<httpHandlers>
<إضافة فعل = "*" مسار = "404.aspx" نوع = "lt.Http404،lt"></add>
</httpHandlers>
<httpModules>
<add type="lt.ReWriteModule,lt" name="ModuleRewriter" />
</httpModules>
الكود المصدري كما يلي:
public class Http404:System.Web.IHttpHandler
{
عام Http404 ()
{
//
// TODO: أضف منطق المنشئ هنا
//
}
#region عضو IHttpHandler
public void ProcessRequest(System.Web.HttpContext context)
{
// TODO: إضافة تطبيق Http404.ProcessRequest
string errorPath=context.Request.RawUrl.Split(new char[]{';'})[1];
string appPath=context.Request.ApplicationPath;
int ipos=errorPath.IndexOf(appPath
string url=errorPath.Substring(ipos+appPath.Length);
// إذا (!url.EndsWith("/"))
// {
// url+="/";
// }
// url+="index.html";
// context.Response.Write(url);
// context.RewritePath(url);
//context.Response.Write(url);
url="~"+url;
string newUrl =lt.ReWriteModule.GetUrl(context,url);
//context.Response.Write(newUrl);
إذا (newUrl! = فارغ)
{
//cxt.Response.Filter = new ResponseFilter(cxt.Response.Filter,cxt.Request.Path);
context.Response.Write("المسار المطلوب:" + url);
context.Response.Write("<BR>");
context.Response.Write("عنوان URL المقصود المعاد توجيهه:" + newUrl);
context.Response.Write("<BR>");
context.RewritePath(newUrl);
}
آخر
{
context.Response.Write("المورد الذي طلبته غير موجود!!");
context.Response.End ();
}
}
المنطق العام قابل لإعادة الاستخدام
{
يحصل
{
// TODO: إضافة تطبيق getter لـ Http404.IsReusable
عودة كاذبة.
}
}
///////////////// httpModule في معالجة قسم التكوين كما يلي:
public class ReWriteModule:System.Web.IHttpModule
{
ReWriteModule العامة ()
{
//
// TODO: أضف منطق المنشئ هنا
//
}
#region عضو IHttpModule
public void Init(System.Web.HttpApplication context)
{
// TODO: إضافة تطبيق ReWriteModule.Init
context.BeginRequest+=new EventHandler(this.ReWrite);
}
System.Xml.XmlDocument الخاص الثابت RuleDoc = null;
System.Xml.XmlDocument GetRuleConfig ثابت خاص (تطبيق System.Web.HttpContext)
{
إذا (ruleDoc == فارغة)
{
RuleDoc = new 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 الثانية في lst)
{
System.Xml.XmlNodeList sub = nd.ChildNodes[0].ChildNodes;
foreach (System.Xml.XmlNode chk in sub)
{
بات = "^" + chk.InnerText+"$";
System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(pat, System.Text.RegularExpressions.RegexOptions.Compiled | System.Text.RegularExpressions.RegexOptions.IgnoreCase);
إذا (reg.IsMatch (المسار))
{
return reg.Replace(path, nd.ChildNodes[1].InnerText);
}
}
}
عودة فارغة
}
إعادة كتابة الفراغ الخاص (مرسل الكائن، EventArgs e)
{
System.Web.HttpContext cxt =(المرسل كـ System.Web.HttpApplication).Context;
إذا (cxt.Request.ContentType != "image/pjpeg")
{
نوع السلسلة = cxt.Request.ContentType.ToLower();
مسار السلسلة = cxt.Request.Path;
سلسلة مسار التطبيق = cxt.Request.ApplicationPath؛
المسار = path.Remove(0, apppath.Length);
المسار = "~" + المسار؛
string newUrl = GetUrl(cxt, path.TrimEnd().TrimStart());
إذا (newUrl! = فارغ)
{
//cxt.Response.Filter = new 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();
//
}
}
التخلص من الفراغ العام ()
{
// TODO: إضافة تطبيق ReWriteModule.Dispose
}
#endregion
}
---------تم تكوين القاعدة.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>
</RewriterRule>
<قاعدة كتابة>
<البحث>
<LookFor>~/Pro.aspx?year=(d{4})&month=(d{2})</LookFor>
</لوكفورس>
<SendTo>~/(d{4})/(d{2}).html</SendTo>
</RewriterRule>
<قاعدة كتابة>
<البحث>
<LookFor>~/pc</LookFor>
</لوكفورس>
<SendTo>~/Test2.aspx</SendTo>
</RewriterRule>
<قاعدة كتابة>
<البحث>
<LookFor>~/index.html</LookFor>
<LookFor>~/default.html</LookFor>
</لوكفورس>
<SendTo>~/default.aspx</SendTo>
</RewriterRule>
</Rules>
///////// للحصول على تغييرات الإجراء الناتجة عن إعادة الكتابة، يرجى الرجوع إلى مشكلة urlMappings في asp.net2.0 التي كتبتها! ! ! ! !