`
gladstone
  • 浏览: 70931 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

善用Referer变量 -- 针对搜索引擎来源用户的提示

阅读更多

  1. 前言
  2. 实现效果
  3. 实现思路
  4. Java编码实现
  5. 其他 

1 前言:

注意到不少站点都有这个功能(包括javaeye和pconline)。

就是从百度/谷歌等搜索页面点过来的用户可以看见页面下方有搜索帮助提示,如图:

ScreenShot012 

前一阵子给CTBA也加上了相关功能, 这里大致说说实现方法。 

2 实现效果:

百度搜索”扯谈 新闻风”

ScreenShot025

点击进入CTBA的网站, 页面底部显示提示

 

3 实现思路:

参考了这篇文章, 利用请求的referer头. 如果乃还不知道referer是什么的话, 点这里

  • 从referer头中取得来源页面的地址
  • 解析出查询关键词
  • 全文检索得出结果

首先必须分析referer, 知道url中哪部分是关键字。例如在baidu输入关键字"扯谈社",在搜索结果中访问你的网站,那么来源的url就是:http://www.baidu.com/s?wd=%B3%B6%CC%B8%C9%E7上面的url中,wd=%B3%B6%CC%B8%C9%E7就是关键字部分,其中%B3%B6%CC%B8%C9%E7是"扯谈社"编码后的字符串, 我们通过UrlDecode解码就可以得到原来用户输入了什么关键字访问了自己的网站, 一般的编程语言都提供了解码工具, Java里的是URLDecoder。

百度对关键字是使用GBK编码,不过有些网站比如谷歌使用的是UTF8编码,需要根据不同情况加以处理。

上面的参考文章列出各个搜索引擎的关键字,但是其实有很多已经是无效的(比如china的已经转为使用google的搜索服务),实际上还有效的列表如下(加上了后来的有道)

名称 关键字 编码
baidu wd/word GBK
sogou query GBK
yahoo p UTF-8
google q UTF-8
search.msn q UTF-8
youdao q/lq UTF-8
search.114.vnet.cn kw GBK

4 Java的编码实现:

贴点代码

(HttpUtils.java)

    /** 
     * 从当前请求得到请求来源 
     * 
     * @param request 
     * @return 
     */ 
    public static String getReferer(HttpServletRequest request) { 
        return request.getHeader("Referer"); 
    }

    /** 
     * #727 针对搜索引擎来源用户的提示 
     * 
     * 从某个url里面得到特定参数的值 
     * 
     * @param name 
     * @param url 
     * @return 
     */ 
    public static String getParameterFromUrl(String name, String url) { 
        if (!url.contains("?")) { 
            return ""; 
        } 
        String reval = ""; 
        url = url.substring(url.indexOf("?") + 1); 
        String[] pairs = url.split("&"); 
        for (String pair : pairs) { 
            if (pair.contains("=")) { 
                String pairName = pair.substring(0, pair.indexOf("=")); 
                if (name.equals(pairName)) { 
                    reval = pair.substring(pair.indexOf("=") + 1); 
                    return reval; 
                } 
            } 
        } 
        return reval; 
    }

    /** 
     * #727 针对搜索引擎来源用户的提示 
     * 
     * 根据url取得搜索关键词 
     * 
     * @param refererURL 
     *            request的来源url 
     * @return 
     */ 
    public static String getSearchKeyInRefererURL(String refererURL) { 
        String searchKey = ""; 
        if (StringUtils.isNotEmpty(refererURL)) { 
            try { 
                if (refererURL.contains("baidu.com")) { 
                    // wd/word 
                    searchKey = getParameterFromUrl("wd", refererURL); 
                    if (StringUtils.isEmpty(searchKey)) { 
                        searchKey = getParameterFromUrl("word", refererURL); 
                    } 
                    if (StringUtils.isNotEmpty(searchKey)) { 
                        searchKey = StringUtils.urlDecode(searchKey, 
                                StringUtils.ENCODE_GBK); 
                    } 
                } else if (refererURL.contains("sogou.com")) { 
                    // query 
                    searchKey = getParameterFromUrl("query", refererURL); 
                    if (StringUtils.isNotEmpty(searchKey)) { 
                        searchKey = StringUtils.urlDecode(searchKey, 
                                StringUtils.ENCODE_GBK); 
                    } 
                } else if (refererURL.contains("search.114.vnet.cn")) { 
                    // kw 
                    searchKey = getParameterFromUrl("kw", refererURL); 
                    if (StringUtils.isNotEmpty(searchKey)) { 
                        searchKey = StringUtils.urlDecode(searchKey, 
                                StringUtils.ENCODE_GBK); 
                    } 
                } else if (refererURL.contains("search.msn.com") 
                        || refererURL.contains("live.com")) { 
                    // q 
                    searchKey = getParameterFromUrl("q", refererURL); 
                    if (StringUtils.isNotEmpty(searchKey)) { 
                        searchKey = StringUtils.urlDecode(searchKey, null); 
                    } 
                } else if (refererURL.contains("yahoo.com") 
                        || refererURL.contains("yahoo.cn")) { 
                    // p 
                    searchKey = getParameterFromUrl("p", refererURL); 
                    if (StringUtils.isNotEmpty(searchKey)) { 
                        searchKey = StringUtils.urlDecode(searchKey, null); 
                    } 
                } else if (refererURL.contains("www.google")) { 
                    // q 
                    searchKey = getParameterFromUrl("q", refererURL); 
                    if (StringUtils.isNotEmpty(searchKey)) { 
                        searchKey = StringUtils.urlDecode(searchKey, null); 
                    } 
                } else if (refererURL.contains("www.youdao")) { 
                    // q or lq 
                    searchKey = getParameterFromUrl("q", refererURL); 
                    if (StringUtils.isEmpty(searchKey)) { 
                        searchKey = getParameterFromUrl("lq", refererURL); 
                    } 
                    if (StringUtils.isNotEmpty(searchKey)) { 
                        searchKey = StringUtils.urlDecode(searchKey, null); 
                    } 
                } 
            } catch (Exception e) { 
                log.error(e.getMessage()); 
                searchKey = ""; 
            } 
        } 
        return searchKey; 
    }

 

(SearchEngineHintFilter.java)

在请求过滤器里面取得关键字, 进行搜索:

public void doFilter(ServletRequest request, ServletResponse response, 
            FilterChain chain) {

String refererURL = HttpUtils.getReferer(request); 

String searchKey = HttpUtils.getSearchKeyInRefererURL(refererURL); 
            if (StringUtils.isNotEmpty(searchKey)) { 
                log.debug("Got searchkey: " + searchKey+" |"+HttpUtils.getURL(httpRequest)); 
                httpRequest.setAttribute(WebConstants.REQUEST_SEARCH_KEYWORD, 
                        searchKey); 
                List<Map<String, String>> refTopics = doSearch(searchKey); 
                httpRequest.setAttribute(WebConstants.REQUEST_SEARCH_RESULT, 
                        refTopics); 
            }

}   

doSearch方法里面调用了庖丁分词, 根据关键字全文检索站内文章 

5 其他:

提示框的CSS+JS置底 这个详情请mockee来八卦

0
0
分享到:
评论

相关推荐

    csrf绕过Referer技巧-01

    为了防御CSRF攻击,Web开发者通常会使用Referer头来判断请求的来源是否合法。本文将详细介绍CSRF绕过Referer技巧,包括Referer防御CSRF原理、Referer防御代码编写、绕过Referer技巧和Burpsuite自动生成POC。 一、...

    如何增加Referer功能--反向链接插件

    通过分析引荐来源(即referer信息),网站管理员可以更好地理解用户行为,优化推广策略,并提升用户体验。本文将详细介绍如何通过一个名为“反向链接插件”的工具来实现这一功能。 #### 插件简介 该插件的主要功能...

    PHP 获取从搜索引擎进来的关键字

    这涉及到网站流量分析、SEO(搜索引擎优化)策略和用户行为研究等方面的知识。 首先,我们需要理解搜索引擎的工作原理。搜索引擎如百度、谷歌等会爬取网页内容,对页面进行索引,并根据用户的搜索请求提供相关结果...

    前台通过JS抓取用户在百度等搜索引擎输入的关键词

    ### 前台通过JS抓取用户在百度等搜索引擎输入的关键词 #### 概述 在互联网营销领域,为了更有效地吸引目标用户并提高转化率,企业常常需要了解用户是通过哪些关键词找到其网站或广告的。这有助于企业进一步优化SEO...

    PHP自定义函数猎取搜索引擎来源关键字的方法_.docx

    在进行网站数据分析时,了解用户通过哪些关键词从搜索引擎进入网站是非常重要的。这有助于优化网站SEO策略、提高用户体验及内容质量。本篇文章将详细介绍一个PHP自定义函数,用于从HTTP_REFERER中提取搜索引擎来源的...

    JS判断搜索引擎来路跳转代码.rar

    在实际应用中,我们可能会根据不同的搜索引擎来采取不同的处理策略,例如针对百度和谷歌的SEO优化,或者针对不同来源显示不同的广告。同时,为了增加代码的健壮性,可以考虑加入更多的搜索引擎域名,或者使用正则...

    Referer-parser.cr:Snowplow的Referer-parser的Crystal实现

    总结,`Referer-parser.cr`是基于Crystal的Referer解析工具,为Snowplow用户提供了一个高效且易于使用的解决方案来处理和分析用户来源数据。利用这个库,开发者可以更好地理解和优化他们的在线业务,提升用户体验并...

    Referer Privacy-crx插件

    但是,它也可以用于对用户进行指纹识别。 通过该扩展名,您可以清理引荐来源标头,以使其看起来就像您刚刚通过直接在地址栏中输入地址而打开该页面一样。 特点:-每个站点的白名单选项-清理document.referer,因此...

    JS代码根据搜索引擎来路来判断 跳转到指定页面

    在现代互联网开发中,网站往往需要根据用户的不同来源做出响应式的处理,比如根据用户是否来自特定的搜索引擎进行页面跳转等操作。本文将深入探讨几种不同的实现方法,包括纯JavaScript、PHP以及结合两者的方式。 #...

    referer-mod:Web Extension修改HTTP请求中的Referer标头

    Referer-mod Referer Modifier是Firefox的Web扩展,用于修改HTTP请求中的Referer标头和匹配的Javascript document.referrer属性。 对于每个目标域,可以配置以下五个操作之一: 保留:请勿修改引荐来源网址 修剪:...

    Referer Control-crx插件

    语言:English 在每个站点上控制HTTP Referer。 Referer Control授予对...您可以全局或在每个站点上伪造所需的任何引荐来源。 或者,您可以选择完全禁用引荐来源网址。 也可以在JavaScript document.referrer上使用!

    javascript操作referer详细解析

    这个信息对于网站分析、追踪用户来源以及了解流量来源至关重要。在JavaScript中,我们可以使用`document.referrer`来获取这一信息。然而,由于浏览器安全策略和用户行为等因素,有时`document.referrer`可能返回空...

    nginx利用referer指令实现防盗链配置

    如果 `Referer` 不在这些预设的合法列表中,Nginx 设置 `$invalid_referer` 变量为 1。在 `if` 语句中,如果 `$invalid_referer` 等于 1,则返回一个 403 错误给用户,用户会看到一个 403 页面。如果使用 `rewrite` ...

    php网站来路获取代码(针对搜索引擎)

    `:初始化变量`$se`为0,表示尚未发现搜索引擎来源。 3. **获取HTTP_REFERER值**: - `$url = $_SERVER["HTTP_REFERER"];`:从`$_SERVER`全局数组中获取HTTP_REFERER值。 4. **处理URL**: - `$str = str_...

    最新判断搜索引擎来路进行跳转的代码(PHP+JS)

    然而,“通过百度谷歌搜狗等搜索引擎点进来的用户,会执行跳转”,这表明代码会检查用户来源,并根据来源不同执行不同的行为。这种行为在黑帽SEO中可能被用来提升特定页面的排名,或者将流量导向其他有利益关系的...

    搜索引擎关键字分析

    本程序专为Linux平台设计,旨在从搜索引擎的流量中提取关键字,以揭示用户IP地址背后的搜索行为模式。 首先,我们要理解搜索引擎关键字是怎样的概念。在互联网上,当用户在搜索引擎如百度、谷歌等输入查询时,他们...

    referer-blacklist-nginx:为 NGINX 生成一个引用黑名单

    标题中的“referer-blacklist-nginx”是一个针对NGINX服务器的解决方案,用于阻止或限制来自特定来源(referer)的访问。这个工具可以帮助管理员保护网站免受恶意或不必要的流量影响。在描述中,我们看到“推荐人黑...

    PHP自定义函数获取搜索引擎来源关键字的方法

    当用户在搜索引擎中输入查询并点击结果时,搜索引擎会在跳转链接的`HTTP_REFERER`头部字段中包含搜索关键字。例如,百度搜索会将关键字放在URL中的`wd`参数中,而360搜索则使用`q`参数。因此,我们可以通过解析`...

Global site tag (gtag.js) - Google Analytics