HTTP_HOST和SERVER_NAME服务器变量为我提供HTTP请求中的主机名(可以是IP地址,也可以是根据请求的方式生成负载均衡的DNS)。我找不到一个服务器变量来给我实际的机器名称(即COMPUTERNAME环境变量的值)。
我正在尝试在服务器场上设置一些重定向规则,并且有一些基于当前计算机名称的规则(例如,内部计算机名称中有int
)。我不想为每台机器创建单独的规则,而是希望有一些基于当前机器名称的条件逻辑。我似乎无法找到一种方法来掌握机器名称。
有什么想法吗?
答案 0 :(得分:3)
在IIS7中计算机名称不是内置服务器变量之一。但是,所有这些都不会丢失,使用自定义UrlRewrite提供程序进行一些工作后,您可以在重写规则中显示您的计算机名称。
Scott Forsyth实际上已经构建了这样的东西,并撰写了一篇描述其用途的博客文章,并提供了源代码和预构建的二进制+安装程序:
为了在这篇文章消失的情况下保留这些信息,这里的步骤是松散的:
首先在Visual Studio中创建一个新的类库项目。您可以在此处找到执行此操作的步骤:
Developing a Custom Rewrite Provider for URL Rewrite Module (IIS.NET)
它们本质上是(如果链接死亡):
创建一个类库项目,并将其命名为ServerNameProvider
。 您需要确保该项目是.NET 2.0或3.5项目。 IIS7.5托管代码支持仍然以2.0运行时为目标。
将默认的Class1.cs
文件重命名为反映提供程序用途的名称,例如:ServerName.cs
- 并确保源中的类名也反映了这一点。
添加对%ProgramFiles%\Reference Assemblies\Microsoft\IIS\Microsoft.Web.Iis.Rewrite.dll
的引用。
在项目属性中,创建一个强名称密钥(在签名选项卡上)
添加构建后事件以在dev 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']" /commit:apphost
确保上面命令行中的PublicKeyToken
值与程序集的公钥标记匹配。您可以通过执行sn.exe -T <assemblyfile.dll>
来提取该值,例如:
e:\AppDev\..bin\Debug> sn.exe -T ServerNameVariable.dll Microsoft (R) .NET Framework Strong Name Utility Version 4.0.30319.1 Copyright (c) Microsoft Corporation. All rights reserved. Public key token is 5854ff76fb5c07af
接下来要做的是在重写规则中使用新的提供程序,例如,这里是Scott给出的示例,它是一个出站规则:
<outboundRules>
<rule name="Set Custom Header" enabled="true">
<match serverVariable="RESPONSE_X_Machine_Name" pattern=".*" />
<action type="Rewrite" value="{ServerNameVariable:}" />
</rule>
</outboundRules>
这是一个简单的入站规则,如果计算机名称为BOB
,则重定向到google.com:
<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>