IIS url重写default.aspx和其他文件

时间:2012-12-19 15:55:45

标签: c# asp.net iis url-rewriting webforms

我刚刚在我的IIS服务器上安装了IIS Url Rewrite 2.0,并且我在执行某些重写时遇到了一些麻烦。这是我的麻烦:

我希望将所有文件重写为:welcome.aspx> welcome /,about.aspx>关于/等实现我这样做:

<rule name="Remove extension with slash" 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="{R:1}.aspx" appendQueryString="true" />
</rule>

到目前为止工作..但我在default.aspx上也有一些查询字符串函数我想要执行,当我运行这样的URL时:mysite.com/logout/其实是mysite.com/default.aspx ?action = logout由于这个规则:

<rule name="Friendly URL" 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="default.aspx?action={R:1}" appendQueryString="true" />
</rule>

但是它不会执行第二个规则,因为它会查找不存在的logout.aspx文件,只能在我的default.aspx中使用查询字符串函数的形式

我能以两种方式实现这两种目标吗?

::::::::::: EDITS ::::::::::::

我现在一整天都在尝试..我接近以下设置:

<rule name="Remove ext" stopProcessing="true">
    <match url="^([^/]+)/?$" />
    <conditions>
        <add input="{REQUEST_FILENAME}.aspx" matchType="IsFile" negate="false" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    </conditions>
    <action type="Rewrite" url="{R:1}.aspx" appendQueryString="true" />
</rule>

<rule name="Default actions" 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="default.aspx?action={R:1}" appendQueryString="true" />
</rule>

<rule name="Other files with querystrings" 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="{R:1}.aspx?action={R:2}" appendQueryString="true" />
</rule>

几乎一切正常

user.aspx&gt;用户

default.aspx?action = logout&gt;注销

user.aspx?action = comments&gt;用户/评论

如果我在用户之后添加斜杠,那么只会弄乱它。它将响应default.aspx规则并充当查询字符串..这不是意图..任何线索?

1 个答案:

答案 0 :(得分:1)

您如何期望任何系统区分应该是页面名称的东西和作为参数的东西?

MVC网站在这里做什么 - 你的网址系统非常类似 - 是为了清楚地定义什么是什么。在您的情况下,您应该使用第一部分(welcome,about)作为视图 - 页面 - 部分并添加另一个代表该方法的级别。简而言之,使用/ default / logout并将其重写为类似

的内容
{R:1}.aspx?action={R:2}

如果你真的想要像你所说的那样查看你的URL(/ logout没有/ default部分),你可以添加一个单独重写它们的规则(与OR |匹配)或添加一个重定向到的Logout.aspx Default.aspx?action = logout - 但这很难看。寻求干净的解决方案。