Um novo recurso do Asp.Net 2.0 é o suporte integrado para reescrita de URL. Quando investiguei esse novo recurso, descobri que faltava suporte a expressões regulares, que é realmente o objetivo de um Mapeador de URLs. ScottGlu em seu blog explica o motivo pelo qual a equipe Asp.Net não implementou esse recurso. Basicamente eles perceberam que uma versão completa iria querer aproveitar as vantagens dos próximos novos recursos do IIS 7.0, especialmente o suporte para todos os tipos de conteúdo (imagens e diretórios).
De qualquer forma, é muito simples implementar um Módulo de Reescrita de URL com suporte a Regex no Asp.Net. Eu escrevi um HttpModule rápido e simples para isso. Toda a mágica é feita em algumas linhas dentro do HttpModule:
1 public void Rewrite_BeginRequest(object sender, System.EventArgs args) {
2 strings strPath = HttpContext.Current.Request.Url.AbsolutePath;
3 UrlRedirection oPR = new UrlRedirection();
4 string strURL = strPath;
5 string strRewrite = oPR.GetMatchingRewrite(strPath);
6 se (!String.IsNullOrEmpty(strRewrite)) {
7 strURL = strRewrite;
8 } senão {
9 strURL = strPath;
10}
11 HttpContext.Current.RewritePath("~" + strURL);
12}
O código é autoexplicativo. Quando uma solicitação é processada pelo mecanismo Asp.Net, o módulo verifica um xml para uma correspondência de regex. Já vi muitos mecanismos de reescrita de URL que usam Web.config para armazenar as regras correspondentes, mas prefiro usar um arquivo xml adicional. O arquivo de regras de reescrita tem a seguinte aparência:
1 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
2 <urlrewrites>
3 <nome da regra="Página de categoria">
4 <url>/([a-zA-Z][w-]{1.149}).aspx</url>
5 <rewrite>/Default.aspx?Category=$1</rewrite>
6 </rule>
7 <nome da regra="Página do item">
8 <url>/([a-zA-Z][w-]{1.149})/([a-zA-Z][w-]{1.149}).aspx</url>
9 <rewrite>/Default.aspx?Category=$1&Item=$2</rewrite>
10 </rule>
11 </urlrewrites>
A rotina de correspondência de regras, que é implementada no método GetMatchingRewrite(), é bastante simples e leve:
1 public string GetMatchingRewrite(string URL) {
2 string strRtrn = "";
3
4 System.Text.RegularExpressions.Regex oReg;
5
6 foreach (RedirectRule ouRule em regras) {
7
8 Reg = novo Regex(oRule.URL);
9 Correspondência oMatch = oReg.Match(URL);
10
11 se (oMatch.Success) {
12 strRtrn = oReg.Replace(URL, oRule.Rewrite);
13}
14
15}
16 return strRtrn;
17}
Carreguei um projeto de amostra que usa esse mecanismo de reescrita. O HttpModule e suas classes auxiliares estão dentro da pasta App_Code. Espero que este código seja útil para você, se tiver alguma dúvida é só deixar um comentário nesta entrada. Boa codificação!
-------------------------------------------------- ------------------------------
DE DEVEL.oping.net
postado em 26/04/2006 14:17 徐灿钊Asp.net专栏 阅读(48) 评论(1) 编辑 收藏 收藏至365Key 所属分类: .net2.0
Descrição:
# re: Reescrita de URL com Regex para ASP.NET 2.0(在asp.net2.0中使用正规表达式建立URL重写) 2006-04-26 20:22 | AXii
哈哈哈,测试后 1 public void Rewrite_BeginRequest(objeto remetente, System.EventArgs args)
2 {
3 string appPath = HttpContext.Current.Request.ApplicationPath;
4 HttpContext.Current.Response.Write(appPath + "<br />");
5
6 string strPath = HttpContext.Current.Request.Url.AbsolutePath;
7 HttpContext.Current.Response.Write(strPath + "<br />");
8
9 strPath = strPath.Substring(appPath.Length);
10
11 HttpContext.Current.Response.Write(strPath + "<br />");
12
13 UrlRedirection oPR = new UrlRedirection();
14
15 string strURL = strPath;
16
17 string strRewrite = oPR.GetMatchingRewrite(strPath);
18
19 se (!String.IsNullOrEmpty(strRewrite))
20 {
21 strURL = strRewrite;
22}
23 mais
24 {
25 strURL = strPath;
26}
27
28 HttpContext.Current.RewritePath("~" + strURL);
29 } 发现这个处理办法对于虚拟路径会出现转发错误,注意第2、3、9行,是我增加的,可以有效的解决虚拟路径问题。
2、无法满足页面回发的问题!如何解决,还请您来修改:):