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

对于大中型网站,为了增强用户体验,往往需要根据不同城市站点的用户推送或展现相应个性化的内容,如对于一些大型门户网站的新闻会有城市站点的功能,如果没有设置相应的城市站点,默认就是根据用户访问的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;
  
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( @"~\IpData\qqwry.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>
复制代码

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值