4

我正在写这个问题,在这个过程中,它迫使我更加努力地思考,我自己回答了这个问题,尽管我仍然不完全明白为什么它解决了它。

我在共享主机上有一个帐户,注册了 2 个域。我正在使用 Asp.Net 堆栈来运行一些东西,例如博客和我计划最终启动的另一个网站。我的两个域都指向根;第一个是我用来注册的原始文件,第二个是我添加的根域指针。这是我希望它的行为方式:

目录结构:

根 (www.domain1.com)
根 --\ 博客 (www.domain1.com/blog)
Root --\ Site2(如果 www.domain2.com 则应指向此处)
根 --\ Site2 --\ 垃圾 (www.domain2.com/junk)

现在,如果您输入 www.domain1.com 或 www.domain1.com/blog,它的行为符合预期,我对此很好。对于 www.domain2.com,我的重写规则配置如下(来自 web.config):

<rule name="Domain2">
    <match url="(.*)(/)?" ignoreCase="false" />
    <conditions logicalGrouping="MatchAll">
        <add input="{HTTP_HOST}" pattern="(www\.)?domain2\.com" ignoreCase="false" />
    </conditions>
    <action type="Rewrite" url="/site2/{R:1}" />
</rule>

如果主机是 domain2.com,则该规则应该匹配任何路径,选择请求资源的路径并正确格式化。因此,当有人在 IIS 中键入 www.domain2.com/junk/default.aspx 时,它会在用户不知道的情况下解析为 www.domain2.com/site2/junk/default.aspx。除非用户未在子文件夹中键入尾部斜杠,否则这主要是按广告宣传的那样工作。IE:

www.domain2.com (works)
www.domain2.com/ (works)
www.domain2.com/junk/ (works)
www.domain2.com/junk (不工作!) IIS 7 在这里失去理智并格式化它就像 www.domain2.com/site2/junk 一样,因为会自动为尾部斜杠发出第二个请求并发生 404。

因此,我将操作更新为:

<action type="Rewrite" url="/site2/{R:1}/" />

这似乎已经解决了它,但是为什么 IIS 7 现在不吐出 www.domain2.com/junk2/default.aspx/ ?它怎么知道不向文档扩展名附加斜杠?

4

1 回答 1

3

www.domain2.com/junk 不起作用,因为您在匹配中添加了斜杠,但要匹配的实际 url 不包含它。它只包含“垃圾”。

您还需要添加:

<rule name="Domain2" stopProcessing="true">

因此,如果找到匹配项,它不会评估其他规则。我怀疑您可能会发现让您感到困惑的是您设置的其他规则。

于 2009-04-25T19:19:08.427 回答