Почему короткие URL-адреса goo.gl не возвращают ожидаемый код статуса 301? - PullRequest
0 голосов
/ 19 июня 2020

Когда я делаю HttpWebRequest для URL-адреса с параметром AllowAutoRedirect, установленным на false, я ожидаю ответа с кодом состояния «Перемещено» или «Перемещено навсегда». Я использую .NetFramework, и если я использую .NetCore, это вызовет веб-исключение с кодом состояния «Перемещено постоянно».

Но по какой-то причине короткие URL-адреса goo.gl, которые перенаправляют на полный URL, просто верните код статуса «Найдено». Почему это происходит? Я создаю преобразователь коротких URL-адресов, но короткие URL-адреса goo.gl работают не так, как ожидалось.

Я использую приведенный ниже код, и он работает должным образом для других коротких 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;
            }
        }

1 Ответ

2 голосов
/ 19 июня 2020

Что заставляет вас думать, что это неожиданно? По сути, это временный ответ перенаправления; намерение здесь может быть двояким:

  1. , чтобы позволить Google редактировать URL-адреса и работать без браузеров и других вещей (прокси и др. c), игнорируя все дальнейшие проверки (игнорировать некоторые - это нормально - дело не в том, чтобы кешировать слишком агрессивно)
  2. , чтобы обеспечить лучший подсчет попаданий, не имея браузеров и других вещей (прокси и c), не позволяя большинство запросов попадают в google

Обратите внимание, что 307 («Временное перенаправление») и 302 («Найдено») имеют одинаковую семантику, за исключением того, что делать с методом HTTP; 307 явно сохраняет исходный HTTP-метод («POST», «GET» и т.д. c); 302 нет. По сути, это означает, что goo.gl сообщает «временное перенаправление, и вы можете свободно выполнять« GET », независимо от того, что вы делали изначально». Обратите внимание, что 301 («Перемещено навсегда») и 308 («Постоянное перенаправление») имеют одинаковую двойственность, но для невременных перенаправлений.

...