是否可以在IIS 7.5 Url重写模块规则中获取当前计算机名称?

时间:2012-08-04 16:00:54

标签: iis url-rewriting iis-7.5

HTTP_HOST和SERVER_NAME服务器变量为我提供HTTP请求中的主机名(可以是IP地址,也可以是根据请求的方式生成负载均衡的DNS)。我找不到一个服务器变量来给我实际的机器名称(即COMPUTERNAME环境变量的值)。

我正在尝试在服务器场上设置一些重定向规则,并且有一些基于当前计算机名称的规则(例如,内部计算机名称中有int)。我不想为每台机器创建单独的规则,而是希望有一些基于当前机器名称的条件逻辑。我似乎无法找到一种方法来掌握机器名称。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

在IIS7中计算机名称不是内置服务器变量之一。但是,所有这些都不会丢失,使用自定义UrlRewrite提供程序进行一些工作后,您可以在重写规则中显示您的计算机名称。

Scott Forsyth实际上已经构建了这样的东西,并撰写了一篇描述其用途的博客文章,并提供了源代码和预构建的二进制+安装程序:

  

URLRewrite ServerNameVariable Provider

为了在这篇文章消失的情况下保留这些信息,这里的步骤是松散的:

首先在Visual Studio中创建一个新的类库项目。您可以在此处找到执行此操作的步骤:

  

Developing a Custom Rewrite Provider for URL Rewrite Module (IIS.NET)

它们本质上是(如果链接死亡):

  1. 创建一个类库项目,并将其命名为ServerNameProvider您需要确保该项目是.NET 2.0或3.5项目。 IIS7.5托管代码支持仍然以2.0运行时为目标。

  2. 将默认的Class1.cs文件重命名为反映提供程序用途的名称,例如:ServerName.cs - 并确保源中的类名也反映了这一点。

  3. 添加对%ProgramFiles%\Reference Assemblies\Microsoft\IIS\Microsoft.Web.Iis.Rewrite.dll的引用。

  4. 在项目属性中,创建一个强名称密钥(在签名选项卡上)

  5. 添加构建后事件以在dev PC GAC中安装提供程序程序集(仅用于测试):

    CALL "%VS90COMNTOOLS%\vsvars32.bat" > NULL 
    gacutil.exe /if "$(TargetPath)"
    

    注意,如果使用Visual Studio 2010,则应将环境变量%VS90COMNTOOLS%更改为%VS100COMNTOOLS%

  6. 打开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;
        }
      }
    }
    
  7. 构建项目。在本地PC上,组件将安装到GAC中。

  8. 使用IIS注册提供程序:

  9. 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>