Hello World
Spiga

重提URL Rewrite(2):使用已有组件进行URL Rewrite

2008-01-13 00:27 by 老赵, 23372 visits

可能已经没有人会使用上一篇文章中的方法进行URL Rewrite了,因为提供URL Rewrite的组件早已铺天盖地了。

ASP.NET级别的URL Rewrite组件的原理很简单,其实只是监听BeginRequest事件,并且根据配置来决定目标URL。在我之前接触过的项目中,发现使用URLRewriter作为URL Rewrite组件的频率非常高,我想可能是因为那是微软提供的东西吧。

如果要使用URLRewriter,首先自然就是在web.config中配置一个HttpModule:

<httpModules>
  <add name="ModuleRewriter"
       type="URLRewriter.ModuleRewriter, URLRewriter" />
</httpModules>

然后就是进行配置了(注:强烈建议使用configPath属性将配置提取成额外的文件,便于管理):

<configSections>
  <section name="RewriterConfig"
           type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />
</configSections>
<RewriterConfig>
  <Rules>
    <RewriterRule>
      <LookFor>~/tag/([\w]+)/</LookFor>
      <SendTo>~/Tags.aspx?Tag=$1</SendTo>
    </RewriterRule>
  </Rules>
</RewriterConfig>

正则表达式是一个非常了不得的东西,能匹配,能捕获。在上面的例子中,我们把符合LookFor条件的“/tag/xxx”重新定位到Tags.aspx页面上,并且将xxx作为Tag这个QueryString项的值,这样就能够在代码中通过HttpContext.Request.QueryString["Tag"]来获得该值了。

URLRewriter的功能对于大多数应用来说已经足够了,但是我总是不喜欢。但如果非要问我不喜欢的原因,我也难说出个子丑寅卯来。可能仅仅是这个配置方式的问题吧。在使用URL Rewriter时,配置段往往会非常长,每个配置项需要从<RewriterRule>到</RewriterRule>共4行代码,一个规模不大的项目都很容易出现上百行的配置。“这也太XML了”,我想,为什么不用XML Attribute呢?这样每个配置项就能缩短为1行了——不过,这是题外话。

所以如果我目前要做URL Rewrite,往往用的是Intelligencia出品的开源组件UrlRewriter.NET。虽然这个名字和前一个非常相似,但是功能却远超前者。该组件在使用上和URLRewriter比较接近(其实似乎所有的URL Rewrite组件都差不多),我们要做的也只是配置:

<configSections>
  <section name="rewriter"
           type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler,
                 Intelligencia.UrlRewriter" />
</configSections>
 
<rewriter>
  <rewrite url="^/User/(\d+)$" to="~/User.aspx?id=$1" processing="stop" />
  <rewrite url="^/User/(\w+)$" to="~/User.aspx?name=$1" processing="stop" />
</rewriter>
 
<system.web>
  <httpModules>
    <add name="UrlRewriter"
         type="Intelligencia.UrlRewriter.RewriterHttpModule,
               Intelligencia.UrlRewriter" />
  </httpModules>
</system.web>

我们主要来看一下重写规则的配置项<rewriter />。与URLRewriter不同的是,UrlRewriter.NET使用了我喜欢的每规则一个节点的方式,这让整个项目的重写规则简洁不少。不过processing="stop"又是什么意思?这就要谈到UrlRewriter.NET在处理重写规则时的方法了。UrlRewriter.NET在找到一个匹配的重写规则时,不会就此停止,而会继续寻找其余的匹配项,最终生效的则是能够匹配当前请求的最后一个重写规则。如果我们需要UrlRewriter.NET在找到某个匹配项之后即生效,就需要将processing属性设为stop。例如在上面的配置里,如果“/User/”后紧跟着数字,则会使用用户ID进行查找,否则则认为当前所提供的是用户名。

如果UrlRewriter.NET仅仅是因为配置上显得比较简洁,它与URLRewriter相比实在没有什么优势。但是UrlRewriter.NET的能力远不止此,我们刚才使用的其实只是它提供的Action之一,初次之外它还提供了许多Action:

  • if
  • unless
  • rewrite
  • redirect
  • setstatus
  • forbidden
  • gone
  • not-allowed
  • not-found
  • not-implemented
  • addheader
  • setcookie
  • setproperty

