$direct_access = empty($_SERVER["HTTP_REFERER"]);
$referer = parse_url($_SERVER["HTTP_REFERER"]);
if($direct_access || $referer['host'] == $_SERVER['HTTP_HOST']) return;

 

 

현재 위 코드로 리퍼러가 없이 직접 읽혀지고 있거나 혹은 내 사이트의 리퍼러를 달고 이동되어 읽혀지는 것을 제외 했습니다.

 

그런데 제가 분석을 해보니 검색을 통해 저희 사이트로 넘어 온다음 위젯의 최신글,인기글 등을 클릭하고 읽혀지는 것들은 실제 검색되어지는 글이 아니라 사이트와 같은 리퍼러를 제외하였는데요.

 

여기에 특정한 것 하나만 예외로 하고 싶습니다. 

저희사이트 리퍼러라도 주소에 search 가 포함되어 있으며 리턴을 시키지 않고 db에 저장시키려고 합니ㅏㄷ. 

search는 제가 노출하려고 하는 검색되어지는 글에 부합하는 케이스라서요.

  • Lv8
    parse_url결과의 query를 체크하면 될꺼 같네요.
    if (strpos($referer['query'], 'search') !== false)
    {
    echo 'search가 포함됨';
    }

    아... 모바일로 작성하기 힘드네요;;;
  • Lv8 Lv30

    어제 이리저리 해봤는제 잘 안되네요.

    $direct_access = empty($_SERVER["HTTP_REFERER"]);
    $referer = parse_url($_SERVER["HTTP_REFERER"]);

    if (strpos($referer['query'], 'search') !== false)
    {
    $serach = 'Y';
    }

    if($direct_access || ($referer['host'] == $_SERVER['HTTP_HOST'] && $serach != 'Y' )) return;


    이런식으로 해봤는데 안되더라구요. 제가 잘못한거겠죠?

    /?act=&vid=&mid=search&results=배변훈련

    이런 검색결과에서 글 하나를 클릭해서 열람해봐도 기록이 되지 않아요.

  • Lv8 Lv30

    /?_filter=search&act=&vid=&mid=Study&category=&search_keyword=사료&search_target=title_content

    요런 검색결과에서는 잘 반영이 되네요.

  • Lv8 Lv30
    어렵네요..

    그냥 주소 전체에서 참조할 수 있는 방법은 없을까요??
  • Lv8
    $referer['query']에 물음표뒤의 문자열이 저장되어있을텐데요... 제가보기엔 둘다 동일한 결과가 나와야 하는데 이상하네요 ㅜ
    주소 전체면... strpos할때 $referer['query'] 대신
    $_SERVER["HTTP_REFERER"]를 사용해 보세요.
  • Lv8 Lv30
    /index.php?mid=hot_tag&act=IS&where=document&search_target=tag&is_keyword=견빈

    이 주소로 검색된 결과의 문서를 클릭해도 안되는 거보니 search를 찾아내는 것에 무슨 차이가 있나보네요...
  • Lv8 Lv30
    &뒤에 search가 올때와 아무것도 없이 search가 올때 차이 아닐까요??
    정상으로 된느 주소는 &가 붙지 않은 search가 들어있긴 합니다....
  • Lv8 Lv30
    테스트를 통해 분석을 해보니 머물고 있는 곳의 주소에 문자열 검색은 이상이 없네요.

    다만, 구글검색페이지와 통합검색 페이지에서 결과에 노출된 문서주소를 클릭하고 이동할때 리퍼러쪽에 뭔가 삭제가 되는거 같아요. 이 페이지들에서 검색결과가 아닌 위젯에 노출된 다른 문서(공지글)를 클릭해서 이동하면 바로 열람기록이 저장이 되네요.
  • Lv30
    if (preg_match('/search/', $_SERVER["HTTP_REFERER"]))
    {
    $serach = 'Y';
    }

    이렇게 고쳐 보았는데도 동일하게 search를 못찾아내는 경우는 동일하네요. 신기하게 되는 주소는 =search 이런 형태의 주소네요.
  • Lv30
    통합검색 결과 페이지와 구글검색 페이지에서는 리퍼러 전송을 하지 않는 것인지 정말 이상하네요.
  • Lv30

    구글검색 페이지
    링크삭제

    통함검색 페이지
    링크삭제


    위 두페이지서 검색된 결과 문서 링크를 클릭 후 해당 게시글로 이동과정에서는 뭔가 리퍼러 url이 예상한 것이 아닌 것으로 전송이 되네요.

    -> 리퍼러체크 코드를 지워가며 테스트해 보니 두 개의 페이지에서 검색 결과로 제시하는 링크를 클릭해서 문서가 읽혀질때는 빈 리퍼러로 체크가 되네요. 흠.....

  • ?

    $isSearchQueryFinded = false;
    $isDirectAccess = false;
    $getHost = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : null;
    $getReferer = isset($_SERVER["HTTP_REFERER"]) ? $_SERVER["HTTP_REFERER"] : null;

     

    $isSameHost = isset($getReferer) ? true : false;
    $isDirectAccess = !isset($getReferer) ? true : false;

    if(isset($getReferer)){
    $arrReferer = parse_url($getReferer);
    $isSameHost = ($arrReferer['host'] == $getHost) ? true : false;
    }

    if (isset($arrReferer['query'])){
    if (preg_match('/search/i', $arrReferer['query'])){
    $isSearchQueryFinded = true;
    }
    }

    if($isDirectAccess || ($isSameHost && !$isSearchQueryFinded)) return;

    이렇게 해보세요.

  • ? Lv30
    동일하게 XE통합검색의 결과, 구글맞춤검색의 결과에서 제공하는 저희사이트 링크를 클릭해서 해당 글을 열람하면 리퍼러가 남지 않아서 리턴이 되어 버리네요.
  • ? Lv30
    혹시 구글맞춤검색에서 리퍼러를 남기지 않아 발생하는 문제라면

    구글맞춤검색은 무조건 search mid 에서 클릭 되게 되어잇는데요. 방금전 클릭이 일어난 곳이 search mid 라면 리턴을 시키지 않게 가능할까요?

    리퍼러 자체를 넘기지 않아 이게 안되겠군요. 조회수가 발생한 게시글에서 코드가 작동하는 거니..
  • Lv30 ?
    https://pomelove.com/xe/?act=&vid=&mid=search&results=123

    혹시 여기서 클릭하신것이라면 about:blank => 해당주소로 이동하는것이라서 리퍼러 자체가 안남습니다.
  • ? Lv30
    네. 리퍼러가 남지 않아 요것만 적용을 못하겠네요.
  • Lv30 ?
    구글 검색화면에 다음과 같은 스크립트를 삽입하고
    <script>
    $('.gsc-control-wrapper-cse .gs-title').each(function(i, obj) {
    obj.href = obj.href + '&related=googlesearch';
    });
    </script>


    $isSearchQueryFinded = false;
    $isDirectAccess = false;
    $getHost = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : null;
    $getReferer = isset($_SERVER["HTTP_REFERER"]) ? $_SERVER["HTTP_REFERER"] : null;

    $isSameHost = isset($getReferer) ? true : false;
    $isDirectAccess = !isset($getReferer) ? true : false;

    if(isset($getReferer)){
    $arrReferer = parse_url($getReferer);
    $isSameHost = ($arrReferer['host'] == $getHost) ? true : false;
    }

    if (isset($arrReferer['query'])){
    if (preg_match('/googlesearch/i', $arrReferer['query'])){
    $isSearchQueryFinded = true;
    }
    }

    if($isDirectAccess || ($isSameHost && !$isSearchQueryFinded)) return;

    로 해보세요.
  • ? Lv30
    감사합니니다. 구글검색화면 나오는 곳 레이아웃 하단에 스크릅트 넣고 해 봤는데 동일하네요.
    https://pomelove.com/xe/?act=&vid=&mid=search&results=%EA%B0%90%EA%B8%B0

    스크립트 에러가 나서
    <script>
    jQuery('.gsc-control-wrapper-cse .gs-title').each(function(i, obj) {
    obj.href = obj.href + '&related=googlesearch';
    });
    </script>

    이렇게 넣었습니다.
  • Lv30 ?

    jQuery('.gsc-control-wrapper-cse .gs-title').click(function () {
    var current_url = event.currentTarget.href;
    var tag = event.currentTarget.tagName.toUpperCase();
    if (tag === 'A' && !current_url.match(current_url)) {
    event.preventDefault();

    regRewrite = /index.php/

    if(current_url.match(regRewrite)){
    var target = current_url;
    var regex = new RegExp("[&#](.*)");
    var target = target.replace(regex, '&related=googlesearch&' + "$1");
    }else{
    var target = current_url;
    var regex = new RegExp("[&#](.*)");
    var target = target.replace(regex, '?related=googlesearch&' + "$1");
    }


    this.href = target;
    };
    });

    이렇게 넣으시면 되는데 대신


    이전 페이지에서 사용자를 https://pomelove.com/xe/pom_QnA/185582?related=googlesearch(으)로 보내려고 합니다.

    해당 페이지를 방문하지 않으려면 이전 페이지로 돌아가세요.


    와 같이 나옵니다.

     

     

    그리고 페이지를 이동할때마다 자바스크립트를 다시 적용시켜야할겁니다.

     

    일단 되는지만 확인해주세요.

  • ? Lv30
    바꿔 봤는데 저는 변화가 없는데요....
  • Lv30 ?
    jQuery로 써야하는데 그냥 Query로 되있습니다...
  • Lv30 ?
    Uncaught ReferenceError: Query is not defined
    at ?act=&vid=&mid=search&results=감기:288
  • ? Lv30
    아.. 복사가 짤렸군요... 바꿔봤는데 동일하네요...
  • Lv30 ?
    jQuery(document).ready(function() {
    jQuery('.gsc-control-wrapper-cse .gs-title').click(function () {
    var current_url = event.currentTarget.href;
    var tag = event.currentTarget.tagName.toUpperCase();
    if (tag === 'A' && !current_url.match(current_url)) {
    event.preventDefault();

    regRewrite = /index.php/

    if(current_url.match(regRewrite)){
    var target = current_url;
    var regex = new RegExp("[&#](.*)");
    var target = target.replace(regex, '&related=googlesearch&' + "$1");
    }else{
    var target = current_url;
    var regex = new RegExp("[&#](.*)");
    var target = target.replace(regex, '?related=googlesearch&' + "$1");
    }


    this.href = target;
    };
    });
    });

    이것까지만 해보세요, 이것도 안되면 좀 깊게 뜯어봐야할듯합니다.
    타이머로 하면 백퍼 될것같기도 한대 타이머는 좀 그렇네요.
  • ? Lv30
    역시 안되네요. 스크립트 로딩이 빨라서 그런거라면 좀 지연시간을 줄 수 없을까요?
  • Lv30 ?

    window.setInterval(registryOnClickEvent, 5000);

    function registryOnClickEvent(){
    jQuery('.gsc-control-wrapper-cse .gs-title').click(function () {

    console.log('등록됨'); //콘솔창에서 함수가 등록되었는지 확인하는용도
    var current_url = event.currentTarget.href;
    var tag = event.currentTarget.tagName.toUpperCase();
    if (tag === 'A' && !current_url.match(current_url)) {
    event.preventDefault();

    regRewrite = /index.php/

    if(current_url.match(regRewrite)){
    var target = current_url;
    var regex = new RegExp("[&#](.*)");
    var target = target.replace(regex, '&related=googlesearch&' + "$1");
    }else{
    var target = current_url;
    var regex = new RegExp("[&#](.*)");
    var target = target.replace(regex, '?related=googlesearch&' + "$1");
    }


    this.href = target;
    };
    });
    }

    마지막으로 이렇게만 해보세요.

  • ? Lv30

    아... 잘 됩니다. 그런데 아까 메시지가 뜬다는게 이런 화면을 거친다는거였군요...
    큰 도움 감사합니다. 그런데 이렇게 실사용은 어렵겠네요... 메시지 화면이 없이 이동이 되어야 실제 적용이 가능할 것 같아요.

     

    아.. 그리고 처음 한번만 되고 그 이후로는 또 안되네요~~

  • Lv30 ?
    타이머가 너무 길게되서 기다려야 나옵니다.
  • Lv30 ?

    그리고 보니까 구글링크 파라미터를 맞춰야할것같네요.

    https://www.google.com/url?q=
    https://pomelove.com/xe/diary/711142

    ved=0ahUKEwj8iPb6zM_WAhXCoJQKHdrSDGgQFggLMAE
    usg=AOvVaw2hXb8pn2g07lOMo9mzPjzo

    이 파라미터값이 무엇인지 확인하는것도 보통일이 아닐것같습니다.

    만일 링크가 무조건 구글을 통하지 않아도 된다면 (검색결과통계를 확인할 이유가 없다면) 앞에 붙은
    https://www.google.com/url?q=를 삭제해버리면 메시지가 뜨지 않습니다.

  • ? Lv30
    어디서 삭제를 하죠? 저희는 구글검색결과만 제공하면 되고 따로 구글에서 확인 같은것은 필요는 없습니다.
  • Lv30 ?

    var isRegistry = false;
    window.setInterval(registryOnClickEvent, 5000);

    function registryOnClickEvent(){
        if(isRegistry == false){
        
            isRegistry = true; //registry
        
            jQuery('.gsc-control-wrapper-cse .gs-title').click(function () {
                var current_url = event.currentTarget.href;
                var tag = event.currentTarget.tagName.toUpperCase();
                if (tag === 'A' && !current_url.match(current_url)) {
                    event.preventDefault();
                    regRewrite = /index.php/

                    if(current_url.match(regRewrite)){
                        var target = current_url;
                        var regex = new RegExp("[&#](.*)");
                        var target = target.replace(regex, '&related=googlesearch&' + "$1").replace("https://www.google.com/url?q=", '');
                    }else{
                        var target = current_url;
                        var regex = new RegExp("[&#](.*)");
                        var target = target.replace(regex, '?related=googlesearch&' + "$1").replace("https://www.google.com/url?q=", '');
                    }

                    console.log(target);
                    
                    this.href = target;
                };
            });
        }
    }

  • Lv30 ?
    console.log(target);

    앞에 window.open(target); 붙이시면 정상작동할것같습니다.
  • ? Lv30
    이동이 안되네요~~
  • ? Lv30
    네. 이동은하는데 이전 처럼 리턴 되어 버리네요.
  • Lv30 ?
    어떻게 리턴되시나요?
  • ?

    var isRegistry = false;
    window.setInterval(registryOnClickEvent, 5000);

    function registryOnClickEvent(){
    if(isRegistry == false){

    isRegistry = true; //registry

    jQuery('.gsc-control-wrapper-cse .gs-title').click(function () {
    var current_url = event.currentTarget.href;
    var tag = event.currentTarget.tagName.toUpperCase();
    if (tag === 'A' && !current_url.match(current_url)) {
    event.preventDefault();
    regRewrite = /index.php/

    current_url = current_url.replace("https://www.google.com/url?q=", ''); //인코딩=>미리 주소를 바꿔둔다.

    if(current_url.match(regRewrite)){
    var target = current_url;
    var regex = new RegExp("[&#](.*)");
    var target = target.replace(regex, '&related=googlesearch&' + "$1");
    }else{
    var target = current_url;
    var regex = new RegExp("[&#](.*)");
    var target = target.replace(regex, '?related=googlesearch&' + "$1");
    }

    console.log(target);

    window.open(target);

    this.href = target;
    };
    });
    }
    }

  • ? Lv30
    아.. 리턴된다는 의미는 리퍼러가 없는 것을 인식되어
    if($isDirectAccess || ($isSameHost && !$isSearchQueryFinded)) return;

    이부분에 적용되어 기록을 남기지 못한다는 거구요.

    이전에 중간에 한번 묻는 창을 경유했을때는 리턴되지 않고 기록을 남겼습니다.
  • ? Lv30
    요것도 마찬가지로 기록이 되지 않아요.
  • Lv30 ?
    Array ( [scheme] => https [host] => pomelove.com [path] => /xe/wordlink/221898 [query] => related=googlesearch&sa=U&ved=0ahUKEwiy6Jf_0M_WAhWTQpQKHR8dCQUQFggfMAg&client=internal-uds-cse&usg=AOvVaw2DJ8fTm2e7L3p8Vs1KGwCe )

    query에는 정확하게 related=googlesearch 값이 등록되어 PHP상에서 구분이 가능해졌습니다.

    잠시만요.
  • Lv30 ?
    따로 PHP 파일을 만들어서 다음과 같이 테스트해보시겠어요?
    PHP 버전도 알아둬야할듯합니다. 운영체제(IIS/NGINX...), 비트(32/64)가 무엇인지도요.

    <?php

    $_SERVER["HTTP_REFERER"] = "https://pomelove.com/xe/wordlink/221898?related=googlesearch&sa=U&ved=0ahUKEwiy6Jf_0M_WAhWTQpQKHR8dCQUQFggfMAg&client=internal-uds-cse&usg=AOvVaw2DJ8fTm2e7L3p8Vs1KGwCe";

    $_SERVER['HTTP_HOST'] = "pomelove.com";

    $isSearchQueryFinded = false;
    $isDirectAccess = false;
    $getHost = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : null;
    $getReferer = isset($_SERVER["HTTP_REFERER"]) ? $_SERVER["HTTP_REFERER"] : null;

    $isSameHost = isset($getReferer) ? true : false;
    $isDirectAccess = !isset($getReferer) ? true : false;

    if(isset($getReferer)){
    $arrReferer = parse_url($getReferer);
    echo print_r($arrReferer);
    $isSameHost = ($arrReferer['host'] == $getHost) ? true : false;
    }

    if (isset($arrReferer['query'])){
    if (preg_match('/googlesearch/i', $arrReferer['query'])){
    $isSearchQueryFinded = true;
    }
    }

    if($isDirectAccess || ($isSameHost && !$isSearchQueryFinded)) return die('반환됨');

    echo '저장됨';


    return;

    ?>
  • ?
    그리고 console.log(target);

    다음줄에 target = decodeURIComponent(target);도 넣어주세요.
  • ? Lv30
    Array ( [scheme] => https [host] => pomelove.com [path] => /xe/wordlink/221898 [query] => related=googlesearch&sa=U&ved=0ahUKEwiy6Jf_0M_WAhWTQpQKHR8dCQUQFggfMAg&client=internal-uds-cse&usg=AOvVaw2DJ8fTm2e7L3p8Vs1KGwCe ) 1���λ맖

    브라우저에 이렇게 뜹니다.
  • ? Lv30
    한글을 영문으로 바꿔서 해봤습니다.

    saved 저장됨으로 출력됩니다.
  • Lv30 ?

    모듈 PHP 코드
    if (isset($arrReferer['query'])){
    if (preg_match('/googlesearch/i', $arrReferer['query'])){
    $isSearchQueryFinded = true;
    }
    }

    앞에

    if($_GET['related']=='googlesearch'){
    $isSearchQueryFinded = true;
    }
    를 붙여보세요.

  • ? Lv30
    감사합니다. 잘 됩니다.
    그런데 저희가 search를 사용하는 다른 곳이 있어서요.
    if (preg_match('/googlesearch/i', $arrReferer['query'])) 이부분에서
    googlesearch ----> search 로 변경하면 다른 페이지에서 search로 구분해 낼 수 있나요?

    테스트는 제가 해보겠습니다.
  • Lv30 ?
    자바스크립트 구간에서도 googlesearch를 search로 바꾸셔야합니다.

    구글에서 붙인 나머지 파라미터도 없에야하지 않을까요?
  • ? Lv30
    게시판 검색에서도 search가 사용되어서 일부러 처음에 주소에서 search를 찾게 한거였거든요...
    스크립트도 고쳐보겠습니다.
  • ? Lv30
    스크립트도 search로 바꾸니 잘 되는군요.
    구글에서 붙이 나머지 부분이 없으면 당연히 좋겠지만 그냥 둬도 상관은 없을 것 같습니다.
    이게 어차피 사람이 검색해서 클릭했을때만 주소입력란에만 보이는 주소라 SEO등에는 큰 문제는 없으니까요..

    큰 도움 너무 감사합니다.
  • Lv30 ?
    네, 좋은하루되세요.
  • Lv30 ?
    $_GET은 전역이라서 모바일이라고 못받아올 이유는 없어서

    제 생각으로는 모듈상에서 해당 ACT에 대한 모바일 접근을 애초부터 막아뒀다고 보고있습니다.
  • ? Lv30
    네. 저희 앱이 새창에서 스크립트나 php 동작이 문제가 좀 있어보여요
    다른 모바일에서는 잘 됩니다. 감사합니다.
  • ?
    jQuery('.gsc-control-wrapper-cse .gs-title').click(function () {
    var current_url = event.currentTarget.href;
    var tag = event.currentTarget.tagName.toUpperCase();
    if (tag === 'A' && !current_url.match(current_url)) {
    exec_json~~...
    };
    })
    로 모듈로 특정 파라미터를 넘겨주거나

    $('.gsc-control-wrapper-cse .gs-title').each(function(i, obj) {
    obj.link = ~~
    });
    로 링크에 파라미터를 심어줘야할것같습니다.