我有一个托管多个.NET网站的网络服务器。我设置的方式是服务器的根目录包含每个包含其内容的站点的文件夹。然后我在根目录中有一个web.config来处理URL,并根据用户访问的位置将用户指向正确的文件夹。
根目录:
这就是web.config看起来像这样:
<configuration>
<system.webServer>
<rewrite>
<rules>
<clear />
<rule name="SiteA" enabled="true" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_HOST}" pattern="^(www\.)?.siteAdomain\.com$" />
</conditions>
<action type="Rewrite" url="\SiteA\{R:0}" />
</rule>
<rule name="SiteB" enabled="true" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_HOST}" pattern="^(www\.)?.siteBdomain\.com$" />
</conditions>
<action type="Rewrite" url="\SiteB\{R:0}" />
</rule>
</rules>
</rewrite>
<urlCompression doStaticCompression="true" doDynamicCompression="true" />
</system.webServer>
</configuration>
SiteA也使用ASP.NET成员资格:
<authentication mode="Forms">
<forms name=".ASPXFORMSAUTH" loginUrl="~/account/login.aspx" />
</authentication>
问题在于,当我访问SiteA时,身份验证启动,我被重定向到loginUrl。但是,它正在解析相对于根文件夹而不是SiteA文件夹的路径,这导致404。
在研究之后,this site提到这是一个用.NET 3.5 SP1修补的错误。但是,我的托管服务是在.NET 4.X上运行IIS 8.0,所以我想我应该清楚这一点。
我在这里错过了一些简单的东西吗?
答案 0 :(得分:0)
在咨询以下网站后,我能够解决这个问题:
基本上,诀窍是只重写URL中没有网站名称的网址:
<rule name="SiteA" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{HTTP_HOST}" pattern="^(www\.)?.siteAdomain\.com$" />
<add input="{PATH_INFO}" pattern="^/SiteA/" negate="true" />
</conditions>
<action type="Rewrite" url="\SiteA\{R:0}" />
</rule>
<rule name="SiteB" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{HTTP_HOST}" pattern="^(www\.)?.siteBdomain\.com$" />
<add input="{PATH_INFO}" pattern="^/SiteB/" negate="true" />
</conditions>
<action type="Rewrite" url="\SiteB\{R:0}" />
</rule>