对于大中型网站,为了增强用户体验,往往需要根据不同城市站点的用户推送或展现相应个性化的内容,如对于一些大型门户网站的新闻会有城市站点的功能,如果没有设置相应的城市站点,默认就是根据用户访问的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(@"~\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>
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]