URL重写规则语法问题

时间:2011-09-07 05:04:27

标签: asp.net url-rewriting iis-7.5

我刚刚升级到VS2010 / IIS 7.5 / URL Rewrite 2.0。我想要做的事情很简单,但是我真的厌倦了尝试让它自己发挥作用。

我只想要 clean 网址,http://example.com/abc-def.aspx变为http://example.com/abc-def/,有效删除.aspx扩展名并添加尾部斜杠。

我通过使用:

完成了
<rule name="Trim aspx for directory URLs">
    <match url="(.+)\.aspx$" />
    <action type="Redirect" redirectType="Permanent" url="{R:1}/" />
</rule>

工作正常并按预期重定向,但不会拉起页面,所以我认为我需要将它与Rewrite规则结合起来,以便它将干净的URL解析为相应的.aspx页面。

我试图通过使用:

来做到这一点
<rule name="Add aspx extension back internally">
    <match url="^http://example\.com/(.+)/$" ignoreCase="true" />
    <conditions>
        <add input="{URL}" matchType="IsDirectory" negate="true" />
        <add input="{URL}" pattern=".+/externals/.+" negate="true" />
    </conditions>
    <action type="Rewrite" url="{R:1}.aspx" />
</rule>

重定向规则有效,但好像内部重写规则不起作用,因为页面没有拉起来。我做错了什么?

1 个答案:

答案 0 :(得分:1)

不确定是否有办法网址重写2.0 同时执行这两项操作:

  1. 删除.aspx扩展名并在进入请求时添加尾随斜杠/。
  2. 在内部添加.aspx扩展名,以便加载正确的页面而不是获取404。
  3. 我决定做的是在源代码中的任何地方进行更改以指向.aspx无扩展名的URL,这样就不会有以.aspx结尾的URL发出外部请求。

    这让我只需要:

    <rule name="Add aspx extension back internally" stopProcessing="true">
        <match url="(.+)/$" />
        <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        </conditions>
        <action type="Rewrite" url="{R:1}.aspx" />
    </rule>
    
    <rule name="Add trailing slash" stopProcessing="false">
        <match url="(.*[^/])$" />
        <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{URL}" pattern="favicon\.ico" ignoreCase="true" negate="true" />
            <add input="{URL}" pattern="\.axd" ignoreCase="true" negate="true" />
        </conditions>
        <action type="Redirect" url="{R:1}/" />
    </rule>