光有Action还不够,UrlRewriter.NET还提供了Condition、Transform、Default Document、 Parser、Error Handler、Logger等功能,并且能够通过Expression来“表示”复杂的逻辑。这哪还是配置,简直就是编程了!没错,用UrlRewriter.NET完全就可以通过配置来将一些请求——回复的逻辑表示出来,这无疑为我们带来了很大的方便。在这里我不可能详细说明UrlRewriter.NET的方方面面,感兴趣的朋友可以从它官方网站所提供的Reference来一窥究竟。

“得组件如此,夫复何求”,不过我在这里还是要推荐另外一个组件。因为在某些特殊情况下,UrlRewriter.NET还不能满足我们的要求。嗯?不是能自行扩展吗?没错,可是——先卖个关子,本系列的最后一篇中来说明这个问题。UrlRewriter.NET提供了ASP.NET层面上的URL Rewriter。如果要在IIS层面上进行URL Rewrite,那么还必须使用其他方式。ISAPI Rewrite是IIS层面上进行URL Rewrite的著名组件,很可惜这是个商业组件,需要我们使用美刀来购买。因此我在这里推荐另一个开源产品:IIRF(Ionic's Isapi Rewrite Filter)

由于是在IIS层面进行URL Rewrite,IIRF的配置方式和UrlRewriter.NET是不同的。如果要使用IIRF,则需要将IsapiRewrite4.dll添加到Web Site的ISAPI Filter列表中:

Add ISAPI Filter

IIRF是通过ini文件来配置的,IsapiRewrite4.ini与IsapiRewrite4.dll放在同样的目录中即可:

RewriteRule    ^/User/(\d+)$    /User.aspx?id=$1      [I, L]
RewriteRule    ^/User/(\w+)$    /User.aspx?name=$1    [I, L]

IIRF的重写规则是“RewriteRule    <url-pattern>    <destination>    [<modifiers>]”,每个部分之间的空格数目没有限制,不过一定要是空格,而不能是Tab等其他空白字符。“url-pattern”和“destination”自不必多说,关键在于modifier。IIRF的modifier有不少,在这里我先只介绍上面用到的两个。“I”表示匹配时大小写无关,“L”的作用和UrlRewriter.NET里的processing="stop"类似,IIRF在找到该匹配项时立即生效,而不会继续查找下去。

IIRF虽然是一个开源的组件,但是功能依然比较强大。尤其是结合了RewriteCond(Rewrite Condition)之后,可以实现比较复杂的重写规则。例如以下的配置则把UserAgent里包含Googlebot字样的根目录请求重写到某个特定的资源上:

RewriteCond    %{HTTP_USER_AGENT}    ^Googlebot.*
RewriteRule    ^/    $/Googlebot.html    [L]

最后,我们来看一下两种组件Rewrite的区别。显然,最大的区别就在于它们是不同层面上的重写,下面的两幅示意图就描述了在两种情况下它们是如何将原本应该得到“404 Resource Not Found”结果的“/User/jeffz”请求重写至“/User/name=jeffz”的。

首先是UrlRewriter.NET在ASP.NET层面上的URL Rewrite:

ASP.NET级别URL Rewrite

接着是IIRF在IIS层面上的URL Rewrite:

ASP.NET级别URL Rewrite

有了这两个组件,相信我们已经再也不需要其他东西来实现URL Rewrite了。

相关链接:

(1)IIS与ASP.NET

(3)在URL Rewrite后保持PostBack地址

(4)不同级别URL Rewrite的一些细节与特点

Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名赵劼(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言

Add your comment

67 条回复

  1. TerryLee
    *.*.*.*
    链接

    TerryLee 2008-01-13 00:42:00

    URLRewriter在配置方式的确有些“莫名其妙”,记得好像还有一个叫做UrlRewriting.net的重写组件,这几个名字太像了...

    对了还应该提一下URL重写时的图片和CSS路径问题

  2. 在线代理[未注册用户]
    *.*.*.*
    链接

    在线代理[未注册用户] 2008-01-13 00:44:00

    图片问题确实麻烦,不过俺现在用mod_rewrite了。

  3. 老赵
    admin
    链接

    老赵 2008-01-13 00:57:00

    @TerryLee
    其实还行。
    为了避免麻烦,一般所有的图片和CSS其实我都会用绝对路径引用的,比如“/Images/abc.jpg”。
    而CSS里用到的图片,都是通过相对CSS路径来,所以问题其实不大。

  4. 老赵
    admin
    链接

    老赵 2008-01-13 00:58:00

    @在线代理
    mod_rewrite不是apache的吗?

  5. 3333333333[未注册用户]
    *.*.*.*
    链接

    3333333333[未注册用户] 2008-01-13 01:10:00

    类似二级域名的重写,xxxx.cnblogs.com这种,UrlRewriter.NET可以实现么?

  6. 老赵
    admin
    链接

    老赵 2008-01-13 01:15:00

    @3333333333
    没有尝试过,不过既然能够扩展,那么最多扩展一下,呵呵。

  7. Awen
    *.*.*.*
    链接

    Awen 2008-01-13 02:06:00

    创建 rewriter 的配置节处理程序时出错: 未能从程序集“Intelligencia.UrlRewriter”中加载类型“Intelligencia.UrlRewriter.Configuration
    出现这个问题哦!

  8. 老赵
    admin
    链接

    老赵 2008-01-13 02:57:00

    @Awen
    恩,不能那样换行,把下面一行提到上面来吧。

  9. 老赵
    admin
    链接

    老赵 2008-01-13 02:58:00

    @Awen
    文章里已经改好了。

  10. 李华星
    *.*.*.*
    链接

    李华星 2008-01-13 03:43:00

    知道URL Rewriter, 没研究过, 看了LZ文章, 有些理解了

  11. Awen
    *.*.*.*
    链接

    Awen 2008-01-13 05:36:00

    @Jeffrey Zhao
    老赵也太强了吧,呵呵,这么晚,而且还发了第三篇,呵呵,我是睡了一个下午了!

  12. 学习![未注册用户]
    *.*.*.*
    链接

    学习![未注册用户] 2008-01-13 09:00:00

    我用DNT里的 IIS REwrite ,很方便好用,但不知道这是那个厂商提供的,是否涉及版权???

  13. je[未注册用户]
    *.*.*.*
    链接

    je[未注册用户] 2008-01-13 13:16:00

    如果我有个www.yourname.com:8081相关的URL,有没有什么IIS的REWRITE可以映射到www.yourname.com上的

  14. 老赵
    admin
    链接

    老赵 2008-01-13 13:56:00

    @je
    这是服务器的概念,如果要实现这个,应该在服务器上设端口和主机头。

  15. Leem
    *.*.*.*
    链接

    Leem 2008-01-13 15:11:00

    URLRewriter、URLRewriter.Net、UrlRewritingNet,还真是大同小异。不知道哪个比较合适。

  16. Ariel Y.
    *.*.*.*
    链接

    Ariel Y. 2008-01-14 08:05:00

    @3333333333

    可以

  17. Qingping&David
    *.*.*.*
    链接

    Qingping&David 2008-01-15 15:26:00

    支持转换为html/htm么?不要Rewrite后还是aspx?

  18. 老赵
    admin
    链接

    老赵 2008-01-15 23:01:00

    @Qingping&David
    自然都可以

  19. Cat Chen
    *.*.*.*
    链接

    Cat Chen 2008-01-16 16:02:00

    @Jeffrey Zhao
    apache的mod_rewrite很出名,不过另外一写开源的以mod形式支持ISAPI同类功能得Web服务器软件也有各自的mod_rewrite。(说不定就有一个IIS的mod_rewrite,哈哈。)

  20. legio
    *.*.*.*
    链接

    legio 2008-01-21 23:53:00

    有位能提供URLRewriter.Net的C#示例代码学习一下呀!好想知道它强大的功能呢

  21. yma[未注册用户]
    *.*.*.*
    链接

    yma[未注册用户] 2008-01-29 16:27:00

    我用了开源的IIRF,怎么就是调不出来呢,郁闷啊,请博主指导

  22. Ariel Y.
    *.*.*.*
    链接

    Ariel Y. 2008-01-29 17:38:00

    @yma
    试试重启服务器和IIS,一般就好了

  23. 阿滨
    *.*.*.*
    链接

    阿滨 2008-03-15 11:21:00

    用vs2005的时候可以把www.abc.com/abc/xxx 映射到
    www.abc.com/abc.aspx?tag=xxx
    可是换到IIS上就无法找到文件.老赵这个是怎么回事啊
    我用的是Intelligencia.UrlRewriter

  24. 老赵
    admin
    链接

    老赵 2008-03-16 12:35:00

    @阿滨
    在IIS里设置Wildcard Mapping

  25. Qingping[未注册用户]
    *.*.*.*
    链接

    Qingping[未注册用户] 2008-03-17 01:16:00

    @Jeffrey Zhao
    Wildcard Mapping 那里设置??我用的是XP,IIS6.0.

  26. 老赵
    admin
    链接

    老赵 2008-03-17 11:45:00

    @Qingping
    XP不是IIS 5.0吗?怎么设搜索一下就知道了。

  27. Qingping[未注册用户]
    *.*.*.*
    链接

    Qingping[未注册用户] 2008-03-17 23:29:00

    @Jeffrey Zhao
    多谢老赵,网上搜了一下,Wildcard Mapping 是II6+里面的新功能,我用的是XP II5.1,我本来想在XPpro sp2上安装IIS6.0,结果用了很多方法没有成功,看来只有在Windows Server2003上去体验这个功能了。。。

  28. 老赵
    admin
    链接

    老赵 2008-03-17 23:52:00

    @Qingping
    IIS5也可以的,再某个地方设“*”就行了,我以前用过。

  29. jone_linux[未注册用户]
    *.*.*.*
    链接

    jone_linux[未注册用户] 2008-03-27 17:22:00

    我照你的写了,可是打入http://localhost:8083/User/12346确是没找到页面,为啥呢?

    <configuration>
    <configSections>
    <section
    name="rewriter" type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler,Intelligencia.UrlRewriter"
    />
    </configSections>
    <rewriter>
    <rewrite url="^/User/(\d+)$" to="~/index_error.html" processing="stop" />
    </rewriter>
    <system.web>
    <httpModules>
    <add
    name="UrlRewriter"
    type="Intelligencia.UrlRewriter.RewriterHttpModule,Intelligencia.UrlRewriter"
    />
    </httpModules>
    </system.web>
    </configuration>

  30. 老赵
    admin
    链接

    老赵 2008-03-27 21:33:00

    index_error.html不存在?

  31. jone_linux[未注册用户]
    *.*.*.*
    链接

    jone_linux[未注册用户] 2008-03-28 07:52:00

    @Jeffrey Zhao
    当然是有的了,在根目录下的~~IIS不用设什么?我的WIN2003,IIS6

    兄弟有QQ或MSN么,如果方便的话加我QQ:2561108或MSN:lily456789@hotmail.com,,单位要做这个,急啊~~~

  32. 老赵
    admin
    链接

    老赵 2008-03-28 10:38:00

    @jone_linux
    iis6的isapi wildcard mapping设了吗?

  33. jone_linux[未注册用户]
    *.*.*.*
    链接

    jone_linux[未注册用户] 2008-03-28 12:32:00

    @Jeffrey Zhao
    没有啊,我们用的是虚拟的空间,不能够对IIS进行设置啊,
    aspx后缀也需要对IIS设置?
    晕~~~

    兄弟有QQ或MSN么,如果方便的话加我QQ:2561108或MSN:lily456789@hotmail.com,,单位要做这个,急啊~~~

  34. jone_linux[未注册用户]
    *.*.*.*
    链接

    jone_linux[未注册用户] 2008-03-28 14:31:00

    另外,
    1、如果我要传二个以上的参数该怎么办?

  35. 老赵
    admin
    链接

    老赵 2008-03-28 18:14:00

    @jone_linux
    无论几个参数,完全根据URL映射来实现。

  36. 老赵
    admin
    链接

    老赵 2008-03-28 18:14:00

    @jone_linux
    我怀疑是因为IIS没有设wildcard mapping导致请求没有被asp.net处理,因此找不到文件,因为根本还没于进入rewrite阶段。这个和服务提供商确认一下吧。
    // 我msn上人太多了,我们通过右下角的窗口联系吧。

  37. ZeroOne
    *.*.*.*
    链接

    ZeroOne 2008-04-06 19:48:00

    有个比较弱的问题想请教。
    UrlRewriter.NET的文档里有一个介绍如何启用Debug Logger说明,地址是:
    http://urlrewriter.net/index.php/support/reference/loggers/debug-logger/

    我把配置加到config里面以后,怎么找不到显示Log的地方啊?
    还是说只有出错的时候才会显示Log。

    感谢。

  38. 老赵
    admin
    链接

    老赵 2008-04-07 01:11:00

    @ZeroOne
    不好意思,这个我没有研究过。

  39. Kevin  Li
    *.*.*.*
    链接

    Kevin Li 2008-05-26 09:36:00

    我按照你说的方法,在vs2008中调试 怎么还是没有重写的效果呢? 多谢指导

  40. 老赵
    admin
    链接

    老赵 2008-05-26 09:39:00

    @Kevin Li
    哪个方法?

  41. Kevin  Li
    *.*.*.*
    链接

    Kevin Li 2008-05-26 11:04:00

    就是这个 发现使用URLRewriter作

  42. 安东[未注册用户]
    *.*.*.*
    链接

    安东[未注册用户] 2008-06-22 09:45:00

    感谢老赵的博客,关注了很久了。。。。谢谢分享


    我也是因为看了你的博客所以才用了url 重写的。。

    现在发现一个问题,就是使用isapi_rewrite 或 IIRF 都无法在win2003 sp2 ii6 下加载,不知道是什么原因,目录权限都甚至都给了 everyone的所有控制权了,可是还是不能加载。

    IIRF 我测试了:
    IonicIsapiRewriter-1[1].2.14-bin.zip
    IonicIsapiRewriter-1[1].2.12d-bin.zip
    IonicIsapiRewriter-1[1].2.15a-bin.zip
    IonicIsapiRewriter-2[1].0a-bin.zip

    isapi_rewrite lite 2.9
    但是在xp下就都可以加载。怎么也找不到问题

  43. 老赵
    admin
    链接

    老赵 2008-06-22 17:28:00

    @安东
    我这里都是好好的

  44. 安东[未注册用户]
    *.*.*.*
    链接

    安东[未注册用户] 2008-06-23 17:06:00

    谢谢 老赵的回答

    我这里在虚拟机wmware 6中测试是新装win2003 sp2 试验了好多次,不知怎么的突然可以用了,提示已经加载,优先级为低,但是我在服务器上装(不是虚拟机) 却怎么也不行,就是加载状态未知,无法加载,事件查看器中,提示无法加载。

    我机器上安装了 mcafee 8.5i+sp5 mcafee Hip7.0

  45. 安东[未注册用户]
    *.*.*.*
    链接

    安东[未注册用户] 2008-06-24 00:10:00

    IIRF 采用 XXX/XXX/ 目录样式URL

    IIRF 重写url后 打开页面中调用图片,css,js文件时要进行重写,这样影响性能。

    如何让调用图片,css,js 不通过IIRF重写 过滤呢?来提升性能

  46. 老赵
    admin
    链接

    老赵 2008-06-24 09:32:00

    --引用--------------------------------------------------
    安东: IIRF 采用 XXX/XXX/ 目录样式URL

    IIRF 重写url后 打开页面中调用图片,css,js文件时要进行重写,这样影响性能。

    如何让调用图片,css,js 不通过IIRF重写 过滤呢?来提升性能
    --------------------------------------------------------
    判断.jpg也总归要判断的,所以没有办法不进行一次处理。
    这不会成为瓶颈的,放心。

  47. Freeness[未注册用户]
    *.*.*.*
    链接

    Freeness[未注册用户] 2008-07-02 15:59:00

    楼主:这是我在ISAPI_Rewrite里面写的
    RewriteCond Host: (?!www\.|test\.)([^.]+\.xxxx\.com
    RewriteRule [/]+ /KtvBusinessInfo\.aspx\?id=$1 [I,L]

    RewriteCond Host: (?!www\.|test\.)([^.]+\.xxxx\.com
    RewriteRule [/]+ /BarBusinessInfo\.aspx\?id=$1 [I,L]

    因为他们实现二级域名的参数都是一样的。但他们不是同一个模块。在查找的时候默认成了/KtvBusinessInfo\.aspx\?id=$1这个模块。请问有什么办法可以区别开他们是不一样的啊。

  48. 天草麟
    *.*.*.*
    链接

    天草麟 2008-07-29 14:41:00

    Intell.urrewriter 发现重写后图片路径 样式非常非常麻烦。

  49. 老赵的粉丝[未注册用户]
    *.*.*.*
    链接

    老赵的粉丝[未注册用户] 2009-01-05 11:50:00

    Intelligencia.UrlRewriter重写后确实是路径麻烦,不像MS的urlRewrite.dll一样可以自动改写。。。
    老赵,我在项目中用了app_themes,改写路径后,CSS样式文件还是当前页面相对的,有办法解决吗?

  50. seek
    *.*.*.*
    链接

    seek 2009-01-24 21:47:00

    @老赵的粉丝
    用..转移到root下,然后绝对引用。

  51. MicroCoder
    *.*.*.*
    链接

    MicroCoder 2009-02-21 14:10:00

    <rewrite url="^/User/(\d+)$" to="~/User.aspx?id=$1" processing="stop" /> 这段代码中的url="^/User/(\d+)$"好像不行呀,出现404错误呢,改为:url="~/User/(\d+)$" 就可以了~~~ 什么原因呢?

  52. 老赵
    admin
    链接

    老赵 2009-02-21 18:12:00

    @MicroCoder
    不清楚,我没有看过代码,试过就可以了吧,呵呵。

  53. 雨帝夜泪
    *.*.*.*
    链接

    雨帝夜泪 2009-09-28 11:11:00

    不知道还能得到你的回复不。。。
    通过这样的在本地重写是没问题的。
    <rewrite url="^/User/(\d+)$" to="~/User.aspx?id=$1" processing="stop" />
    但是上传到服务器之后,会显示404错误,改为
    @MicroCoder的办法,将^替换为~,又是500错误。
    文件rewrite是没问题的。

  54. 老赵
    admin
    链接

    老赵 2009-09-28 11:15:00

    @雨帝夜泪
    IIS里没设wildcard mapping?

  55. 雨帝夜泪
    *.*.*.*
    链接

    雨帝夜泪 2009-09-28 17:18:00

    谢谢赵兄的回复。
    因为服务器是客户的另外一家供应商在维护的。
    不知道具体情况,不过我会按照您的这个提示在本地搭建个测试服务器试一下,非常感谢您的回复!

  56. 雨藤
    *.*.*.*
    链接

    雨藤 2010-01-21 10:38:00

    谢谢老赵,努力学习中ing……

  57. weirongguo[未注册用户]
    *.*.*.*
    链接

    weirongguo[未注册用户] 2010-03-07 14:57:00

    为什么我用
    <RewriterConfig configPath="~/App_Data/URLRewriter.xml"/>
    <RewriterConfig file="~/App_Data/URLRewriter.xml"/>
    这两种方式来引用规则文件都不起作用呢?能解释一下吗?谢谢!!!

  58. Zzk[未注册用户]
    *.*.*.*
    链接

    Zzk[未注册用户] 2010-03-16 01:13:00

    这几天使用URLRewriter做伪静态页面,,出现一些问题。。迟迟未能解决。。半夜来到老赵博客请教。。
    www.123.com/a.aspx?title=abc
    重写到:
    www.123.com/abc/

    功能实现了 ,只是所有的样式和图片全都失效了。。
    还请老赵指点一二。。

  59. Zzk[未注册用户]
    *.*.*.*
    链接

    Zzk[未注册用户] 2010-03-16 01:14:00

    还有。。如果是文章页面,按照 年/月/日 重写成可删节URL 的话。。 。对应深度地址。。 CSS和图片也要相应目录才行呢。。这个又如果和解决》
    有通用的 规则么???

  60. 老赵
    admin
    链接

    老赵 2010-03-16 09:14:00

    @Zzk
    忽略不需要匹配的URL啊,这个难道不是最简单的事情吗?

  61. Zzk[未注册用户]
    *.*.*.*
    链接

    Zzk[未注册用户] 2010-03-16 11:02:00

    请细说!没明白!!

  62. Zzk[未注册用户]
    *.*.*.*
    链接

    Zzk[未注册用户] 2010-03-16 11:03:00

    @Jeffrey Zhao
    没明白呀..

  63. weirongguo[未注册用户]
    *.*.*.*
    链接

    weirongguo[未注册用户] 2010-03-21 17:16:00

    我在做伪静态的时候也遇到了一些问题,特来请教老赵!还请老赵指点!

    我的规则是
    <RewriterConfig>
    <Rules>
    <RewriterRule>
    <LookFor>~/Forum-(.[0-9]*)\-(.[0-9]*)\.html$</LookFor>
    <SendTo>~/Forum.aspx?ForumID=$1&amp;Page=$2</SendTo>
    </RewriterRule>
    <RewriterRule>
    <LookFor>~/Forum-(.[0-9]*)\-(.[0-9]*)\.aspx$</LookFor>
    <SendTo>~/Forum.aspx?ForumID=$1&amp;Page=$2</SendTo>
    </RewriterRule>
    <RewriterRule>
    <LookFor>~/Thread-(.[0-9]*)\-(.[0-9]*)\-(.[0-9]*)\.html$</LookFor>
    <SendTo>~/Thread.aspx?ThreadID=$1&amp;ForumID=$2&amp;Page=$3</SendTo>
    </RewriterRule>
    <RewriterRule>
    <LookFor>~/Thread-(.[0-9]*)\-(.[0-9]*)\-(.[0-9]*)\.aspx$</LookFor>
    <SendTo>~/Thread.aspx?ThreadID=$1&amp;ForumID=$2&amp;Page=$3</SendTo>
    </RewriterRule>
    </Rules>
    </RewriterConfig>
    把它放在配置文件里就行,但是放在单独的xml文件却无论如何都不成功我的应用方式是<RewriterConfig configPath="~/App_Data/URLRewriter.xml"/>
    <RewriterConfig file="~/App_Data/URLRewriter.xml"/>
    这两种都不行,这种问题该怎么解决,谢谢!!

  64. 老赵
    admin
    链接

    老赵 2010-03-21 17:38:00

    @weirongguo
    最多自己看代码吧,我猜会不会和不支持~/...有关

  65. tangself
    *.*.*.*
    链接

    tangself 2010-03-23 16:34:00

    谢谢你的好文章,以前只知道在httphanler中处理urlwriter,原来还可以在globax中,

    我想问你一个问题

    比喻像这种网址: http://www.****.com/book

    那么它可能会urlwriter,

    我怎么在测试时就是显示页面不存在!

    我猜,我的iis把http://www.****.com/book定到

    http://www.****.com/book/index.aspx中去了,

    是不是》???

    还是我配置有问题???

    我用的方法应该不会错,我测试过很多,都不对,我现想起了你的文章,还是想不出办法

    麻烦实质性的提醒一下
    谢谢

  66. 链接

    奎彤 2010-11-23 18:21:41

    请问若在IIS层实现URL Rewrite功能,而不是用第三方元件实现的话,如何在开发环境(Visual Studio)执行类似/User/123这种尚未被IIS重写过的URL?

  67. gsralex
    123.6.92.*
    链接

    gsralex 2011-11-27 22:34:38

    没有attribute是现成的微软提供的实体 序列化(XmlSerializer)就管用,不需要再重写了

发表回复

登录 / 登录并记住我 ,登陆后便可删除或修改已发表的评论 (请注意保留评论内容)

昵称:(必填)

邮箱:(必填,仅用于Gavatar

主页:(可选)

评论内容(大于5个字符):

  1. Your Name yyyy-MM-dd HH:mm:ss

使用Live Messenger联系我