【问题标题】:Why do goo.gl short URLs not return the expected status code of 301?为什么 goo.gl 短网址没有返回预期的 301 状态码?
【发布时间】:2020-10-09 12:48:19
【问题描述】:

当我向一个将 AllowAutoRedirect 设置为 false 的 URL 发出 HttpWebRequest 时,我希望得到一个 StatusCode 为“已移动”或“永久移动”的响应。我正在使用 .NetFramework ,如果我使用 .NetCore,它会抛出带有“Moved Permenently”状态代码的 Web 异常。

但由于某种原因,goo.gl 短 URL 重定向到完整 URL,只返回“找到”状态代码。为什么会这样?我正在构建一个短 URL 解析器,但 goo.gl 短 URL 的行为不符合预期。

我正在使用下面的代码,它对其他短 URL 的工作方式与预期一样。

  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;
            }
        }

【问题讨论】:

标签: c# .net httprequest httpresponse http-response-codes


【解决方案1】:

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

  1. 允许 google 编辑 URL 并使其正常工作,而无需浏览器和其他东西(代理等)忽略所有进一步检查(忽略 一些 很好 - 重点不是缓存过于激进)
  2. 通过不让浏览器和其他东西(代理等)不让大多数请求命中 google 来实现更好的命中计数

请注意,307(“临时重定向”)和 302(“找到”)具有相同的语义,除了对 HTTP 方法的处理方式; 307 明确保留原始 HTTP 方法(“POST”、“GET”等); 302 没有。实际上,这意味着 goo.gl 说的是“临时重定向,你应该随意做一个“GET”,不管你最初做了什么”。请注意,301(“永久移动”)和 308(“永久重定向”)具有相同的对偶性,但用于非临时重定向。

【讨论】:

  • 我没有意识到“找到”是一个重定向状态码。同样在像 (replace - with . to the url, stack overflow won't let me post) "goo-gl/Y5VIoG" 之类的情况下,它重定向到 google,响应标头 Location 似乎没有扩展的 URL。我对不一致感到困惑。我将更新我的代码以查找所有重定向代码,而不仅仅是移动/永久移动/网络异常
  • @PrashanthSubramanian 3** 范围内的任何内容都是重定向 - 同样 5** 是服务器错误,4** 是(可能)客户端错误,2** 是成功,1** 是信息
猜你喜欢
  • 1970-01-01
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 2014-11-17
  • 2016-12-15
  • 1970-01-01
  • 2011-01-01
相关资源
最近更新 更多