一种基于自定义代码的asp.net网站首页根据IP自动跳转指定页面的方法!

来源:互联网 发布:js 封装好的confirm 编辑:程序博客网 时间:2024/06/10 01:50
对于大中型网站,为了增强用户体验,往往需要根据不同城市站点的用户推送或展现相应个性化的内容,如对于一些大型门户网站的新闻会有城市站点的功能,如果没有设置相应的城市站点,默认就是根据用户访问的IP地址的所在城市自动设置。本文主要通过自定义扩展IHttpModule接口,考虑到性能IP数据库主要采用QQwry纯真IP数据库(但此数据库并非是官方的,我之前与ip138网站对比过,IP地址信息的准确性大概在90%左右),主要实现根据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;
  
namespaceNetOpen_System.Component
{
    publicsealed classWebsiteSkipHttpModule : IHttpModule
    {
        #region IHttpModule 成员
  
        publicvoid Dispose()
        {
        }
  
        publicvoid Init(HttpApplication context)
        {
            context.BeginRequest +=new EventHandler(context_BeginRequest);
        }
  
  
        #endregion
  
  
        voidcontext_BeginRequest(objectsender, EventArgs e)
        {
            try
            {
  
                //if (HttpContext.Current.Request.IsLocal)//忽略本地计算机请求
                //    return;
  
                //string ip = HttpContext.Current.Request.UserHostAddress;
                //string ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"].ToString();
                stringip = string.Empty;
                if(HttpContext.Current.Request.ServerVariables["HTTP_X_REAL_IP"] !=null)
                {
                    ip = HttpContext.Current.Request.ServerVariables["HTTP_X_REAL_IP"].ToString();
                }
                elseif (HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] !=null)
                {
                    ip = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();
                }
                elseif (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(@"~\IpData\qqwry.dat"));
  
                IPLocation ipaddress = qqWry.Query(ip); //查询一个IP地址
  
                stringls_city = ipaddress.Country;
                stringls_urlfrom = string.Empty;
                stringls_urlto = string.Empty;
                stringls_url = HttpContext.Current.Request.Url.AbsoluteUri;
                stringls_useragentkeyword = string.Empty;
               
                ExcludeUserAgentMatchEngine Em = WebsiteSkipConfiguration.GetConfig().ExcludeUserAgents;
  
                if(Em.ExcludeUserAgentList.Count > 0)
                {
                    foreach(ExcludeUserAgent ua inEm.ExcludeUserAgentList)
                    {
                        if(HttpContext.Current.Request.UserAgent.Contains(ua.keyword))
                        {
                            return;
                        }
                    }
                }
  
                UrlMatchEngine pu = WebsiteSkipConfiguration.GetConfig().SkipedUrls;
  
                if(pu.UrlList.Count > 0)
                {
                    foreach(SkipedUrl sk inpu.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>
复制代码

      该组件源代码下载地址:https://websiteskip.codeplex.com/,欢迎访问下载!虽然该组件实现并不复杂,原理也很简单,但较为实用,后续将增加根据IP138的网站进行实时查询,这样IP地址信息将更为精确,但对性能可能会有一些影响

原创粉丝点击