【问题标题】:Subsequent IIS rewrite rules in web.config in (virtual) folder not being picked up未拾取(虚拟)文件夹中 web.config 中的后续 IIS 重写规则
【发布时间】: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.aspsubdomain1 虚拟文件夹得到很好的服务。

我现在希望每个子域都能够将它自己的重写规则添加到组合中。最重要的是,对子域根目录的请求应该映射到最合适的语言子文件夹中的默认文件。因此,直接在 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


    【解决方案1】:

    您的要求是将 subdomain1.mysite.com 重定向到 subdomain1.mysite.com/en/index.asp

    然后重写为 subdomain1.mysite.com/subdomain1/en/index.asp 对吗?

    如果启用 FRT,您将看到 subdomain1 下的重定向规则永远不会被执行。这是设计使然。

    在这种情况下,您只需将所有这些规则移动到根文件夹的 web.config 并修改顺序如下:

    IIS 支持根级别和应用程序级别的混合规则,但我认为在这种情况下您的规则不能分开。

    【讨论】:

    • 我无法访问 IIS 或 FRT 的 GUI 界面(我只能上传 web.config 文件),但我知道你要去哪里。我读到规则可以在 web.config 文件之间继承(附加/替换,对吗?),并且可以链接在同一个 web.config 文件中,但不能跨 web.config 文件链接。我猜当某个 URI 被某个 web.config 重写以使其指向磁盘上的另一个文件夹时,IIS(或重写模块)不会加载该新位置的 web.config 以从那里继续,对吗?跨度>
    • 不幸的是,我不想将所有内容混合到一个根 web.config 中(这会变得一团糟,并且我的网站的 100% 模块化性质会丢失),所以我选择了另一个替代方案——只需支付更多费用,让每个子域成为它自己的网站实例。不过感谢您的回答!
    猜你喜欢
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 2023-03-26
    • 2017-05-08
    • 2013-08-19
    相关资源
    最近更新 更多