캐시와 쿠키에 대한이 솔루션이 문제가됩니까?


23

나는 일반적이지 않지만 임시 WP 캐싱 솔루션과 쿠키,이 경우 표준 WP 주석 쿠키와의 상호 작용에 대한 전례없는 문제와는 다른 임시 솔루션을 생각해 냈습니다. 내 솔루션은 캐시 파일을 제공하는 경우가 거의 정의되지 않은 "알려진 사용자"예외를 따릅니다. 그것이 쓸모가 있든 없든, 나는 그것을 설명하고 그것이 왜 나쁜 생각인지 배우는 것이 일반적으로 유익 할 수 있다고 생각합니다.

WP Super Cache, W3 Total Cache 및 Comet Cache로 내 방법을 테스트했습니다. 이 문제를 연구하는 동안 내가 자세히 알아 본 것은 WP Super Cache (이하 "WPSC") 였으므로이 예제를 기본 예제로 사용하겠습니다.

배경

WP 표준 주석 스레드가 방문자가 주석을 작성할 수 있도록 설정되면 등록 된 사용자가 아닌 로그인 한 주석 자에 대해 주석 쿠키가 설정되며 실제 주석 권한은 추가 검사를받습니다. 내가 가장 일반적인 구성이라고 생각하는 경우 주석 작성자는 이름과 전자 메일 주소 만 제공하면됩니다. 이들은 일반적 comment_author_ . COOKIEHASH으로 및 두 개의 브라우저 쿠키 내에 저장됩니다 comment_author_email_ . COOKIEHASH. COOKIEHASH사용자 옵션에 따라 정의됩니다.

새로 생성 된 파일을 "알려진 사용자"에게 전달하도록 설정된 경우 WPSC는 몇 가지 검사를 기반으로 캐시 된 파일을 제공할지 여부를 결정합니다. 로그인 한 사용자는 새로운 파일을 가져 오므로 방문자는 "댓글을 작성할 수있는 사용자"입니다. 후자는 주로 comment_author_쿠키 브라우저 에서 특정 사용자에 대해 구체적으로 또는 고유하게 식별되지 않는 쿠키 브라우저에 의해 식별됩니다 COOKIEHASH(일반적으로 사이트 옵션에 기록 된 "siteurl"의 MD5 인코딩 버전은 아닙니다).

wp-cache-phase1.php LL371-383에서 WPSC 코드의 핵심 부분은 RegEx 패턴을 사용하여 쿠키를 순환하는 문자열을 가져옵니다.

$regex = "/^wp-postpass|^comment_author_";
if ( defined( 'LOGGED_IN_COOKIE' ) )
    $regex .= "|^" . preg_quote( constant( 'LOGGED_IN_COOKIE' ) );
else
    $regex .= "|^wordpress_logged_in_";
$regex .= "/";
while ($key = key($_COOKIE)) {
    if ( preg_match( $regex, $key ) ) {
        wp_cache_debug( "wp_cache_get_cookies_values: $regex Cookie detected: $key", 5 );
        $string .= $_COOKIE[ $key ] . ",";
    }
    next($_COOKIE);
}

이제 PHP에서 엄격하게 작업하고 있다면 WP 핵심 함수를 재생성하거나 훅킹 comment_author_ . COOKIEHASH하고 주석 템플릿으로 표준 세트를 가져올 수 있지만 jQuery Cookie 플러그인을 사용하여 jQuery에서 작업하고 있습니다. 당신이 정규식 보면 당신이 볼 수 그러나 WPSC 기능은 걱정하지 않습니다 COOKIEHASH: 그것은 발생하면 그것은 만족 있어요 comment_author_.

내 임시 솔루션

$.cookie( 'comment_author_proxyhash', 'proxy_author', { path: '/' } );

jQuery 쿠키에 익숙하지 않은 사용자의 경우 위의 내용은 키 = comment_author_proxyhash및 값 = 으로 간단한 세션 쿠키를 설정 proxy_author하여 전체 사이트에 적합합니다. (또한, 사전에 대체 친숙한 jQuery를 추가, jQuery를 쿠키 및 WP를 사용하는 사람들을 위해 $WP를 들어 jQuery, 나는 이미 설정했습니다 $.cookie.raw = true;.)

나는 jQuery 스크립트에 줄을 추가했다 . , WPSC, W3 Total Cache 및 Comet Cache는 모두 내가 원하는 것처럼 작동합니다. 스크립트를 사용하고 새로 고침하면 새로운 페이지가 나타납니다. 실제 의견을 제시하면 일반 쿠키 comment_author_comment_author_email_쿠키가 설정되며 공존에 아무런 문제가없는 것 같습니다.

아마도 하나의 결함은 "proxyhash"쿠키가 사용자가 세션을 열어 두는 한 사용자와 함께 여행 할 것이지만, 이것이 중대한 문제 나 경고의 가치가있는 것처럼 생각 나지 않을 것입니다. 나는 일반 쿠키 중 하나에서 발생하는 그런 일에 대해 불평하는 사람을 확실히 들어 본 적이 없습니다.

하지만 어쩌면 내가 잃어버린 무언가가있을 수 있으며, 잠재적으로 내 교화에도 불구하고 나의 비애를 많이 발견하려고합니다. 또는 COOKIEHASHjQuery에서 복제하여 대체 사용 사례를 다루는 상대적으로 간단한 모범 사례가 있거나 다른 방법으로 동일한 최종 효과를 얻을 수 있습니다. 캐싱 플러그인을 방문자를 처리하도록 속이는 다른 방법 해설자로서 ...

