제한된 페이지를 404로 리디렉션


21

현재 로그인 한 사용자에게 페이지를 볼 수있는 적절한 여유 공간이없는 경우 404 페이지를 표시하는 방법이 있습니까? PHP 메소드를 찾고 있습니다.

if( !current_user_can('administrator') ) { show_404(); exit(); }

리디렉션 사용에 대해 생각했지만 URL을 동일하게 유지하고 싶습니다.


존재하는 페이지에 대한 사용자 액세스를 거부하는 경우 404는 잘못된 오류 코드입니다. 401 또는 403이 더 의미가 있습니다.
moopet

1
네 말이 맞아 나는 고객이 액세스 할 수없는 사람이 페이지가 존재한다는 것을 알기를 원하지 않았으며 401을 던지면 페이지가 존재하지만 금지되어 있다고 말한 느낌을 받았습니다. 그럼에도 불구하고 401을 던지는 것은 쉬운 변화 일 것입니다.
Evan Yeung

답변:


50

헤더에 다음 코드를 사용하여 404 오류를 표시 할 수있었습니다.

<?php
  global $wp_query;
  $wp_query->set_404();
  status_header( 404 );
  get_template_part( 404 ); exit();
?>

그것을 깰 :
$wp_query->set_404(): wp_query에게 이것이 404임을 알려줍니다. 이것은 제목을 변경합니다
status_header(): HTTP 404 헤더를 보냅니다
get_template_part(): 404 템플릿을 표시합니다


이것은 좋은 대답이지만 http_status_code(404);템플릿을 설정하기 전에 헤더가 올바른지 확인하기 위해 사용합니다 (워드 프레스 status_header( 404 );기능 보다 훨씬 빠름 ). 페이지 순위가 염려되는 경우 Disallowrobots.txt 에도 공개 리소스가 아님을 나타내는 규칙을 추가해야합니다.
mopsyd

2

오류 메시지가 표시된 페이지를 만든 다음 해당 페이지로 사용자를 리디렉션하지 않는 이유는 무엇입니까? 이를 달성하는 간단한 방법은 다음과 같습니다.

404.php파일을 열고 다음 줄을 맨 위에 추가하십시오.

/**
 * Template Name: 404 Page
 */

404 Page템플릿이 있는 페이지를 만듭니다. 그런 다음 사용자를 리디렉션하십시오.

if ( !current_user_can('administrator') ) {
    $404_page = get_permalink( $404_page_id );
    wp_redirect( $404_page );
    exit();
}

404 요청에 페이지를 사용해야하는 이유는 다음과 같습니다. WP 404 페이지에 실제로는 존재하지 않는 페이지가 있기 때문에 WP는 404 페이지를 리턴하기 전에 모든 컨텐츠 를 검색해야 하며 작업은 자원 낭비입니다. 블로그를보다 빠르게 운영하는 데 도움이되는 미리 구성된 페이지를 사용하십시오.


나는 이것을 사용하는 것에 대해 생각했다. 그러나 내가 본 몇 가지 단점은 두 개의 404 템플릿을 만들고 유지 관리해야한다는 것입니다 (페이지 및 실제). 클라이언트는 404 페이지를 작성해야합니다. 그리고 URL을 동일하게 유지하고 싶습니다. 예를 들어 example.com/restricted 로 이동하면 ... / 404 /로 리디렉션되지 않습니다.
Evan Yeung

실제로 나는 404.php가 템플릿이라는 것을 깨달았습니다. 내 실수.
Evan Yeung

아니요, 페이지 순위를 선호하는 경우 매우 끔찍한 아이디어입니다. 검색 엔진은 404 또는 4xx 범위 헤더를 뷰어 오류로 반환하는 페이지 만 고려하고 200 페이지를 반환하는 모든 항목을 행복하게 색인화합니다. 리디렉션을 수행하면 크롤러에게 찾을 수없는 페이지가 유효한 페이지라고 알리고 페이지 순위가 엉망이됩니다. 404 페이지를 얻을 때 실제로해야 할 일은 할 것 http_response_code(404); exit();입니다. 페이지를 원하면 get_template_part( 404 );종료 전에 사용하십시오 . 또한 워드 프레스 기능보다 훨씬 빠릅니다.
05 분

0

당신은 파일에이 코드를 작성할 수 있습니다 404.php를 실제로 사용되는 테마 디렉토리에 (WP - 콘텐츠 / 테마 /..../ 404.php) :

<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: ".get_bloginfo('url'));
exit();
?>

이 코드는 파일의 시작 부분부터 시작해야합니다 (이전 문자없이) .

원본 링크 : 404 페이지를 WordPress의 홈 페이지로 리디렉션하는 방법


OP는 실제로 특정 기준을 충족하지 않는 사용자에 대해 404를 표시하는 방법을 찾고 있습니다 (예 : "사용자 A에게 'can_edit'기능이없는 경우 404 페이지를 표시 함).
phatskat

404를 리디렉션하지 마십시오. Location: xxx301 헤더를 설정하여 크롤러에게 실제로 유효한 리소스가 있음을 알리고없는 것으로 판단되면 순위를 죽입니다.
mopsyd

0

사용자의 역할에 따라 사용자가 author.php 페이지에 액세스 할 수 없도록하는 비슷한 요구 사항이있었습니다. 실제 페이지가로드되기 전에도 확인을 수행하고 404 페이지로 리디렉션하기 위해 template_redirect 작업을 등록합니다.

기재:

add_action( 'template_redirect', [ $this, 'handle_inactive_users']);

매니저:

public function handle_inactive_users() {
    global $wp_query;
    if ( $wp_query->is_author() ) {
        $user = $wp_query->get_queried_object();
        if ( is_a( $user, \WP_User::class ) && $user->has_cap( 'inactive' ) ) {
            $wp_query->set_404();
            status_header( 404 );
            get_template_part( 404 );
            exit();
        }
    }
}

템플릿 부분 중간에 다음 코드 스 니펫 만 사용하기로 선택한 경우 페이지가 이미 부분적으로 렌더링되어 실제로 404 페이지로 리디렉션되지 않을 수 있습니다. 그래서 template_redirect행동 에서 그것을하는 것이 좋습니다 -

$wp_query->set_404();
status_header( 404 );
get_template_part( 404 );
exit();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.