Redirecționare Pagină Restricționată către 404

4 aug. 2011, 09:01:43
Vizualizări: 79K
Voturi: 34

Există vreo modalitate de a afișa o pagină 404 dacă utilizatorul curent autentificat nu are permisiunile necesare pentru a vizualiza pagina? Caut o metodă PHP, ceva de genul

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

M-am gândit să folosesc o redirecționare, dar aș dori să păstrez URL-ul neschimbat.

2
Comentarii

Dacă refuzi accesul unui utilizator la o pagină care există, codul de eroare 404 nu este potrivit. Un cod 401 sau 403 ar avea mai mult sens.

moopet moopet
12 iul. 2013 12:18:55

Ai dreptate. Am avut impresia de la client că nu dorește ca cineva fără acces să știe măcar că pagina există, iar un cod 401 ar indica că pagina există dar este interzisă. Totuși, ar fi o modificare ușoară să aruncăm un cod 401 în loc de 404.

Evan Yeung Evan Yeung
12 iul. 2013 22:11:57
Toate răspunsurile la întrebare 4
1
79

Am reușit să afișez o eroare 404 folosind următorul cod în header-ul meu.

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

Pentru a explica:
$wp_query->set_404(): anunță wp_query că aceasta este o eroare 404, acest lucru modifică titlul
status_header(): trimite un header HTTP 404
get_template_part(): afișează șablonul pentru 404

28 aug. 2011 17:40:37
Comentarii

Acesta este un răspuns bun, dar aș folosi și http_status_code(404); înainte de setarea șablonului pentru a mă asigura că header-ul este corect (care este semnificativ mai rapid decât funcția WordPress status_header( 404 );). Dacă ești preocupat de clasamentul paginii, ar trebui să adaugi și o regulă Disallow în robots.txt pentru a indica că nu este o resursă publică.

mopsyd mopsyd
15 mar. 2018 04:12:59
3

De ce să nu creezi o pagină care afișează un mesaj de eroare și apoi redirecționează utilizatorul către acea pagină? Iată o metodă simplă de a realiza acest lucru:

Deschide fișierul 404.php și adaugă aceste linii în partea de sus:

/**
 * Template Name: Pagină 404
 */

Creează o pagină cu șablonul Pagină 404. Apoi redirecționează utilizatorii:

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

Motivul pentru care ar trebui să folosești o pagină pentru cererea 404 este: în WordPress, pagina 404 este de fapt o pagină care nu există, WordPress trebuie să caute întregul conținut înainte de a returna pagina 404 și această activitate este o pierdere de resurse. Folosirea unei pagini preconfigurate te poate ajuta să rulezi blogul mai rapid.

4 aug. 2011 09:39:22
Comentarii

M-am gândit să folosesc asta. Dar câteva dezavantaje pe care le văd sunt că ar trebui create și întreținute două șabloane 404 (pagina și cea reală). Clientul ar trebui să creeze o pagină 404. Și aș dori să păstrez URL-ul același. De exemplu, dacă accesez http://www.example.com/restricted, nu aș vrea să fiu redirecționat către .../404/

Evan Yeung Evan Yeung
4 aug. 2011 10:02:51

De fapt, tocmai am realizat că 404.php este șablonul. Greșeala mea.

Evan Yeung Evan Yeung
4 aug. 2011 10:24:05

Nu, asta este o idee destul de proastă dacă vrei să ai vreun fel de clasament în pagini. Motorele de căutare consideră doar paginile care returnează un header 404 sau orice alt header din gama 4xx ca eroare de vizualizare și vor indexa cu plăcere orice pagină care returnează un cod 200. Dacă faci o redirecționare, atunci le spui crawler-ului că pagina ta negăsită este o pagină validă, iar asta va afecta grav clasamentul paginilor. Tot ce trebuie să faci când ai o pagină 404 este să folosești http_response_code(404); exit();. Dacă vrei o pagină, atunci folosește get_template_part( 404 ); înainte de exit. Asta este, de asemenea, mult mai rapid decât orice funcționalitate WordPress.

mopsyd mopsyd
15 mar. 2018 04:05:02
0

Am avut o cerință similară în care nu trebuia să permit utilizatorilor să acceseze pagina author.php în funcție de rolul utilizatorului. Am înregistrat acțiunea template_redirect pentru a face verificările și a redirecționa către pagina 404 înainte ca pagina să fie încărcată.

Înregistrare:

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

Handler:

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();
        }
    }
}

Dacă alegeți să folosiți doar următorul fragment de cod în mijlocul părții de template, pagina poate fi deja randată parțial și nu sunteți de fapt redirecționat către o pagină 404. Așadar, este mai bine să faceți acest lucru în acțiunea template_redirect -

$wp_query->set_404();
status_header( 404 );
get_template_part( 404 );
exit();
26 sept. 2017 19:52:46
2

Puteți scrie acest cod în fișierul 404.php din directorul temei actual utilizate (wp-content/themes/..../404.php):

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

Acest cod trebuie să înceapă de la începutul fișierului (fără niciun caracter înainte).

Link către original: Cum să redirecționați pagina 404 către Pagina Principală în WordPress

5 iun. 2017 17:39:09
Comentarii

OP este de fapt în căutarea unei modalități de a afișa eroarea 404 pentru utilizatorii care nu îndeplinesc anumite criterii, de exemplu "Dacă utilizatorul A nu are capacitatea 'can_edit', atunci se afișează o pagină 404."

phatskat phatskat
5 iun. 2017 18:18:45

Nu redirecționa paginile 404. Location: xxx setează un header 301, care le spune crawler-ilor că există de fapt o resursă validă, și afectează poziționarea atunci când aceștia determină că nu există.

mopsyd mopsyd
15 mar. 2018 04:10:38