그렇지 않다면, 플러그인에서이 또는 그와 비슷한 것을 우주로 밀지 말아야 할 충분한 이유가 있습니까?


3
잘 연구되고 문서화 된 질문에 대한 제안. 그러나 나는 질문의 본질이 결정적인 대답 (주제 : 주로 의견 기반)과는 반대로 더 많은 토론에 이것을 열 수 있다고 생각합니다. FWIW 내 의견으로는 여기에 잘못된 것이 없습니다. 궁극적으로 개인 데이터가없는 단일의 일반적인 쿠키를 설정하고 있습니다.
TheDeadMedic

입력 해 주셔서 감사합니다. 나는 그러한 토론에 대해 감사 할 것이며 a)이 "일반 쿠키"방법으로 문제를 지적했거나, b) 동일한 효과를 달성하기위한 대체 수단을 제공했거나, c) 유용한 것을 제공했다는 것에 대한 좋은 대답으로 표시 할 것이다. "알려진 사용자"와 관련된 기본적인 기술적 질문에 대한 통찰력
CK MacLeod

참고로, wp_localize_script쿠키 해시를 자바 스크립트로 전달하여 proxyhash 대신 "기본"쿠키를 사용할 수 있습니다. 그렇지 않으면 이것은 매우 흥미로운 문제이며 쿠키 + 캐시는 항상 너무 복잡하지만 솔루션이 "올바른"솔루션인지 또는 놓친 것이 있는지 말하기는 어렵습니다. 훌륭한 연구!
phatskat

흥미로운 질문-문제가 될 수있는 이것에 대해 아무것도 생각할 수 없지만 왜 이런 식으로 캐시를 무시하고 싶은지 물어볼 수 있습니까? 사용자에게 이러한 기능을 제공하면 전체 페이지 캐시를 시작하려는 목적을 상실하게됩니다. 또한 일반적인 쿠키 구성으로 동일한 결과를 얻을 수있는 경우 (예 : mysite.com?a) URL에 쿼리 매개 변수를 추가하면 추가 쿠키가 요청 크기에 추가됩니다 (최소한이지만). 그냥 내 $ 0.02 ...
ssnepenthe

ssnepenthe : 어쩌면 내가 설명 했어야 할 것 : wordpress.org/plugins/commenter-ignore-button- 질문을 작성할 때 개발중인 플러그인-jQuery를 사용하여 방문자가 선택된 주석기를 "무시할 수 있도록"할 수 있습니다. 초기 조치는 주석 스레드에 CSS 형식을 적용한 후 쿠키를 사용하여 지정 및 쿠키 존재를 저장하여 쿠키 만료까지 후속 새로 고침에 대한 효과 (PHP를 통해)를 복제합니다. 캐시 된 페이지 버전에서는 효과가 등록되지 않습니다. 예, 의도적 인 현지화 된 캐시 버스 팅의 한 형태입니다.
CK MacLeod

답변:


1

comment_author_proxyhash 쿠키가있는 솔루션은 물론 기술적으로 작동합니다. 내가 아는 모든 캐싱 플러그인은 해시 값을 분석하지 않으며 comment_author_ * 쿠키 존재 여부에 따라 캐시 된 콘텐츠의 배달을 중지합니다.

여기서 문제는 페이지 캐싱 기능이 웹 사이트에 실제로 필요한 것으로, 종종 페이지 캐싱이 정확한 WordPress 성능이 충분하지 않고 피크 타임에 서버를 충돌시킬 수 있기 때문에 정확하게 구성된다는 것입니다. 웹 사이트 콘텐츠 특성에 따라 다르지만 사이트 소유자는 PHP / WP 코드를 통해 모든 것을 처리하는 데 필요한 하드웨어 비용을 지불하지 못하는 경우가 있습니다. 즉, 가능한 한 많은 양의 트래픽이 페이지 캐시에서 제공되어야합니다. 실제로 캐시 예외를 수행하는 플러그인을 식별하고 비활성화해야한다고 말할 수 있습니다.

물론 항상 가능한 것은 아니지만 가능할 때마다 캐시 된 페이지로 작업하십시오. 예를 들어 div, 자바 스크립트를 통해 무시하려는 주석이있는 태그를 숨기 거나 전체 주석 블록을 Ajax-ify 할 수 있습니다.

어쨌든 방문자를 주석 자로 표시 할 필요는 없지만 사용자 지정 논리 이유로 인해 캐싱을 중지하십시오. 따라서 고유 한 쿠키를 사용하고 캐시 예외 신호로 만드는 것이 좋습니다. W3 Total Cache에는 "쿠키 거부"옵션이 있지만 목록의 다른 플러그인은 없으므로 제안한 것과 같은 해킹이 필요합니다.


감사! 여러 가지 유효한 문제가 발생하지만이 코드가하는 일은 본질적으로 누군가 "무시"또는 "음소거"를 "알려진"/ "음소거"할 수있는 주석 스레드에 참여하는 모든 방문자를 "알려진 사용자 / 해설자 " 사이트가 이러한 참여를 처리 할 수없는 경우 표준 WordPress 주석 템플릿 (및 주석 커뮤니티)도 처리 할 수 ​​없습니다!
CK MacLeod

당신이 여기 있다고 생각하십시오. 물론 사용자가 그것을 어떻게 사용하는지 알 수는 없습니다. 많은 트래픽이 많은 웹 사이트는 나중에 기사 내용을 빠르고 게으른로드 동적 주석 내용을 표시하기 위해 주석 처리를 별도의 요청 또는 타사 서비스로 오프로드합니다. 플러그인의 다른 버전에 대한
비논리적 인
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.