1: Masalah penghapusan saat menulis ulang di asp.net1.1! ! !
Seperti ekspresi reguler berikut:
<Aturan>
<Aturan Penulis Ulang>
<Pencarian>
<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>
</Pencarian>
<SendTo>~/Pro.aspx?year=$1&month=$2</SendTo>
</Aturan Penulis Ulang>
</Aturan>
Diantaranya, 1 dan 4 dapat dipetakan ke halaman terkait secara normal
, tetapi 2 dan 3 akan menyebabkan kesalahan http404! ! !
Alasannya terletak pada alur pemrosesan IIS itu sendiri. Solusinya adalah dengan menulis ulang pemrosesan error 404 pada website itu sendiri! ! !
1: Sesuaikan URL untuk menangani kesalahan 404 (dikonfigurasi di IIS, konfigurasi di web.config tidak berguna untuk menulis ulang)
2: Tambahkan bagian berikut ke bagian System.Web:
<httpHandlers>
<tambahkan kata kerja="*" path="404.aspx" type="lt.Http404,lt"></add>
</httpHandler>
<httpModul>
<tambahkan type="lt.ReWriteModule,lt" name="ModuleRewriter" />
</httpModules>
Kode sumbernya adalah sebagai berikut:
public class Http404:System.Web.IHttpHandler
{
publik Http404()
{
//
// TODO: tambahkan logika konstruktor di sini
//
}
#region IHttpHandler anggota
public void ProcessRequest (konteks System.Web.HttpContext)
{
// TODO: Tambahkan implementasi Http404.ProcessRequest
string errorPath=context.Request.RawUrl.Split(char baru[]{';'})[1];
string appPath=konteks.Request.ApplicationPath;
int ipos=errorPath.IndexOf(appPath);
string url=errorPath.Substring(ipos+appPath.Panjang );
// if(!url.BerakhirDengan("/"))
// {
// url+="/";
// }
// url+="indeks.html";
// konteks.Respon.Tulis(url);
// konteks.RewritePath(url);
//konteks.Respon.Write(url);
url="~"+url;
string newUrl =lt.ReWriteModule.GetUrl(konteks,url);
//konteks.Respon.Tulis(Url baru);
jika (Url baru!= null)
{
//cxt.Response.Filter = ResponseFilter baru(cxt.Response.Filter,cxt.Request.Path);
konteks.Response.Write("Jalur yang diminta:" + url);
konteks.Respon.Tulis("<BR>");
konteks.Response.Write("URL tujuan yang dialihkan: " + newUrl);
konteks.Respon.Tulis("<BR>");
konteks.RewritePath(newUrl);
}
kalau tidak
{
konteks.Response.Write("Sumber daya yang Anda minta tidak ada!!");
konteks.Respon.End();
}
}
bool publik Dapat Digunakan Kembali
{
mendapatkan
{
// TODO: Tambahkan implementasi pengambil Http404.IsReusable
kembali salah;
}
}
//////////////////HttpModule pada pemrosesan bagian konfigurasi adalah sebagai berikut:
public class ReWriteModule:System.Web.IHttpModule
{
Modul Penulisan Ulang publik()
{
//
// TODO: tambahkan logika konstruktor di sini
//
}
#region IHttpModule member
public void Init (Konteks System.Web.HttpApplication)
{
// TODO: Tambahkan implementasi ReWriteModule.Init
konteks.BeginRequest+=eventHandler baru(ini.ReWrite);
}
private static System.Xml.XmlDocument ruleDoc = null;
System.Xml.XmlDocument GetRuleConfig statis pribadi (aplikasi System.Web.HttpContext)
{
jika (ruleDoc == null)
{
ruleDoc = Sistem baru.Xml.XmlDocument();
ruleDoc.Load(app.Server.MapPath("~/rule.xml"));
}
kembalikan aturanDok;
}
string statis publik GetUrl(System.Web.HttpContext cxt, jalur string)
{
Sistem.Xml.XmlDocument doc = GetRuleConfig(cxt);
System.Xml.XmlNodeList lst= doc.GetElementsByTagName("RewriterRule");
tali tepuk="";
foreach (System.Xml.XmlNode dan di lst)
{
System.Xml.XmlNodeList sub = nd.ChildNodes[0].ChildNodes;
foreach(System.Xml.XmlNode chk di sub)
{
pat = "^" + chk.InnerText+"$";
System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(pat, System.Text.RegularExpressions.RegexOptions.Compiled | System.Text.RegularExpressions.RegexOptions.IgnoreCase);
if(reg.IsMatch(jalur))
{
return reg.Replace(path, nd.ChildNodes[1].InnerText);
}
}
}
kembalikan nol;
}
private void ReWrite (pengirim objek, EventArgs e)
{
System.Web.HttpContext cxt =(pengirim sebagai System.Web.HttpApplication).Context;
if (cxt.Request.ContentType != "gambar/pjpeg")
{
tipe string = cxt.Request.ContentType.ToLower();
string jalur = cxt.Permintaan.Jalur;
string apppath = cxt.Request.ApplicationPath;
jalur = jalur.Hapus(0, jalur aplikasi.Panjang);
jalur = "~" + jalur;
string newUrl = GetUrl(cxt, jalur.TrimEnd().TrimStart());
jika (Url baru!= null)
{
//cxt.Response.Filter = ResponseFilter baru(cxt.Response.Filter,cxt.Request.Path);
cxt.Response.Write("Jalur yang diminta:" + jalur);
cxt.Respon.Write("<BR>");
cxt.Response.Write("URL tujuan yang dialihkan: " + newUrl);
cxt.Respon.Write("<BR>");
cxt.RewritePath(Url baru);
}
//kalau tidak
//{
// cxt.Response.Write(cxt.Request.Path + "<BR>");
// cxt.Response.Write("Sumber daya yang Anda minta tidak ada atau Anda tidak memiliki izin untuk mengakses!");
// cxt.Respon.Flush();
// cxt.Respon.End();
//}
}
}
kekosongan publik Buang()
{
// TODO: Tambahkan implementasi ReWriteModule.Dispose
}
#wilayah akhir
}
---------rule.xml dikonfigurasi sebagai berikut:
<?xml version="1.0" coding="utf-8" ?>
<Aturan>
<Aturan Penulis Ulang>
<Pencarian>
<LookFor>~/(d{4})/(d{2}).html</LookFor>
<LookFor>~/(d{4})/(d{2})/</LookFor>
<Mencari>~/(d{4})/(d{2})</Mencari>
<LookFor>~/(d{4})/(d{2})/index.html</LookFor>
</Pencarian>
<SendTo>~/Pro.aspx?year=$1&month=$2</SendTo>
</Aturan Penulis Ulang>
<Aturan Penulis Ulang>
<Pencarian>
<LookFor>~/Pro.aspx?year=(d{4})&bulan=(d{2})</LookFor>
</Pencarian>
<SendTo>~/(d{4})/(d{2}).html</SendTo>
</Aturan Penulis Ulang>
<Aturan Penulis Ulang>
<Pencarian>
<Mencari>~/pc</Mencari>
</Pencarian>
<KirimKe>~/Test2.aspx</SendTo>
</Aturan Penulis Ulang>
<Aturan Penulis Ulang>
<Pencarian>
<LookFor>~/index.html</LookFor>
<LookFor>~/default.html</LookFor>
</Pencarian>
<SendTo>~/default.aspx</SendTo>
</Aturan Penulis Ulang>
</Aturan>
//////////Untuk perubahan tindakan yang disebabkan oleh penulisan ulang, silakan lihat masalah urlMappings di asp.net2.0 yang saya tulis! ! ! ! !