一种基于自定义代码的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;
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地址信息将更为精确,但对性能可能会有一些影响
- 一种基于自定义代码的asp.net网站首页根据IP自动跳转指定页面的方法!
- 分享 ASP.Net 网站设置 404错误跳转到指定页面的三种方法
- asp.net倒计时自动跳转指定页面
- 网站自动跳转中英文页面的方法
- Asp.net中页面跳转的方法
- asp.net页面间跳转的方法
- ASP.NET中七种页面跳转的方法
- ASP.NET中七种页面跳转的方法
- ASP.NET中七种页面跳转的方法
- 一种基于自定义代码记录用户访问日志在Sharepoint网站的应用方法!
- ASP.NET页面的跳转
- ASP根据IP来判断跳转页面
- dede首页添加根据IP访问区域跳转对应页面
- ASP.NET 用读取二进制代码的方法在页面上显示指定图片。
- ASP.NET 2.0 实现无刷新页面的一种方法
- 页面回发后,让页面自动滚动到指定位置的一种简单的方法
- 跳转页面asp.net提供的三种方法比较
- asp.net跳转页面的三种方法比较
- Redis经验谈
- Adaptive background mixture models for real-time tracking
- GridView中日期不显示时分秒
- 线程之后台线程(一)
- Silverlight实战示例2(兼集合属性的妙用)--实体的组织
- 一种基于自定义代码的asp.net网站首页根据IP自动跳转指定页面的方法!
- 给表空间增加数据文件的时候遇到ORA-00470错误,数据库也崩溃了!
- 计算机视觉方向好的博客整理
- 网站漏洞扫描工具
- linux 启动项配置
- hibernate 由表生成实体类 反向引擎方式
- HttpClient 操作工具类---
- 创建型模式——建造者模式
- 2013暑期规划