HTTP_HOST 和 SERVER_NAME 服务器变量为我提供了来自 HTTP 请求的主机名(可以是 IP 地址或基于请求方式的负载平衡 DNS)。我找不到可以提供实际机器名称的服务器变量(即 COMPUTERNAME 环境变量的值)。
我正在尝试在服务器场上设置一些重定向规则,并且有一些基于当前机器名称的规则(例如,内部机器int
的名称中有)。我不想为每台机器创建单独的规则,而是希望有一些基于当前机器名称的条件逻辑。我似乎无法找到获取机器名称的方法。
有任何想法吗?
HTTP_HOST 和 SERVER_NAME 服务器变量为我提供了来自 HTTP 请求的主机名(可以是 IP 地址或基于请求方式的负载平衡 DNS)。我找不到可以提供实际机器名称的服务器变量(即 COMPUTERNAME 环境变量的值)。
我正在尝试在服务器场上设置一些重定向规则,并且有一些基于当前机器名称的规则(例如,内部机器int
的名称中有)。我不想为每台机器创建单独的规则,而是希望有一些基于当前机器名称的条件逻辑。我似乎无法找到获取机器名称的方法。
有任何想法吗?
在 IIS7 中,计算机名称不是内置服务器变量之一。但是,一切都不会丢失,通过使用自定义 UrlRewrite 提供程序进行一些工作,您可以在重写规则中显示您的机器名称。
Scott Forsyth 实际上已经构建了类似的东西,并写了一篇描述其使用的博客文章,并提供了源代码和预构建的二进制 + 安装程序:
为了在该文章消失的情况下保留此信息,此处松散地执行以下步骤:
首先在 Visual Studio 中创建一个新的类库项目。您可以在此处找到执行此操作的步骤:
它们本质上是(以防链接失效):
创建一个类库项目并将其命名为ServerNameProvider
. 您需要确保项目是 .NET 2.0 或 3.5 项目。IIS7.5 托管代码支持仍然针对 2.0 运行时。
将默认Class1.cs
文件重命名为反映提供者目的的名称,例如:ServerName.cs
- 并确保源中的类名也反映这一点。
添加对: 的引用 %ProgramFiles%\Reference Assemblies\Microsoft\IIS\Microsoft.Web.Iis.Rewrite.dll
。
在项目属性中创建一个强名称密钥(在签名选项卡上)
添加构建后事件以在您的开发 PC GAC 中安装提供程序程序集(仅用于测试):
CALL "%VS90COMNTOOLS%\vsvars32.bat" > NULL
gacutil.exe /if "$(TargetPath)"
请注意,如果使用 Visual Studio 2010,则环境变量%VS90COMNTOOLS%
应更改为%VS100COMNTOOLS%
.
打开ServerName.cs
文件并确保你的类实现了Microsoft.Web.Iis.Rewrite.IRewriteProvider
接口:
using System.Collections.Generic;
using Microsoft.Web.Iis.Rewrite;
namespace ServerNameVariable
{
public class ServerName : IRewriteProvider
{
public void Initialize(IDictionary<string, string> settings,
IRewriteContext rewriteContext)
{
}
public string Rewrite(string value)
{
return System.Environment.MachineName;
}
}
}
构建项目。在您的本地 PC 上,程序集将安装到 GAC 中。
向 IIS 注册提供程序:
appcmd.exe set config -section:system.webServer/rewrite/providers /+"[name='ServerNameVariable',type='ServerNameVariable.ServerName, ServerNameVariable, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5854ff76fb5c07af']" /提交:应用程序主机
确保PublicKeyToken
上面命令行中的值与程序集的公钥令牌匹配。您可以通过执行提取该值sn.exe -T <assemblyfile.dll>
,例如:
e:\AppDev\..bin\Debug> sn.exe -T ServerNameVariable.dll Microsoft (R) .NET Framework 强名称实用程序版本 4.0.30319.1 版权所有 (c) 微软公司。版权所有。 公钥令牌是 5854ff76fb5c07af
接下来要做的是在重写规则中使用您的新提供程序,例如,这是 Scott 给出的出站规则示例:
<outboundRules>
<rule name="Set Custom Header" enabled="true">
<match serverVariable="RESPONSE_X_Machine_Name" pattern=".*" />
<action type="Rewrite" value="{ServerNameVariable:}" />
</rule>
</outboundRules>
这是一个简单的入站规则,如果机器名称是,则重定向到 google.com BOB
:
<rewrite>
<rules>
<rule name="TestServerVariableProvider"
enabled="true"
stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{ServerNameVariable:}" pattern="BOB" />
</conditions>
<action type="Redirect"
url="http://google.com"
appendQueryString="false"
redirectType="Found" />
</rule>
</rules>
</rewrite>