web-dev-qa-db-fra.com

Si modifié depuis l'en-tête HTTP

J'essaie d'activer 304 If Modified Since HTTP header sur mon site WordPress. Après avoir fait beaucoup de recherches sur Google, je découvre un site où l'auteur a dit de mettre la ligne suivante à la toute fin du fichier wordpress wp-config.php. Voici la ligne de code:

header("Last-Modified: " . the_modified_date());

Maintenant l'auteur a dit que c'était ça. Je n'ai rien d'autre à faire pour atteindre 304 If Modified Since HTTP header. Mais après avoir fait cela, j'ai testé l'en-tête HTTP en utilisant le site.

http://httpstatus.io/

et voici la capture d'écran de mon en-tête:

enter image description here

Vérifiez la section marquée en rouge. La dernière valeur d'en-tête modifiée est BLANK.

Après cela, j’ai pensé que cela pourrait être un problème avec la fonction the_modified_date(); j’ai donc également essayé la fonction get_the_modified_date(). Mais toujours pas de résultat.

À la toute fin, j'ai créé une petite fonction de shortcode pour vérifier si ces fonctions fonctionnent ou non, et l'a répercutée dans le code court. Quand j'ai utilisé le shortcode, je peux clairement voir que les fonctions fonctionnent bien, mais pour une raison quelconque, envoyer un blanc au 304 If Modified Since HTTP header.

Mon site est ici

Des suggestions sur la façon de résoudre ceci?

2
iSaumya

the_modified_date() est une balise de modèle qui doit être utilisée à l'intérieur de la boucle, c'est pourquoi elle ne fonctionne pas pour vous.

WordPress fournit une action et un filtre pour inclure ou modifier les en-têtes HTTP:

Mais ça ne marche pas pour ça. Par exemple, le code suivant ne fonctionne pas:

add_action( 'send_headers', 'cyb_add_last_modified_header' );
function cyb_add_last_modified_header() {
    //Check if we are in a single post of any type (archive pages has not modified date)
    if( is_singular() ) {
        $post_id = get_queried_object_id();
        if( $post_id ) {
            header("Last-Modified: " . get_the_modified_time("D, d M Y H:i:s", $post_id) );
        }
    }
}

Pourquoi?

La requête wp principale n'est pas construite à ce moment-ci, pas plus que dans le filtre wp_headers. Ainsi, is_singular() renvoie false, get_queried_object_id() renvoie NULL et il n’existe aucun moyen d’obtenir l’heure modifiée de la publication en cours.

Une solution possible consiste à utiliser template_redirect action hook, comme suggéré par Otto dans cette question (testé et fonctionnel):

add_action('template_redirect', 'cyb_add_last_modified_header');
function cyb_add_last_modified_header($headers) {

    //Check if we are in a single post of any type (archive pages has not modified date)
    if( is_singular() ) {
        $post_id = get_queried_object_id();
        if( $post_id ) {
            header("Last-Modified: " . get_the_modified_time("D, d M Y H:i:s", $post_id) );
        }
    }

}
3
cybmeta

J'ai essayé le code de cybmeta mais la date n'a pas été réglée correctement. Je ne suis pas tout à fait sûr de la raison, mais après avoir enquêté, j'ai trouvé le plugin Add Headers qui est maintenant obsolète mais qui était une bonne source de code utile. Dans ce plugin, l'auteur définit la date de l'en-tête Last-Modified d'une manière différente et l'utiliser pour modifier le code a fonctionné pour moi. Voici ce que j'ai fini avec:

add_action('template_redirect', 'cyb_add_last_modified_header');
function cyb_add_last_modified_header($headers) {
    //Check if we are in a single post of any type (archive pages has not modified date)
    if( is_singular() ) {
        $post_id = get_queried_object_id();
        if( $post_id ) {
            $post_mtime = get_the_modified_time("D, d M Y H:i:s", $post_id);
            $post_mtime_unix = strtotime( $post_mtime );
            $header_last_modified_value = str_replace( '+0000', 'GMT', gmdate('r', $post_mtime_unix) );
            header("Last-Modified: " . $header_last_modified_value );
        }
    }
}
2
Mojamba

Ma solution pour Dernière modification et correcte 304 non modifiée

À l'intérieur de functions.php

add_action('template_redirect', 'last_mod_header');

function last_mod_header($headers) {
     if( is_singular() ) {
            $post_id = get_queried_object_id();
            $LastModified = gmdate("D, d M Y H:i:s \G\M\T", $post_id);
            $LastModified_unix = gmdate("D, d M Y H:i:s \G\M\T", $post_id);
            $IfModifiedSince = false;
            if( $post_id ) {
                if (isset($_ENV['HTTP_IF_MODIFIED_SINCE']))
                    $IfModifiedSince = strtotime(substr($_ENV['HTTP_IF_MODIFIED_SINCE'], 5));  
                if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']))
                    $IfModifiedSince = strtotime(substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 5));
                if ($IfModifiedSince && $IfModifiedSince >= $LastModified_unix) {
                    header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified');
                    exit;
                } 
     header("Last-Modified: " . get_the_modified_time("D, d M Y H:i:s", $post_id) );
                }
        }

    }
1
Travis Cat