未拾取(虚拟)文件夹中 web.config 中的后续 IIS 重写规则
Subsequent IIS rewrite rules in web.config in (virtual) folder not being picked up
TL/DR:在同一请求期间,是否可以将同一 URI 资源的多次重写(和最终重定向)链接到多个 web.config 文件,这些文件位于 URI 路径的子文件夹中?
我正在尝试将我的经典 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" />
我收到了子域文件夹本身的文件夹列表。我的重定向开始尖叫 "Do I mean nothing to you?!",我想停止尖叫。
但是,当我输入 subdomain1.mysite.com/subdomain1/
时,重定向确实被拾取了...我也尝试重写到 wwwroot 下的常规(非虚拟)文件夹中,并且表现出完全相同的症状.
我是不是误以为这是可能的?可能是因为原始 URI 不包含文件夹路径中的(写入的)间歇性 ...\subdomain1\...
部分,所以 IIS 不考虑该文件夹的 web.config 吗?
我的第一次尝试是使用 .htaccess (.irwaccess) 文件,但我很快发现它们不继承(对吗?),所以这就是我研究 web.config 文件的原因。
您的要求是将 subdomain1.mysite.com 重定向到 subdomain1.mysite.com/en/index.asp.
然后改写成subdomain1.mysite.com/subdomain1/en/index.asp对吧?
如果启用 FRT,您将看到 subdomain1 下的重定向规则将永远不会执行。这是设计使然。
在这种情况下,您应该将所有这些规则移动到根文件夹的 web.config 并修改顺序如下:
IIS 支持根级别和应用程序级别的混合规则,但我认为在这种情况下您的规则不能分开。
TL/DR:在同一请求期间,是否可以将同一 URI 资源的多次重写(和最终重定向)链接到多个 web.config 文件,这些文件位于 URI 路径的子文件夹中?
我正在尝试将我的经典 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" />
我收到了子域文件夹本身的文件夹列表。我的重定向开始尖叫 "Do I mean nothing to you?!",我想停止尖叫。
但是,当我输入 subdomain1.mysite.com/subdomain1/
时,重定向确实被拾取了...我也尝试重写到 wwwroot 下的常规(非虚拟)文件夹中,并且表现出完全相同的症状.
我是不是误以为这是可能的?可能是因为原始 URI 不包含文件夹路径中的(写入的)间歇性 ...\subdomain1\...
部分,所以 IIS 不考虑该文件夹的 web.config 吗?
我的第一次尝试是使用 .htaccess (.irwaccess) 文件,但我很快发现它们不继承(对吗?),所以这就是我研究 web.config 文件的原因。
您的要求是将 subdomain1.mysite.com 重定向到 subdomain1.mysite.com/en/index.asp.
然后改写成subdomain1.mysite.com/subdomain1/en/index.asp对吧?
如果启用 FRT,您将看到 subdomain1 下的重定向规则将永远不会执行。这是设计使然。
在这种情况下,您应该将所有这些规则移动到根文件夹的 web.config 并修改顺序如下:
IIS 支持根级别和应用程序级别的混合规则,但我认为在这种情况下您的规则不能分开。