我网站上的一项功能允许注册用户为其组织创建日历。我们通过带有查询字符串参数的 URL 为这些日历提供动态生成的 iCal feed。任何人都可以通过将提供的 URL 输入 Google 日历、Outlook、iPhone 等来订阅这些源...
这几年来一直运行良好,但我们现在遇到了日历过时或删除的问题。如果注册用户显着更改或删除其帐户,则日历将不再存在,提要也将毫无用处。目前,我们为这些请求返回“404 - 未找到”错误(最近从“400 - 错误请求”更改为)。
我的问题是,除了返回 404 之外,还有什么方法可以让订阅者停止请求错误的 feed 吗?这是一个类似的问题,接受的答案建议返回 404 或 410 并希望客户端会看到错误并手动删除订阅。
到目前为止这似乎不起作用。我们每小时收到约 10 万个 Feed 请求,其中 30% 是针对已删除的日历。
Google、Apple 等公司在 Feed 中反复收到 404 错误时不会放弃吗?其他人是如何处理这个问题的?
如果这只是日志污染的问题,我不会太担心。但是,由于 feed 是动态生成的,因此每个请求都会访问后端数据库。处理过程很简单,似乎不会影响性能,但情况只会变得更糟。
如果这属于 ServerFault,我们深表歉意。虽然该问题影响我的服务器,但我相信解决方案是编程式的。
我不相信有一个简单的答案——我想以前就有人问过这个问题。
这就像当一些黑客使用您的网站进行登录或 xmlrpc 目标练习或只是寻找漏洞时,必须处理所有流量。或者垃圾邮件发送者尝试使用散弹枪发送电子邮件。或者当网络蜘蛛决定过度抓取您的网站时。您必须调整所有无用流量的大小。
您是否可以在数据库外生成并更新不良 ICS URL 的列表,并在请求接近数据库之前使用脚本检查并退回请求? 基本上尝试尽可能有效地处理问题。
您还可以在帐户删除中尝试添加一个步骤,要求用户转到其日历程序并删除提要,然后再继续。然而,这可能会引起不好的共鸣,并且可能无法完全解决问题。
看起来 410 GONE 并不比 404 NOT FOUND 好。所有点击我们提要的日历应用程序似乎都将任一响应视为“稍后再询问”。 (其中一些每小时重试一次!)
确实 似乎有帮助的一种方法是使用 200 响应返回静态“丢失的日历”,其中:
REFRESH-INTERVAL
以阻止日历应用程序轮询这不是 100% 有效:并非所有应用程序都遵守刷新间隔,而且我想并非所有用户都会注意到该事件(或者能够弄清楚如何取消订阅)。但在实践中,我们发现与我们之前的 4xx 响应相比,它似乎大大减少了丢失的日历流量。
这是一个示例(您至少需要更改
PRODID
和 UID
):
BEGIN:VCALENDAR
VERSION:1.0
PRODID:-//Your Company//Your Product v1.0//EN
METHOD:PUBLISH
NAME:Unavailable
DESCRIPTION:Calendar not available--please remove it
REFRESH-INTERVAL;VALUE=DURATION:P4W
BEGIN:VEVENT
SUMMARY:Calendar unavailable
DTSTART;VALUE=DATE:20240101
DTSTAMP:20240101T000000Z
UID:[email protected]
RRULE:FREQ=DAILY
DESCRIPTION:This calendar is no longer available.\n\n
Please unsubscribe or remove it from your calendar app settings.
LAST-MODIFIED:20240401T000000Z
END:VEVENT
END:VCALENDAR