• Moderatore

    Ottenere un code 404 not found via PHP

    Voglio fare in modo di ottenere un codice di errore 404 not found via PHP per determinanti URLs.

    La mia esigenza nasce dal fatto che per alcune URLs Joomla risponde creando pagine, mentre io vorrei avere in risposta un code 404.
    Questo dipende dal meccanismo di routing del componente (com_content), che però io non voglio toccare, perché preferisco agire su un plugin che preservi tutto il resto.

    Riesco a intercettare tali pagine (per le quali voglio il 404) e a inserire codice PHP all'interno di esse.

    In verità la mia domanda è indipendente da Joomla e vale per qualunque pagina. Se ad esempio ho una pagina.php così:

    
    <!doctype html>
    <html>
    	<head>
    		<title>Titolo di pagina.php</title>
    	</head>
    	<body>
                    <p>Qui il contenuto del body</p>
    	</body>
    </html>
    
    

    quale codice devo inserire per avere in risposta un codice di errore 404 "Page Not Found"?

    Posso inserirlo dopo doctype html?

    Premetto che la versione di PHP disponibile è la 5.3.x, quindi le funzioni della 5.4 non posso usarle. Ho letto che ci sono differenze con cgi, ma nonostante abbia provato in vari modi non sono riuscito ad ottenere il 404 neanche su una qualsiasi pagina.php creata staticamente. La maggior parte delle installazioni di Joomla funzionano su Apache.

    Grazie per l'aiuto. :smile5:
    Francesco


  • User Attivo

    Ciao FDA,
    se ho ben capito la domanda l'header bisogna metterlo prima del doctype. Quindi nel tuo caso avresti qualcosa del tipo:

    [PHP]<?php
    header("HTTP/1.0 404 Not Found");
    ?>
    <!doctype html>
    <html>
    <head>
    <title>Titolo di pagina.php</title>
    </head>
    <body>
    <p>Qui il contenuto del body</p>
    </body>
    </html>[/PHP]

    Come extra ti dico che l'ho implementato nell'htaccess per intercettare gli errori 404 e richiami la pagina di cortesia 🙂

    Spero che ti sia utile.
    Ciao.


  • Moderatore

    Ciao MenteLibera,
    grazie per la risposta. :smile5:

    Con il tuo codice non funziona, ho già provato.
    E anzi chiedo: esiste un motivo perché, pure inserendo quel codice in un file pagina.php poi non ottenga in corrispondenza dell'url un 404?

    Preciso due cose:

    1. non posso agire via htaccess ma a livello di codice php;
    2. questo errore non può venire intercettato perché all'URL corrisponde di default un codice 200 in quanto Joomla la pagina la crea (e anche per il mio test con pagina.php invero la pagina esiste, io voglio forzare la risposta); la mia esigenza è proprio quella di restituire un codice 404 prima che venga creata la pagina.

    Francesco


  • User Attivo

    Una possibile causa potrebbe essere il formato del file: se è UTF-8 con BOM ti converrà convertirlo nel formato senza BOM perché il primo contiene 3 byte invisibili all'inizio del file. Inoltre c'è da notare che questi non sono visualizzati dagli editor proprio perché sono caratteristici del file.
    Quando il server apre un file con BOM prima manda quei 3 byte invisibili al client che a quel punto non potrà più ricevere gli header. Come ulteriore prova se visualizzi il sorgente HTML noterai che il doctype è spostato a destra proprio di quei 3 byte.

    Invece i file **UTF-8 senza BOM **o quelli con codifica ANSI non contengono i 3 byte caratteristici e quindi non ricadi nel problema che ho appena citato di BOM.

    Per me questa è la causa del tuo problema.


  • Moderatore

    Ho provato ma continua a restituirmi la pagina e non il 404.
    Il formato già era UTF-8 senza BOM e non c'erano i 3 byte prima.
    Ho creato trebytes.php, l'ho messa in host diversi su server diversi, tutti con Apache, e il risultato è stato sempre lo stesso.
    Ecco lo screenshot 4 in 1:
    image


  • User Attivo

    Ho creato un file in cui ho messo il mio codice ed ho caricato su un server fatto una prova con un Web sniffer (per esempio questo web-sniffer.net/ ) ed in effetti ricevo nell'HTTP Response Header quello che ho impostato, l'ho evidenziato nell'ellisse che ho disegnato in rosso nella figura ( it.tinypic.com/view.php?pic=2w4d3k1&s=8 ).


  • Moderatore

    Ho fatto anche io la prova e il web sniffer mi fornisce status code 404, ma accadono le seguenti cose:

    1. il "content" è quello del file creato (come accade a te nell'immagine su tinypic) e la pagina continua ad essere visualizzata nel browser
    2. se invento un url che non esiste leggo in corrispondenza l'errore nei log, mentre per questo url il log non mi da errore

    Ho provato mettendo il file trebytes.php su due diversi server (quello Plesk ha Linux con Apache, PHP 5.3.3 e Nginx installati, l'altro è sempre un Linux con Apache e PHP 5.3.16).

    image

    Prova su altro host:

    image


  • User Attivo

    Rispondo per punti:

    1. Il content è in relazione con il contenuto HTML generato dal server. Nel mio caso noterai che è un po' più grosso per il semplice fatto che l'host con cui ho fatto la prova inserisce un banner in coda al file, ma in sostanza è lo stesso. Eventualmente potresti non inviare nemmeno un byte al client.

    2. Per loggare gli errori extra puoi ricorrere alla funzione error_log() il cui scopo è inviare un messaggio al log del webserver. È una funzione che uso poco, pertanto rimando alla documentazione ufficiale per approfondimenti ed esempi: php.net/manual/en/function.error-log.php

    Spero averti aiutato.


  • Moderatore

    Grazie MenteLibera, mi hai aiutato. :wink3:

    Francesco


  • User Attivo

    Evviva sono felice 🙂