关闭

URLRewrite重写的简单应用和自定义出错页面

标签: stringstylesiisapplicationpostback正则表达式
2896人阅读 评论(0) 收藏 举报
分类:

URLRewrite重写的简单应用和自定义出错页面

       看了网上不少和URLRewrite相关的技术文章,提供的解决方案不少,下面我结合相关技术文献,通过实例简单的说下个人在程序中应用URLRewrite的方法:

一、.html映射为.aspx

二、2006/6/19映射为default.aspx?log_Year=2006&log_Month=6&log_Day=19

 

实现方法:

应用IIS进行配置(IIS5.0)

       IIS中找到应用程序站点或程序对应的虚拟目录,右击/属性/目录/应用程序配置/配置/应用程序映射选项/,然后选择添加映射,在可执行文件框中浏览aspnet_isapi.dll文件(一般为C:/WINNT/Microsoft.NET/Framework/v1.1.4322/aspnet_isapi.dll),扩展名输入.*(如果针对.html的可直接输入单个扩展即可),动作设为“POST,GET”(为减少不必要的资源耗费,不用设置为全部动作),其他的默认即可。之所以这样做,是要把请求判断权交给ASPNET处理,而不是IIS,所以这个映射是必要的。完成这里的操作后,继续……

       由于用户请求连接时Application_BeginRequest()函数会被触发,所以只需要在这里判断客户端提交的请求就可以了,这就正是上面将IIS筛选权给ASPNET的原因所在。

       方法一、直接判断请求参数信息
 

              string strRawUrl = HttpContext.Current.Request.RawUrl;
              
string strNewUrl;
              
if (Regex.IsMatch(strRawUrl, @"(w+).html", RegexOptions.IgnoreCase))
              
{
                   strNewUrl 
= Regex.Replace(strRawUrl, @"(w+).html"@"$1.aspx", RegexOptions.IgnoreCase);
                   HttpContext.Current.RewritePath( strNewUrl );
              }

              
else if (Regex.IsMatch(strRawUrl, @"(d{4})/(d{1,2})/(d{1,2})(/?)", RegexOptions.IgnoreCase))
              
{
                   strNewUrl 
= Regex.Replace(strRawUrl, @"(d{4})/(d{1,2})/(d{2})(/*)"@"default.aspx?log_Year=$1&log_Month=$2&log_Day=$3",RegexOptions.IgnoreCase);
                   HttpContext.Current.RewritePath( strNewUrl );
//路径显示不变  但执行的是正确的路径
       }


              
//处理图片、样式表路径
       if (Regex.IsMatch(strRawUrl,  @"(d{4})/(d{1,2})/(d{1,2})(/?)([images|styles]+)/(.+)", RegexOptions.IgnoreCase))
              
{
                   strNewUrl 
= Regex.Replace(strRawUrl, @"(d{4})/(d{1,2})/(d{1,2})(/?)([images|styles]+)/(.+)"@"$5/$6",RegexOptions.IgnoreCase);
                   HttpContext.Current.RewritePath( strNewUrl );
              }


              
//验证码页面
       if (Regex.IsMatch(strRawUrl,  @"(d{4})/(d{1,2})/(d{1,2})(/?)checkcode.aspx", RegexOptions.IgnoreCase))
              
{
                   strNewUrl 
= Regex.Replace(strRawUrl, @"(d{4})/(d{1,2})/(d{1,2})(/?)checkcode.aspx"@"checkcode.aspx",RegexOptions.IgnoreCase);
                   HttpContext.Current.RewritePath( strNewUrl );
              }


              
//其他所有页面同样处理
       if (Regex.IsMatch(strRawUrl,  @"(d{4})/(d{1,2})/(d{1,2})(/?)(w+).aspx", RegexOptions.IgnoreCase))
              
{
                   strNewUrl 
= Regex.Replace(strRawUrl, @"(d{4})/(d{1,2})/(d{1,2})(/?)(w+).aspx"@"$5.aspx",RegexOptions.IgnoreCase);
                   HttpContext.Current.RewritePath( strNewUrl );
             }

 

上面的代码很简单,对于正则表达式的应用也比较简单,我就不详述了。同样的方式,通过正则,可改为任何你需要的访问方式,无需DLL支持,

 

方法二、通过配置文件来完成,当然你也可以放到默认的站点配置文件中,这里我是放到单独的config文件里,格式如下:

仍然在在
Application_BeginRequest()中完成。代码如下:

<?xml version="1.0" encoding="utf-8" ?>
<RewriterConfig>
     
<Rules>  
         
<RewriterRule><!--基本的静态页面访问 -->
              
<LookFor>(w+).html</LookFor>
              
<SendTo>$1.aspx</SendTo>
         
</RewriterRule>    
         
<RewriterRule><!--2006/6/19的格式访问-->
              
