是否可以在 IIS7 中使用通配符映射

是否可以在 IIS7 中使用通配符映射

我想指向用户 test1.domain.com test2.domain.com 等,而无需在 IIS7 中手动添加标头绑定。这可能吗?如果不能自动添加,我可以通过编程方式添加主机标头吗?

答案1

是的你可以。

可以使用通配符 SSL 证书和单个 IP。

我可以详细说明如何使用自签名通配符来测试这一点。

先决条件

  • MakeCert.exe(应该是 Visual Studio 安装的一部分或可在此处下载
  • winhttpcertcfg.exe(可在此处下载
  • APPCMD(Vista/Server 2008/Windows 7 的一部分)
  • 使用 MMC 的个人和本地计算机的“证书”管理单元

方法

从命令提示符执行以下命令

makecert -r -pe -n CN=*.domain.com -ss my -sr currentuser -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 wildcard.domain.cer

然后

  • 从 RUN 命令或开始菜单中,键入 MMC
  • 文件 > 添加或删除管理单元 - 选择证书,单击添加,选择我的用户帐户,单击完成
  • 重复上一步并选择我的电脑(然后选择本地计算机)
  • 单击“确定”
  • 展开证书 - 当前用户 > 个人 > 证书
  • 右键单击 *.domain.com,然后选择“所有任务”>“导出”。PFX 文件包含此证书的公钥和私钥,因此要求输入密码。
  • 将证书从当前用户 > 个人 > 证书复制或移动到本地计算机 > 受信任的根证书颁发机构 > 证书
  • 将 PFX 导入本地计算机 > 个人 > 证书(这将是您的 Web 服务使用的证书。

现在让我们创建你的 Web 服务器

  • 整理你的环境:)

删除现有的演示应用程序池和站点

%windir%\system32\inetsrv\Appcmd delete site "Demo 1"
%windir%\system32\inetsrv\Appcmd delete site "Demo 2"
%windir%\system32\inetsrv\Appcmd delete AppPool "Demo 1 App Pool"
%windir%\system32\inetsrv\Appcmd delete AppPool "Demo 2 Portal App Pool"
  • 建立SSL环境

告诉 Windows 网络服务被允许访问你的通配符证书。并告诉它将证书绑定到你的 IP 地址上的端口 443

PathToWinHTTPCertCfg\winhttpcertcfg -g -i "wildcard.domain.com.pfx" -c LOCAL_MACHINE\My -a “Network Service” -p MySecretPassword
 netsh http add sslcert ipport=<YOURLOCALIPADDRESS>:443 certhash=<CERTIFICATE THUMBPRINT> appid=<A GUID IN THE FORM OF {ab3c58f7-8316-42e3-bc6e-771d4ce4b201}>
  • 创建应用程序池和站点

这是创建应用程序池和站点的代码

%windir%\system32\inetsrv\Appcmd add site -id:100 -name:"Demo 1" -bindings:http/*:80:YOURLOCALIPADDRESS -physicalPath:<PathToDemo1Source> -logfile.directory:<PathToPutLogFilesIn> -traceFailedRequestsLogging.directory:<PathToPutTraceFiles>
%windir%\system32\inetsrv\Appcmd set app "Demo 1/" -applicationPool:"Demo 1 App Pool"
%windir%\system32\inetsrv\Appcmd set site /site.name:"Demo 1" /+bindings.[protocol='https',bindingInformation='*:443:demo1.domain.com']

%windir%\system32\inetsrv\Appcmd add site -id:200 -name:"Demo 2" -bindings:http/*:80:YOURLOCALIPADDRESS -physicalPath:<PathToDemo2Source> -logfile.directory:<PathToPutLogFilesIn> -traceFailedRequestsLogging.directory:<PathToPutTraceFiles>
%windir%\system32\inetsrv\Appcmd set app "Demo 2/" -applicationPool:"Demo 2 App Pool"
%windir%\system32\inetsrv\Appcmd set site /site.name:"Demo 2" /+bindings.[protocol='https',bindingInformation='*:443:demo2.domain.com']

...那应该是你 ;) 享受吧!

答案2

据我所知,IIS7 中的主机头只有两个选项。

  1. 您可以为每个想要处理的域设置主机头/类型/端口/ip。
  2. 您没有设置主机头,但在想要处理多个域的网站上包含类型/端口/ip。

选项 2 的缺陷是它会响应该端口上的任何请求,并且您将无法在没有主机头的情况下在另一个站点上使用同一端口。

您可能可以在服务器级别加载 ISAPI 过滤器,以便在请求到达处理的主机头部分之前拦截它,但设置一个脚本来处理选项#1 可能会更容易。

答案3

通过设置通配符 DNS 条目,您可以让任意多个名称进入您的默认网站。一旦用户访问该网站,如果您需要将其重定向到另一个网站,请让您的 default.asp 文件查找 HOST 标头以确定是否需要重定向,否则,继续加载网站的其余部分。

参考:

IIS7 中的通配符主机标头

HTTP 标头列表

我不太擅长 Web 开发,但这至少可以帮你入门。

相关内容