如何识别短URL like goo.gl in PHP的域名?

How to identify domain name with Short URL like goo.gl in PHP?

我有一个论坛,我有 MySQL table 存储垃圾邮件域。所以任何人都不能把 URL 包含在我的 MySQL table.

一些用户使用 https://goo.gl/ 服务发送垃圾邮件。但我无法阻止 goo.gl 域,因为它对其他用户也有影响。

当用户使用 https://goo.gl/ 等短 URL 服务时,是否可以使用 PHP 找到实际域?

你应该查看 Google 关于 goo_gl 的开发者文档,它解释了如何扩展 urls https://developers.google.com/url-shortener/v1/getting_started 到 Point expand shortened url

我可以想到两种方法:

1) 第一个特定于 goo.gl,但其他服务可能有类似的接口:使用 Google URL Shortnener API。您可以发出请求,传递任何 goo.gl,并接收 JSON 包括原始 URL,然后您可以解析并提取域名以检查您的黑名单。

具体方法见https://developers.google.com/url-shortener/ for an overview, and https://developers.google.com/url-shortener/v1/url/get

2) 这比较粗糙,但应该适用于几乎任何缩短的服务:只需请求 URL(例如使用 cURL),并且由于它本质上是一种重定向服务,您应该返回 HTTP 302 响应,响应 header 中将包含 Location header,显示真实的 URL。您可以再次提取它,解析出域名并根据您的黑名单进行检查。这种方法肯定适用于 goo.gl URLs,我已经检查过,它们肯定是 return 一个 302 和 header。如果其他服务有任何不同,我会感到惊讶,因为这是通知 HTTP 客户端 URL 是永久重定向的标准 www 约定。

当然,这两种方法都会给您的处理增加一些开销,因此您应该关注性能。您可能想要维护一份 well-known URL 缩短服务的列表,因此您可以首先检查您是否真的需要将其解析为原始 URL 。否则,您最终会向用户提交的每个 URL 发出 HTTP 请求,这没有必要并且会减慢速度 - 特别是如果那些合法的 URL 是 content-heavy and/or 需要很长时间才能响应(而 API 调用或调用 URL 只是 return 一个没有内容的简单 302 响应应该相当快)。