<LookFor>(d{4})/(d{1,2})/(d{1,2})(/?)</LookFor>
              
<SendTo>default.aspx?log_Year=$1&amp;log_Month=$2&amp;log_Day=$3</SendTo>
         
</RewriterRule>        
         
<RewriterRule><!--重写图片和样式表路径-->
              
<LookFor>(d{4})/(d{1,2})/(d{1,2})(/?)([images|styles]+)/(.+)</LookFor>
              
<SendTo>$5/$6</SendTo>
         
</RewriterRule>                
         
<RewriterRule><!--重写验证码路径-->
              
<LookFor>(d{4})/(d{1,2})/(d{1,2})(/?)checkcode.aspx</LookFor>
              
<SendTo>checkcode.aspx</SendTo>
         
</RewriterRule>        
         
<RewriterRule><!--重写通过2006/6/19格式访问后的 2006/6/19/blogview.aspx?logID=……等-->
              
<LookFor>(d{4})/(d{1,2})/(d{1,2})(/?)(w+).aspx</LookFor>
              
<SendTo>$5.aspx</SendTo>
         
</RewriterRule>             
     
</Rules>
</RewriterConfig>

 

 上面主要完成配置文件的读写和操作,该程序部分来自网上,不过运行时时总是有错误,达不到预期的效果,我修改了部分代码,实现如上,IIS5.0+ASP.NET1.1测试通过。

第二种方法 可直接编辑规则就可以 不用每次都写


 

当然,方法还不止这些,还可以通过自定义错误的页面来完成,方法如下:

<customErrors defaultRedirect="404.aspx" mode="On" />

404页面里进行判断(前提和上面同,需要交给ASPNET处理),当然启用该项,如果上面没有匹配到合适的串,将会交给404.aspx处理。同样global中异常信息也可以提交过来。 

              string strRawUrl = HttpContext.Current.Request.RawUrl;
              
string strNewUrl;
              
if (Regex.IsMatch(strRawUrl, @"(w+).html", RegexOptions.IgnoreCase))
              
{
                   
//避免多重目录访问               strNewUrl=Regex.Replace(Request.RawUrl.ToString(),@"(.*)404(.+)/(w+).html",@"$1$3.aspx",RegexOptions.IgnoreCase);                 //strNewUrl=Regex.Replace(Request.RawUrl.ToString(),@"(.+)[=](.+)(w+).html",@"$2$3.aspx",RegexOptions.IgnoreCase);
                   
//Response.Write(strNewUrl);
                   Response.Redirect(strNewUrl);
              }

              
else if (Regex.IsMatch(strRawUrl, @"(d{4})/(d{1,2})/(d{1,2})(/?)", RegexOptions.IgnoreCase))
              
{
                   strNewUrl 
= Regex.Replace(strRawUrl, @"(.+)[=](.+)(d{4})/(d{1,2})/(d{1,2})(/*)"@"default.aspx?log_Year=$3&log_Month=$4&log_Day=$5");
                   Response.Redirect(strNewUrl);
              }

              
string errMessage="你看到这个页面<br>肯定是什么地方出错了<br>人难免会犯错<br>机器亦然<br>如果你没有搞错地址<br><font color=red>多半是文件不存在或已被删除<br>请确认正确的“连接地址”后再尝试</font>";
              
              
if(Session["Error"]==null)  //接收Global中的应用程序异常信息
                   errMessage+="<br><br><br><font color=red><b>出现错误,已写入事件日志</b></font>";
              
else
errMessage
+="<br><br><br><font color=red><b>"+Session["Error"].ToString()+"</b></font>";     errMessage+="<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>";
              errMessage
+="<div align=center><script language=JavaScript src=http://www1.itsun.com/counter.php?uuid=1553318&style=icon></script></div><br><p align=center><font size=2><b>10秒后转入主页,稍候……</b></font></p>";
              Response.Write(errMessage);

       补充:在Global中捕获程序异常
上面同样的完成处理,不过地址栏显示的地址将不会变动,似乎有一点影响,所以我不打算用这个,不过做为一种思路还是可以考虑的 :),

                   //处理页面异常三种之一
              Exception objErr = Server.GetLastError().GetBaseException();
              
//Exception objErr = Server.GetLastError().Message;
              string err ="Error Caught in Application_Error event " +
                   
"Error in:" + Request.Url.ToString() +
                   
" Error Message:"+ objErr.Message.ToString() +
                   
" Stack Trace:"+ objErr.StackTrace.ToString();
              EventLog.WriteEntry(
"W_Blog",err,EventLogEntryType.Error);  //写入日志
              
//Server.ClearError();       //不清除  留给customerror处理  友好
              HttpContext.Current.Session["Error"]=err;
              Server.Transfer(
"404.aspx"); //404.aspx是所有错误与定向处理的页面
              
//Redirect会导致postback产生而丟失错误信息,所以直接在服务器端执行


 

