2016-10-25 1 views
1

내 컨트롤러/나뭇 가지 내에서 일부 추적 서비스를 만들려고 노력 중이지만 모든 크롤러/스파이더/봇/무엇이든 호출하는 것을 우회하려고합니다.Symfony2 통계에 대한 거미/봇/크롤러 예방

내 컨트롤러에서 사용자가 이미 페이지를 방문했지만 봇이이 규칙을 따르지 않으면 캐싱 된보기가 렌더링됩니다. 다시 시작하면 모든 내용이 "삭제"되므로 추적하지 않고 번호가 증가합니다. 제어.

내 사이트가 크롤링되는 경우에도 내 통계가 안정적으로 유지 될 수 있도록이 문제를 방지하기위한 방법이 있는지 궁금합니다.

내가하는 일이 중요하지 않으므로 여기에 코드를 쓰지 말고 몇 개의 MongoDB 삽입물을 작성하십시오.

사용자가 페이지를 방문한 경우 응답을 캐시하기 위해 수행하는 작업이며 항목이 변경된 경우 캐시를 비활성화합니다 ($lastmodified).

$response = new Response(); 
$response->setPublic(); 
$response->setMaxAge(0); 
$response->setSharedMaxAge(600); 
$response->setLastModified($lastmodified); 
$response->headers->set('X-Cache-Type','client-no-cache'); 
if($response->isNotModified($request)){ 
    $response->setContent(304); 

    return $response; 
} 
+0

아카이브하려는 내용이 분명하지 않습니다. 크롤러가 캐시를 사용하도록 설정하거나 크롤러가 사이트를 방문 할 때 일부 통계가 수집되지 않도록 하시겠습니까? –

+0

캐시를 사용하도록 크롤러를 만들거나 가짜 통계를 방지하기 위해 크롤러임을 감지하면 서비스 호출을 사용하지 않도록 설정하려고합니다. –

답변

0

어떻게 크롤러/스파이더를 감지합니까? 만을 위해 봉사 하나

routing.yml이 예는 같은 URL에 대한 두 가지 동작의 제어를 정의

/contact 
    defaults: { _controller: AcmeDemoBundle:Main:contact } 
    condition: "context.getMethod() in ['GET'] and request.headers.get('User-Agent') matches '/firefox/i'" 

/contact 
    defaults: { _controller: AcmeDemoBundle:Main:contactForCrawler } 
    condition: "context.getMethod() in ['GET']" 

: 응답이 User-Agent 요청 헤더를 통해 경우 속성에는 Restrict Route Matching through Conditions 예제로 사용할 수 있습니다 Firefox 브라우저, 다른 모든 사람은 User-Agent 상태입니다.

희망 난 당신이 다른 사용자 크롤러를 감지하는 데 필요한 모든의를 먼저 말할 것이 도움

1
  1. . 이렇게하려면 use this approachthis library을 제안합니다. 요청 청취자를 만들고 사용자 에이전트가 요청자가 크롤러인지 여부를 감지합니다. 그리고 당신은 어떤 컨트롤러 에든 $isCrawler이라는 인자를 삽입 할 수 있습니다.

    public function indexAction(Request $request, $isCrawler) { 
        .... 
        if (!$isCrawler) { 
         $this->get('statisticService')->doSomething(); 
        } 
    } 
    
    내가 캐시로
    1. : 당신이 그것을 수행하는 방법 자세한 정보가 필요 (하지만이 링크에서 꽤 분명)이 같은

    뭔가 있다면 알려주세요 그것은 여기에 무관 한 주제라고 생각해. 그러나 크롤러가 캐시를 사용하도록 만들 수 있습니다. 이를 위해 자신 만의 리버스 프록시 (예 : Varnish)를 설치해야하지만, Symfony도 설치되어 있습니다 (documentation 참조).

그러나이 경우 크롤러가 아닌 사용자도 캐시를 사용하므로 통계에 대한 데이터가 누락됩니다. 그리고 다시 뭔가를 만들어야합니다.

if($response->isNotModified($request) && !$isCrawler){ 
    $response->setContent(304); 

    return $response; 
}