IIS7 URL重写Mod会导致不需要的效果

时间:2009-12-18 01:01:44

标签: asp.net regex mod-rewrite iis-7

这可能更像是一个正则表达式问题,但它正在推动我们的发布。我无法想出一个聪明的解决方案。

基本上,我们想将www.oursite.com/Games.aspx?g=classic&m=etc重写为www.oursite.com/classic/?m=etc

问题是规则本身(至少由IIS7的URL Rewrite mod生成)如下所示:

<rewrite>
      <rules>
        <rule name="RedirectUserFriendlyURL1" stopProcessing="true">
          <match url="^Games\.aspx$" />
          <conditions>
            <add input="{REQUEST_METHOD}" negate="true" pattern="^POST$" />
            <add input="{QUERY_STRING}" pattern="^g=([^=&amp;]+)$" />
          </conditions>
          <action type="Redirect" url="{C:1}" appendQueryString="false" redirectType="Permanent" />
        </rule>
        <rule name="RewriteUserFriendlyURL2" stopProcessing="true">
          <match url="([^/]+)/?$" />
          <conditions>
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
          </conditions>
          <action type="Rewrite" url="Games.aspx?g={R:1}" />
        </rule>
      </rules>
    </rewrite>

因此,正在重写与类似模式匹配的任何其他文件,例如Item /?id = 23。另外,我们的脚本资源文件正在被重写,因此整个网站会抛出30个javascript错误。根据我们的规格,我们的规格中不可接受的是www.oursite.com/Games/classic或www.oursite.com/g/classic。有解决方案吗Manythanks!

1 个答案:

答案 0 :(得分:2)

也许不是在第二个规则中匹配([^/]+)/?$,而是在正则表达式OR语句中明确说明要重写哪些内容:

(classic|somethingelse|athirdsomething)/?$

这样只会修改您明确要重写的项目。我不知道有多少这些你可能需要重写,所以如果它是一个很大的数字,这可能是不可行的,但如果它只是几个类别,那么它可能是最直接的。

或者,如果只有某些前缀不应该被重写,你可以简单地添加模式匹配那些前缀的否定条件到你的重写。