【发布时间】:2020-02-23 06:19:39
【问题描述】:
TL/DR:在同一请求期间,同一 URI 资源的多次重写(和最终重定向)是否可以链接到位于 URI 路径上的子文件夹中的多个 web.config 文件?
我正在尝试将我的经典 ASP 网站从一个共享虚拟主机迁移到另一个;新的使用 IIS7.5。我的网站有很多子域,新主机默认为每个子域使用一个真正的网站实例,但我的计划只允许其中的几个子域,并且由于它们的流量极低,一个网络服务器实例应该可以完美美好的。因此,我希望一个主要网站实例只为所有子域提供服务。
我在他们服务器上的路径类似于D:\websites\myaccount\mysite\wwwroot。为了清洁起见(将子域的所有文件分隔在它们自己的文件夹中)我已经为我的托管根文件夹中的每个子域设置了一个文件夹(例如D:\websites\myaccount\subdomain1),并在 wwwroot 下添加了虚拟文件夹映射名称到这些子域文件夹(例如虚拟文件夹subdomain1 映射到D:\websites\myaccount\subdomain1)。
然后我在主 wwwroot 文件夹的 web.config 中添加了重写规则,以拦截对子域的请求并重写它们以映射到虚拟文件夹;
<rule name="Subdomain support" stopProcessing="false">
<match url=".*" />
<conditions>
<add input="{HTTP_HOST}" pattern="^(subdomain1|subdomain2|subdomain3)\.mysite\.com$" />
</conditions>
<action type="Rewrite" url="{C:1}/{REQUEST_URI}" />
</rule>
使用这个,对http://subdomain1.mysite.com/dir1/file.asp 的请求确实可以通过来自D:\websites\myaccount\subdomain1\dir1\file.asp 的subdomain1 虚拟文件夹得到很好的服务。
我现在希望每个子域都能够将它自己的重写规则添加到组合中。最重要的是,对子域根目录的请求应该映射到最合适的语言子文件夹中的默认文件。因此,直接在 subdomain1 文件夹中,我有另一个 web.config 文件,其中包含:
<clear />
<rule name="subdomain root redirect to proper language subpath" stopProcessing="true">
<match url="^$" />
<conditions>
<add input="{HTTP_ACCEPT_LANGUAGE}" pattern="^(en|nl|de|es)" ignoreCase="true" />
</conditions>
<action type="Redirect" url="http://{HTTP_HOST}/{C:1}/index.asp" redirectType="Found" />
</rule>
<rule name="subdomain root redirect to default language subpath" stopProcessing="true">
<match url="^$" />
<action type="Redirect" url="http://{HTTP_HOST}/en/index.asp" redirectType="Found" />
</rule>
这应该将浏览器从subdomain1.mysite.com 重定向到subdomain1.mysite.com/en/index.asp(如果您的首选浏览器语言设置为“en.*”)。
但是,无论我做什么,我都无法理解这些规则。我甚至通过匹配.* 并将重定向更改为指向例如google.com,但服务器只是为我提供了 403 禁止,当我添加时:
<directoryBrowse enabled="true" />
我收到了子域文件夹本身的文件夹列表。我的重定向开始尖叫“我对你没有任何意义吗?!”,我想停止尖叫。
但是,当我输入 subdomain1.mysite.com/subdomain1/ 时,重定向确实会被拾取...我也尝试过重写到 wwwroot 下的常规(非虚拟)文件夹,并且表现出完全相同的症状。
我是否误以为这是可能的?难道是因为原始 URI 不包含文件夹路径中的(写入的)间歇 ...\subdomain1\... 部分,IIS 没有考虑该文件夹的 web.config 吗?
我的第一次尝试是使用 .htaccess (.irwaccess) 文件,但我很快发现它们不会继承(对吗?),所以这就是我研究 web.config 文件的原因。
【问题讨论】:
标签: url-rewriting iis-7.5