HTTP заголовки Last-Modified, Expires, 403 Not Modified (при отправке If-Modified-Since) для WordPress
Столкнулся в очередной раз с задачей установки HTTP заголовков (Last-Modified, Expires, 403 Not Modified) для WordPress, однако, разнообразие ранее установленных плагинов интерпретируют по-своему настройку заголовков, что в итоге вызвало ряд конфликтов при их задании. На просторах интернета нашел оптимальный для себя вариант, чем и хочу поделиться.
Делаем интеграцию следующего кода в файл текущей темы functions.php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | add_action( 'template_redirect', 'delfi_HTTP_Headers_Last_Modified' ); function delfi_HTTP_Headers_Last_Modified() { if ( ( defined( 'DOING_AJAX' ) && DOING_AJAX ) || ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) || ( defined( 'REST_REQUEST' ) && REST_REQUEST ) || ( is_admin() ) ) { return; } $last_modified = ''; // Для страниц и записей if ( is_singular() ) { global $post; if ( !isset( $post -> post_modified_gmt ) ) { return; } $post_time = strtotime( $post -> post_modified_gmt ); $modified_time = $post_time; // Если есть комментарий, обновляем дату if ( ( int ) $post -> comment_count > 0 ) { $comments = get_comments( array( 'post_id' => $post -> ID, 'number' => '1', 'status' => 'approve', 'orderby' => 'comment_date_gmt', ) ); if ( !empty( $comments ) && isset( $comments[0] ) ) { $comment_time = strtotime( $comments[0] -> comment_date_gmt ); if ( $comment_time > $post_time ) { $modified_time = $comment_time; } } } $last_modified = str_replace( '+0000', 'GMT', gmdate( 'r', $modified_time ) ); } // Cтраницы архивов: рубрики, метки, даты и тому подобное if ( is_archive() || is_home() ) { global $posts; if ( empty( $posts ) ) { return; } $post = $posts[0]; if ( !isset( $post -> post_modified_gmt ) ) { return; } $post_time = strtotime( $post -> post_modified_gmt ); $modified_time = $post_time; $last_modified = str_replace( '+0000', 'GMT', gmdate( 'r', $modified_time ) ); } // Если заголовки уже отправлены - ничего не делаем if ( headers_sent() ) { return; } if ( !empty( $last_modified ) ) { header( 'Last-Modified: ' . $last_modified ); header( 'Expires: ' . str_replace( '+0000', 'GMT', gmdate( 'r', time() + 2592000))); header( 'Cache-Control: max-age=2592000'); if ( !is_user_logged_in() ) { if ( isset( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) && strtotime( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) >= $modified_time ) { $protocol = (isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1'); header( $protocol . ' 304 Not Modified' ); } } } } |
Expires мы задаем + месяц от текущей даты.
Данная настройка проверена на сервере с Nginx, но 99%, что не возникнет проблем на Apache веб сервере.