2012-08-04 36 views
3

HTTP_HOST和SERVER_NAME服務器變量通過HTTP請求(根據請求的方式可以是IP地址或負載平衡的DNS)爲我提供主機名。我找不到一個服務器變量,它會給我實際的機器名稱(即COMPUTERNAME環境變量的值)。是否有可能在IIS 7.5 URL重寫模塊規則中獲取當前機器名稱?

我想在服務器場上設置一些重定向規則,並且有一些基於當前機器名稱的規則(例如,內部機器名稱中有int)。我不想爲每臺機器創建單獨的規則,而是希望基於當前機器名稱擁有一些條件邏輯。我似乎無法找到一種方法來獲取機器名稱。

任何想法?

回答

3

在IIS7中計算機名稱不是內置服務器變量之一。然而,所有這些都不會丟失,通過使用自定義UrlRewrite提供程序的一些工作,您可以在重寫規則中顯示機器名稱。

斯科特·福賽思實際上已建成這樣的事情已經和寫博客文章描述了它的使用,並提供了源和預建的二進制+安裝程序:

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. 添加一個生成後事件來安裝提供裝配在你的開發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註冊商:

 
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 

接下來要做的是使用新的供應商在重寫規則,例如,這裏的斯科特給的例子是出站規則:

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