本文介紹的程序主要實現根據IP地址或地址段或IP所在城市進行自動跳轉到指定頁面的功能,需要的朋友可以參考下
對於大中型網站,為了增強用戶體驗,往往需要根據不同城市站點的用戶推送或展現相應個性化的內容,如對於一些大型門戶網站的新聞會有城市站點的功能,如果沒有設置相應的城市站點,默認就是根據用戶訪問的IP地址的所在城市自動設置。本文主要通過自定義擴展IHttpModule接口,考慮到性能IP數據庫主要采用QQwry純真IP數據庫,主要實現根據IP地址或地址段或IP所在城市進行自動跳轉到指定頁面的功能(支持Nginx作為前端反向代理服務器),該WebsiteSkip組件核心代碼如下: 代碼如下: using System; using System.Collections.Generic; using System.Text; using System.Web; using System.Xml; using System.IO; using System.Net; using System.Text.RegularExpressions; using NetOpen_System.Component.QQWry; namespace NetOpen_System.Component { public sealed class WebsiteSkipHttpModule : IHttpModule { #region IHttpModule 成員 public void Dispose() { } public void Init(HttpApplication context) { context.BeginRequest += new EventHandler(context_BeginRequest); } #endregion void context_BeginRequest(object sender, EventArgs e) { try { //if (HttpContext.Current.Request.IsLocal)//忽略本地計算機請求 // return; //string ip = HttpContext.Current.Request.UserHostAddress; //string ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"].ToString(); string ip = string.Empty; if (HttpContext.Current.Request.ServerVariables["HTTP_X_REAL_IP"] != null) { ip = HttpContext.Current.Request.ServerVariables["HTTP_X_REAL_IP"].ToString(); } else if (HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null) { ip = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString(); } else if (HttpContext.Current.Request.ServerVariables["HTTP_VIA"] != null) { ip = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString(); } else { ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"].ToString(); } QQWryLocator qqWry = new QQWryLocator(HttpContext.Current.Server.MapPath(@"~IpDataqqwry.dat")); IPLocation ipaddress = qqWry.Query(ip); //查詢一個IP地址 string ls_city = ipaddress.Country; string ls_urlfrom = string.Empty; string ls_urlto = string.Empty; string ls_url = HttpContext.Current.Request.Url.AbsoluteUri; string ls_useragentkeyword = string.Empty; ExcludeUserAgentMatchEngine Em = WebsiteSkipConfiguration.GetConfig().ExcludeUserAgents; if(Em.ExcludeUserAgentList.Count > 0) { foreach (ExcludeUserAgent ua in Em.ExcludeUserAgentList) { if (HttpContext.Current.Request.UserAgent.Contains(ua.keyword)) { return; } } } UrlMatchEngine pu = WebsiteSkipConfiguration.GetConfig().SkipedUrls; if (pu.UrlList.Count > 0) { foreach (SkipedUrl sk in pu.UrlList) { if (ls_city.Contains(sk.IpCity)) { if (sk.UrlFrom.Length > 0) { if (sk.UrlFrom.Contains(ls_url) && !ls_url.Contains(sk.OutKeyWord)) { if (sk.UrlTo.Length > 0) { HttpContext.Current.Response.Redirect(sk.UrlTo, true); } break; } } break; } } } if (WebsiteSkipConfiguration.GetConfig().IpChecks.GetIpIn(ip)) { ls_urlfrom = WebsiteSkipConfiguration.GetConfig().IpChecks.UrlFrom.Trim(); ls_urlto = WebsiteSkipConfiguration.GetConfig().IpChecks.UrlTo.Trim(); if (ls_urlfrom.Length > 0) { if (ls_urlfrom.Contains(ls_url) && !ls_url.Contains(WebsiteSkipConfiguration.GetConfig().IpChecks.OutKeyWord)) { if (ls_urlto.Length > 0) { HttpContext.Current.Response.Redirect(ls_urlto, true); } } } } } catch { } } } } 在部署方面,非常簡單主要利用IHttpModule接口並在Web.config中的HttpModule節點添加此組件的配置,訪問限制或允許參數可以在NetOpen_SystemWebsiteSkip.cfg.xml進行設置,以下為一個簡單的配置示例: 復制代碼 代碼如下: <?xml version="1.0" encoding="utf-8" ?> <NetOpen_System> <WebsiteSkip> <SkipedUrl> <add ipcity="溫州" urlfrom="http://examplesite.com/Default.aspx,http://examplesite.com/,http://examplesite.cn/, http://www.examplesite.cn" urlto="http://wz.mainwebsite.pcom/index.aspx" outkeyword="math"/> <add ipcity="鎮江" urlfrom="http://examplesite.com/Default.aspx,http://examplesite.com/,http://examplesite.cn/, http://www.examplesite.cn" urlto="http://jszj.mainwebsite.com/index.aspx" outkeyword="math"/> </SkipedUrl> <SkipedIP> <add ip1="220.186.0.0" ip2="220.186.255.255" urlfrom="http://examplesite.com/Default.aspx,http://examplesite.com/,http://examplesite.cn/, http://www.examplesite.cn" urlto="http://wz.mainwebsite.com/index.aspx" outkeyword="math"/> </SkipedIP> <ExcludeUserAgent> <add keyword="Baiduspider"> <add keyword="Sosospider"> <add keyword="Sogou web spider"> <add keyword="Sogou inst spider"> <add keyword="Sogou-Test-Spider"> <add keyword="Sogou Orion spider"> <add keyword="Gigabot"> <add keyword="0JJJSpider"> <add keyword="Sogou Pic Spider"> <add keyword="Googlebot"> <add keyword="Yeti/1.0"> </ExcludeUserAgent> </WebsiteSkip> </WebsiteSkip> </NetOpen_System>