另外,通过MSDLL来实现,注册、重写规则、……我这里就没不说了,

当然,通过以下方式也可实现:

                     <httpHandlers>

                   <add verb="*" path="*.aspx" type="MyHandler.NewHandler,MyHandler"/>

</httpHandlers>

       将其交给继承IHttpHandler接口的类来处理,大家可参考下MS的附加代码实现。

 

       《完》

0
0
查看评论

web.config中配置页面出错后跳转指定错误页面

每当用户访问错误页面时,会出现不友好的404错误,所以为了防止这种不友好,我们在web.config中的节点下配置 ,在出现比如403 404这样的错误时,跳转到我们自定义的页面   :用户错误配置节 该配置节能够指定当出现错误时,系统自动跳转到一个错误发生的页面,同时也能...
  • G1036583997
  • G1036583997
  • 2014-01-13 16:44
  • 1999

urlrewrite 的使用方法

、下载:  下载地址为http://tuckey.org/urlrewrite/#download  2、配置  将urlrewrite.jar包导入  然后在web.xml配置过滤器     &#...
  • linfanhehe
  • linfanhehe
  • 2016-07-05 18:01
  • 1454

UrlRewrite 关于地址重写来增加安全性

UrlRewrite 关于地址重写来增加安全性
  • lvkemitu
  • lvkemitu
  • 2016-11-28 09:15
  • 612

Java UrlRewrite 实现网站URL重写过程实录

现在大部分的网站和商城都会使用到URL重写,接触到这个,也是因为正在做的电子商务商城。URL重写,是将原有的URL采用另一种规则来显示,使得用户方便访问同时也屏蔽一些信息。   在此说下它的好处,在开发过程中,经常会遇到一些带了一大堆参数的URL,这样子,一方面显得烦乱,另一方面,一些信息直接显示...
  • tomcat_2014
  • tomcat_2014
  • 2015-07-30 13:37
  • 823

urlrewrite实现地址的重写

现在的web开发里面,对于地址的重写运用的较为广泛,他的意义很大,一是可以优化搜索,将所有的请求我们可以写成后缀为.htm或.html的方式,而是可以隐藏真实的请求地址对于系统而言是安全的,所以接下来就介绍一下他的发法 1:准备好jar包org.tuckey.web.filters.urlrewr...
  • pangliang_csdn
  • pangliang_csdn
  • 2016-05-03 15:16
  • 1024

urlrewrite(URL重写)配置技巧

http://cdn.rawgit.com/paultuckey/urlrewritefilter/master/src/doc/manual/4.0/index.html 官方文档。 支持对进站url的映射配置。进站url映射 <!-- 进站url 是/demo/xxx.html 的...
  • mr_zhuqiang
  • mr_zhuqiang
  • 2015-08-11 16:07
  • 1844

2.4 URLRouting和URLRewrite的区别

在学习和使用过URLRouting和URLRewrite以后,为了更好地了解和区分它们,很多开发人员喜欢将其二者做比较。毕竟两种方法都是在运行时对请求的URL进行处理。两者在创建URL和代码之间的分离非常有用,都可以帮助我们创建用于搜索引擎优化(Search Engine Optimization,...
  • CsethCRM
  • CsethCRM
  • 2014-03-04 19:10
  • 1009

在应用URLRewrite功能后自动输出重写过的URL

前两天看了老赵的重提URL Rewrite(4):不同级别URL Rewrite的一些细节与特点,并且有人留言问怎样自动输出重写后的URL。我看到之后非常有想法,事实上在我以前研究URL重写的时候也想过这个问题,如果有这种方法的话,将会给我们开发带来大大的方便。正好不久前我刚整理了一下HTML页面生...
  • m48o8gewuc
  • m48o8gewuc
  • 2017-05-30 11:03
  • 151

urlrewrite多参数重写 多参数

在urlrewrite.xml中配置重写的参数的时候要注意&用&amp;代替。参数后面的值用$123456---依次代替   ^/small/([0-9]+)/([0-9]+)/([0-9]+)/sort.jsp   ...
  • hepeng154833488
  • hepeng154833488
  • 2014-06-19 11:13
  • 2032

Request.RawUrl获取当前请求重写(UrlRewrite)Url的方法介绍

本文介绍下,使用Request.RawUrl获取当前请求重写(UrlRewrite)Url的方法,有需要的朋友,可以参考下。 浏览网站时,经常会遇到这样的情况: 当没有登录该网站时,访问的页面会直接跳转至登录页,并且网址中会有?RetrunURL=http//www.jbxue.com/user。...
  • kaosini
  • kaosini
  • 2014-03-10 09:49
  • 1314
    个人资料
    • 访问:407880次
    • 积分:5502
    • 等级:
    • 排名:第5775名
    • 原创:143篇
    • 转载:70篇
    • 译文:0篇
    • 评论:58条
    最新评论