If Modified Since HTTP Header

时间:2014-12-22 作者:iSaumya

我正在尝试启用304 If Modified Since HTTP header 在我的WordPress网站上。在做了大量的谷歌搜索之后,我找到了一个网站,作者说在wordpress的最后放了下面一行wp-config.php 文件以下是代码行:

header("Last-Modified: " . the_modified_date());
现在作者说就是这样。我不需要做任何其他事情来实现304 If Modified Since HTTP header. 但在完成此操作后,我使用该站点通过HTTP标头进行了测试

http://httpstatus.io/

下面是我的标题截图:

enter image description here

检查红色标记部分。上次修改的标题值为空。

之后我想这可能是the_modified_date() 所以我也试过get_the_modified_date() 作用但仍然没有结果。

最后,我创建了一个小的shortcode函数来测试这些函数是否正常工作,并在短代码中进行了响应。当我使用shortcode时,我可以清楚地看到函数工作正常,但由于某种原因,将空白发送到304 If Modified Since HTTP header.

我的网站是here

有什么建议可以解决这个问题吗?

3 个回复
最合适的回答,由SO网友:cybmeta 整理而成

the_modified_date() 是必须在循环中使用的模板标记,这就是为什么它不适合您。

WordPress提供了一个操作和过滤器挂钩,以包括或修改HTTP标头:

但它不适用于此目的。例如,下一个代码不起作用:

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

Why?

此时未生成主wp查询,也未在wp_headers 滤器所以is_singular() 退货false, get_queried_object_id() 退货NULL 而且无法获得当前帖子的修改时间。

一个可行的解决方案是template_redirect 行动挂钩,如Otto在this question (测试和工作):

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

}

SO网友:Mojamba

我试过了code from cybmeta 但日期设置不正确。我不完全确定原因,但调查后我发现Add Headers 该插件现在已被弃用,但它是有用代码的良好来源。在该插件中,作者以不同的方式设置上次修改的标题日期,并使用该日期修改代码。以下是我的结论:

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

SO网友:Travis Cat

我的解决方案Last-Modified 和正确的304 Not Modified

内部功能。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) );
                }
        }

    }

结束

相关推荐

尝试上载图像时出现HTTP错误

我得到一个HTTP error 尝试上载图像时。这个图像是6MB,但我之前可以上传一个10MB的图像。我设置了以下内容,但它们没有帮助:define(\'WP_MEMORY_LIMIT\', \'64MB\'); define(\'WP_DEBUG\', true); # could not start the upload post_max_size = 12M # php.ini upload_max_filesize = 12M # php.ini max_input