为什么 goo.gl 短网址不是 return 预期的 301 状态代码?

Why do goo.gl short URLs not return the expected status code of 301?

当我向 URL 发出 HttpWebRequest 并将 AllowAutoRedirect 设置为 false 时,我希望得到 StatusCode "Moved" 或 "Moved Permanently" 的响应。我正在使用 .NetFramework ,如果我使用 .NetCore,它会抛出带有 "Moved Permenently" 状态码的 Web 异常。

但出于某种原因,goo.gl 短 URL 重定向到完整 URL,只是 return 一个 "Found" 状态代码。为什么会这样?我正在构建一个简短的 URL 解析器,但是 goo.gl 简短的 URL 没有按预期运行。

我正在使用下面的代码,对于其他短 URLs,它按预期工作。

  public static string GetFullUrl(string url)
        {
            if (string.IsNullOrWhiteSpace(url))
                return "";

            var req = (HttpWebRequest)WebRequest.Create(url);
            req.AllowAutoRedirect = false;
            try
            {
                var resp = req.GetResponse();
                return resp.ResponseUri.AbsoluteUri;
            }
            catch (WebException ex)
            {
                if (ex.Response != null)
                {
                    var longUrl = ex.Response.Headers["Location"];
                    if (longUrl.Contains('?') || longUrl.Length <= 35 || longUrl.StartsWith("https://news.google.com/"))
                    {
                        return GetFullUrl(longUrl);
                    }
                    return longUrl;
                }
                return url;
            }
            catch (Exception)
            {
                return url;
            }
        }

是什么让您觉得出乎意料?这本质上是一个临时的重定向响应;这里的意图可能是双重的:

  1. 允许google编辑 URL 并使其工作,无需浏览器和其他东西(代理等)忽略所有进一步检查(忽略some 很好 - 关键是不要太积极地缓存)
  2. 允许更好的命中计数,通过不让浏览器和其他东西(代理等)不让大多数请求命中 google

请注意,307 ("Temporary Redirect") 和 302 ("Found") 具有相同的语义,除了 HTTP 方法的处理方式; 307 显式保留 原始 HTTP 方法("POST"、"GET" 等); 302 没有。实际上,这意味着 goo.gl 是在说“临时重定向,你应该随意做一个 "GET",不管你最初做了什么”。请注意,301 ("Moved Permanently") 和 308 ("Permanent Redirect") 具有相同的双重性,但用于非临时重定向。