这是否可以配置 IIS7 以实现与 Apache 有关通配符域的相同功能?我对基于 URL 中使用的子域用户在 ASP.NET Web 应用程序中路由用户感兴趣。
这里描述了类似的东西:
http://steinsoft.net/index.php?site=programming/articles/apachewildcarddomain
谢谢
这是否可以配置 IIS7 以实现与 Apache 有关通配符域的相同功能?我对基于 URL 中使用的子域用户在 ASP.NET Web 应用程序中路由用户感兴趣。
这里描述了类似的东西:
http://steinsoft.net/index.php?site=programming/articles/apachewildcarddomain
谢谢
答案是否定的,IIS7(仍然)不支持通配符主机名(请参阅this)。如果您想在一个网站上服务多个域,目前唯一的解决方法,正如 notandy 建议的那样,是使用专用 IP 并使用支持通配符的 DNS 来实现。
为了完整起见,IIS8 还没有这个特性。
最后,Windows 2016 中的 IIS 10 支持通配符子域。
IIS 是否支持通配符主机头?我可以捕获 *.mydomain.com 并将其重定向到一个网站吗?
答案是是/否。是的,因为您可以将 *.mydomain.com 重定向到一个网站。不,因为神奇在于 DNS 而不是 IIS。
操作方法如下:
在 IIS MMC 中,配置一个没有主机标头的网站,然后为该站点分配一个 IP 地址。(如果您在框中有一个 IP 地址,则可以跳过此步骤)。有了这个,网站将绑定到特定的 IP 并监听所有发送到 IP 的 HTTP 请求,你就完成了:)
下一步是确保您的名称解析适用于通配符查询并使用正确的 IP 地址进行回复。如果您使用 Microsoft DNS 服务,它将不允许您创建 '*' A 记录(假设您已经在 DNS MMC 中创建了域区域),您需要执行以下操作:
%windir%\system32\dns\
* A IP.IP.IP.IP
请注意,通过这样做,所有 * 都会响应您之前配置的 IP。例如 abc.mydomain.com、www.mydomain.com、K2k.mydomain.com 等。
要验证它是否正常工作,请尝试 ping 实用程序ping (insert anything here).mydomain.com
,您应该会收到来自 IP.IP.IP.IP 的回复
然后尝试浏览 http://(在此处插入任何内容).mydomain.com/,您应该获得与配置相同的网页。
您不能在 Microsoft 的 DNS 中创建通配符 (*) A 记录,但可以创建通配符CNAME
。如果您要做的只是将所有子域定向到特定 IP,这将起作用。例如,如果您有 的 A 记录www.mydomain.com
,您可以添加 的CNAME
记录*.mydomain.com
并将其指向www.mydomain.com
。请求标头中的主机名仍将是子域,因此您的 Web 应用程序应该能够根据需要捕获并处理它。
如果您使用 Web 平台安装程序 ( http://www.microsoft.com/web/downloads/platform.aspx ) 并安装“URL 重写”模块,则可以使用 IIS。如果您添加“*.example.com”之类的“A”记录,这将允许将所有子域发送到您的 IIS 服务器。在 IIS 服务器中,您只需将 URL 重写规则添加到默认网站即可执行您想做的任何事情,例如重定向到另一个 URL。当用户输入“xyz.example.com”时,您可以重定向到“example.com”,并将所有未知子域指向根域。步骤是:
安装 Web 平台安装程序:http: //www.microsoft.com/web/downloads/platform.aspx
运行它,搜索“URL Rewrite”,然后安装它。
转到默认网站,然后打开“URL 重写”。
单击最右侧的“添加规则”。
命名规则并设置以下内容:
请求的 URL:匹配模式
使用:正则表达式
图案: (。*)
逻辑分组:匹配所有
添加新条件(单击“添加..”按钮),并设置:
条件输入:{CACHE_URL}
检查输入字符串是否:匹配模式
模式(根据需要修改):(http|https)://(.*?)\.rootdomain\.tld
单击[确定]。
现在向下滚动到操作并设置:
操作类型:重定向
重定向 URL(根据需要修改):{C:1}://rootdomain.tld{R:0}
当您单击正则表达式模式条目旁边的“测试模式”按钮时,“{C:#}”和“{R:#}”来自测试窗口。您可以匹配服务器值的一部分并在以后重用它。
此外,您可能需要查看有关在 URL 中传递 HTTP/HTTPS 的提示(上面第 6 步中的“{C:1}”):http ://weblogs.asp.net/owscott/url-rewrite-协议-http-https-in-the-action
更新 2:链接断开,升级到 IIS 10,它现在支持通配符。
更新:这工作了一段时间,一段时间后,我被多个请求轰炸了。我不会推荐这种方法。
确保您的 DNS 记录设置正确(*->@ 的 CNAME 记录),它将完美运行。使用多个域进行测试。
链接已损坏,以前是 http://pzxc.com/apache-style-wildcard-hostname-rewrite-rules-in-iis
对于无法升级到 IIS 10+ 的用户,通过反向代理启用通配符主机名支持并不是很困难。
HTTP 示例如下,而其他设置只是几个步骤。
在包罗万象的站点上创建重写规则以将请求发送到两个站点,
<system.webServer>
<rewrite>
<rules>
<rule name="site1" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{HTTP_HOST}" pattern="^(.*).site1.com$" />
</conditions>
<action type="Rewrite" url="http://localhost:8091/{R:0}" />
</rule>
<rule name="site2" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{HTTP_HOST}" pattern="^(.*).site2.com$" />
</conditions>
<action type="Rewrite" url="http://localhost:8092/{R:0}" />
</rule>
</rules>
</rewrite>
</system.webServer>
请注意,在服务器级别,ARR 代理模式必须打开,
<system.webServer>
<proxy enabled="true" />
</system.webServer>
IIS 10 通配符主机名更简单,性能也更好,因为 ARR 有它的开销(但一般来说可以忽略不计)。