如何取消发布 iCal (*.ics) 源?

问题描述 投票:0回答:2

我网站上的一项功能允许注册用户为其组织创建日历。我们通过带有查询字符串参数的 URL 为这些日历提供动态生成的 iCal feed。任何人都可以通过将提供的 URL 输入 Google 日历、Outlook、iPhone 等来订阅这些源...

这几年来一直运行良好,但我们现在遇到了日历过时或删除的问题。如果注册用户显着更改或删除其帐户,则日历将不再存在,提要也将毫无用处。目前,我们为这些请求返回“404 - 未找到”错误(最近从“400 - 错误请求”更改为)。

我的问题是,除了返回 404 之外,还有什么方法可以让订阅者停止请求错误的 feed 吗?这是一个类似的问题,接受的答案建议返回 404 或 410 并希望客户端会看到错误并手动删除订阅。

到目前为止这似乎不起作用。我们每小时收到约 10 万个 Feed 请求,其中 30% 是针对已删除的日历。

Google、Apple 等公司在 Feed 中反复收到 404 错误时不会放弃吗?其他人是如何处理这个问题的?

如果这只是日志污染的问题,我不会太担心。但是,由于 feed 是动态生成的,因此每个请求都会访问后端数据库。处理过程很简单,似乎不会影响性能,但情况只会变得更糟。

如果这属于 ServerFault,我们深表歉意。虽然该问题影响我的服务器,但我相信解决方案是编程式的。

calendar icalendar
2个回答
1
投票

我不相信有一个简单的答案——我想以前就有人问过这个问题。

这就像当一些黑客使用您的网站进行登录或 xmlrpc 目标练习或只是寻找漏洞时,必须处理所有流量。或者垃圾邮件发送者尝试使用散弹枪发送电子邮件。或者当网络蜘蛛决定过度抓取您的网站时。您必须调整所有无用流量的大小。

您是否可以在数据库外生成并更新不良 ICS URL 的列表,并在请求接近数据库之前使用脚本检查并退回请求? 基本上尝试尽可能有效地处理问题。

您还可以在帐户删除中尝试添加一个步骤,要求用户转到其日历程序并删除提要,然后再继续。然而,这可能会引起不好的共鸣,并且可能无法完全解决问题。


0
投票

看起来 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
© www.soinside.com 2019 - 2024. All rights reserved.