1

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

我希望我的所有文件都被重写为:welcome.aspx > welcome/、about.aspx > about/ 等,以实现我正在这样做:

<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>

到目前为止,这是可行的..但是当我运行这样的 URL 时,我还想在 default.aspx 上执行一些查询字符串函数: mysite.com/logout/ 这实际上是 mysite.com/default.aspx?action=由于此规则而注销:

<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 中的查询字符串函数的形式

有什么办法可以同时实现吗?

::::::::::: 编辑 :::::::::::::

我一直在尝试一整天..我非常接近以下设置:

<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>

几乎一切正常

用户.aspx > 用户

default.aspx?action=logout > 注销

user.aspx?action=comments > 用户/评论

唯一搞砸的是,如果我在用户 ie 之后添加一个斜杠。它将响应 default.aspx 规则并充当查询字符串.. 这不是有意的.. 有什么线索吗?

4

1 回答 1

1

你怎么能期望任何系统能够区分应该是页面名称的东西和作为参数的东西?

MVC 站点在这里要做的——并且你的 URL 系统与那个非常相似——是清楚地定义什么是什么。在您的情况下,您应该使用第一部分(欢迎,关于)作为视图 - 页面 - 部分并添加另一个代表该方法的级别。简而言之,使用 /default/logout 并将其重写为类似

{R:1}.aspx?action={R:2}

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

于 2012-12-19T17:57:48.637 回答