我正在写这个问题,在这个过程中,它迫使我更加努力地思考,我自己回答了这个问题,尽管我仍然不完全明白为什么它解决了它。
我在共享主机上有一个帐户,注册了 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/ ?它怎么知道不向文档扩展名附加斜杠?