2009-07-23 26 views
8

是否可以直接從web.config禁用某些用戶代理?某些機器人似乎不遵循robots.txt,爲了避免毫無意義的服務器負載(和日誌文件垃圾郵件),我想阻止某些類別的請求(特別是基於用戶代理或非常可能的IP地址)繼續進行。使用web.config禁止用戶代理

如果您知道是否有可能阻止將這些請求完全記錄到IIS的日誌文件中,則可以獲得獎勵分數。 (即if-request-match,轉發到/ dev/null,如果你明白我的意思)。

win2003的解決方案會更好,但這是一個反覆出現的問題 - 如果IIS7有一個乾淨的解決方案,但不是IIS6,我很樂意知道它。

編輯:對不起'先前不完整的問題,我有標籤+意外進入。

回答

11

這可以使用IIS7中的URLRewrite模塊輕鬆完成。但我真的不知道這是否會阻止這些請求被記錄。

<rewrite> 
    <rules> 
    <rule name="Ban user-agent RogueBot" stopProcessing="true"> 
     <match url=".*" /> 
     <conditions> 
     <add input="{HTTP_USER_AGENT}" pattern="RogueBotName" /> 
     <add input="{MyPrivatePages:{REQUEST_URI}}" pattern="(.+)" /> 
     </conditions> 
     <action type="AbortRequest" /> 
    </rule> 
    </rules> 
    <rewriteMaps> 
    <rewriteMap name="MyPrivatePages"> 
     <add key="/PrivatePage1.aspx" value="block" /> 
     <add key="/PrivatePage2.aspx" value="block" /> 
     <add key="/PrivatePage3.aspx" value="block" /> 
    </rewriteMap> 
    </rewriteMaps> 
</rewrite> 
+0

那麼,該網站是足夠小,使IIS日誌不是一個perf。問題;它主要是噪聲,我不介意避免 - 但這種解決方案正是我所希望的 - 一些可中止某些請求的可配置模塊。我會研究它,謝謝! – 2009-07-24 08:38:03

+0

你知道是否有可能爲多個機器人創建一個規則? – UpTheCreek 2011-02-11 09:14:15

+0

@UpTheCreek它是一種模式,只要你有一個正則表達式來標識你想要查找的所有機器人,你就可以將它插在那裏。不過,我會小心的,如果你不小心,殺死正常的流量似乎有點危險。 – 2015-07-24 15:19:05

0

不要以爲你可以從web.config(web.config中的授權是爲用戶,而不是機器人)做到這一點。你最好的選擇是爲IIS本身提供某種自定義的ISAPI過濾器。有一個blog about this here。祝你好運!

3

你可以寫一個自定義的ASP.Net HttpModule,就像我爲我的網站所做的那樣,禁止一些流氓機器人。代碼如下:

public class UserAgentBasedRedirecter : IHttpModule 
{ 
    private static readonly Regex _bannedUserAgentsRegex = null; 
    private static readonly string _bannedAgentsRedirectUrl = null; 

    static UserAgentBasedRedirecter() 
    { 
      _bannedAgentsRedirectUrl = ConfigurationManager.AppSettings["UserAgentBasedRedirecter.RedirectUrl"]; 
      if (String.IsNullOrEmpty(_bannedAgentsRedirectUrl)) 
       _bannedAgentsRedirectUrl = "~/Does/Not/Exist.html"; 

      string regex = ConfigurationManager.AppSettings["UserAgentBasedRedirecter.UserAgentsRegex"]; 
      if (!String.IsNullOrEmpty(regex)) 
       _bannedUserAgentsRegex = new Regex(regex, RegexOptions.IgnoreCase | RegexOptions.Compiled); 
    } 

    #region Implementation of IHttpModule 

    public void Init(HttpApplication context) 
    { 
      context.PreRequestHandlerExecute += RedirectMatchedUserAgents; 
    } 

    private static void RedirectMatchedUserAgents(object sender, System.EventArgs e) 
    { 
      HttpApplication app = sender as HttpApplication; 

      if (_bannedUserAgentsRegex != null && 
       app != null && app.Request != null && !String.IsNullOrEmpty(app.Request.UserAgent)) 
      { 
       if (_bannedUserAgentsRegex.Match(app.Request.UserAgent).Success) 
       { 
        app.Response.Redirect(_bannedAgentsRedirectUrl); 
       } 
      } 
    } 

    public void Dispose() 
    { } 

    #endregion 
} 

您需要在web.config中註冊它並指定用於匹配用戶代理字符串的正則表達式。這裏有一個我曾經禁止msnbot/1.1流量:

<configuration> 
    <appSettings> 
     <add key="UserAgentBasedRedirecter.UserAgentsRegex" value="^msnbot/1.1" /> 
    </appSettings> 
... 
    <system.web> 
     <httpModules> 
      <add name="UserAgentBasedRedirecter" type="Andies.Web.Traffic.UserAgentBasedRedirecter, Andies.Web" /> 
     </httpModules> 
    </system.web> 
</configuration> 
+0

這看起來更像我所尋找的:-)謝謝!你碰巧知道這是否防止請求被記錄?可能不會吧? – 2009-11-30 08:32:48

+1

沒有檢查,但我會想象,因爲這已經通過ASP.Net管道,它已經在日誌中 – emertechie 2009-11-30 11:19:34