Apache服务器上的自定义WordPress提要返回304响应,用于IF-MODIFIED-自

时间:2021-04-24 作者:puzzledbeginner

我的WordPress网站运行在共享的Apache Web服务器上。我使用一个商业插件来记录客户预订。此插件在plugin init中使用add\\u feed()注册自定义WordPress提要。当使用其链接请求时,服务器提要响应包含内联。ics日历文件:插件为“内容类型:文本/日历”设置了一些标题行;字符集=utf-8“和”内容配置:内联;文件名=\'$文件名)。然后,它通过在带有预订的表中循环生成VEVENT。因此,此提要没有以任何方式链接到正常帖子等。同样需要注意的是,插件不会在标题中输出上次修改的日期。此提要适用于大多数请求web日历文件的设备和外部站点。

我的一台设备(iOS 14上的iPhone)无法刷新此日历订阅。初始订阅在设备上生成了有效的web日历,但无法进行更新。通过检查标题,可以清楚地看出,iPhone是唯一在尝试刷新/更新日历时在其请求标题中发送if-modified-since的设备。web服务器响应为304未修改,并且未发送提要/文件。

我现在有一个解决方法。htaccess,它消除了的请求标头中的if-modified-since。ics文件,但这并不能解决根本原因。

问题是,web服务器将if modified since日期与另一个日期进行比较,可能是它为原始文件发送的最后一个修改日期。正如所指定的,最后一次修改不是由插件生成的,但服务器每次都会输出它。插件作者不知道该提要的最后修改日期来自何处。他们说WordPress不提供挂钩或操作来设置/修改提要的日期,因为它是动态生成的。使用来自其服务器的feed进行测试:该feed始终是交付的,尽管feed头中包含的最后一次修改要晚于iPhone请求头中的if-modified-since。

当返回此WordPress提要的304响应时,有没有建议我的Apache服务器或WordPress配置可以执行哪个日期比较?有什么办法解决这个问题吗?

1 个回复
SO网友:gmelis

我相信您的服务器的回复包括Etag, 然后客户端使用它来发出请求。如果从应答中删除此标头,则客户端不会设置If-None-Match 当发出请求时,服务器将向客户端发送正确的答复。因此,在中添加以下行.htaccess 应解决问题:

# Disable ETags
<IfModule mod_headers.c>
    Header unset ETag
</IfModule>
FileETag None

Correction

插件回复包括last-modified 标题,如中所示

last-modified: Wed, 21 Apr 2021 18:22:20 GMT

这本身就是一件好事,除非不是。因为一些我不知道的原因(bug?)此标题中的日期始终保持不变,无论此后日历中发生了什么更改。一些移动客户端在其请求中包括If-Modified-Since 标题,如中所示

If-Modified-Since:Thu, 27 May 2021 13:23:28 GMT

如果这个日期比last-modified 日期,服务器发送304, 否则a200. 自last-modified 日期固定在过去,服务器总是发送304。要做的干扰最小的事情是要求服务器忽略If-Modified-Since 收割台,使用RequestHeader 指令如下:

# Disable ETags from replies and If-Modified-Since from requests
<IfModule mod_headers.c>
    Header unset ETag
    RequestHeader unset If-Modified-Since
</IfModule>
FileETag None
这需要在每次请求时下载日历的额外费用,不考虑是否有任何实际变化,但在我的情况下,这是可以接受的费用。