307 редирект при загрузке аналитики.js в Хроме


Я создаю веб-приложение и использую Google Analytics (analytics.js) для аналитики. Недавно я заметил, что аналитика не работает должным образом в Chrome.

я загружаю аналитику, используя стандартный фрагмент кода в отдельном модуле и включенный через requirejs. Я проверил, что этот скрипт работает должным образом и выполняет фрагмент аналитики.

когда я проверяю сетевой трафик в Firefox, я вижу, что скрипт аналитики загружается из Google, как и ожидалось (Ответ HTTP 200):

однако, когда я запускаю ту же страницу в Chrome, я получаю ответ HTTP 307, указывающий на about:blank, а analytics не запускается:

однако, если я вставляю url analytics непосредственно в адресную строку Chrome, скрипт найден. Любые идеи, что здесь происходит, или как это исправить?

2 63

2 ответа:

307 Internal Redirect С Non-Authorative-Reason: Delegate указывает, что запрос был перехвачен и изменен (перенаправлен) расширением Chrome через webRequest или декларативный webRequest расширение API-интерфейсы.

вы можете узнать, какое расширение вызвало перенаправление следующим образом:

  1. посетить chrome://net-internals/#events
  2. вызовите запрос (google analytics, в вашем случае).
  3. вернуться chrome://net-internals/#events tab и искать URL_REQUEST соответствие вашему запросу (вы можете использовать поле поиска для фильтрации поиска).
  4. нажмите на запись, чтобы показать журнал с правой стороны. Вы увидите имя расширения, идентификатор расширения и другую информацию о запросе:
t=7910 [st=0] +REQUEST_ALIVE  [dt=6]
t=7910 [st=0]   +URL_REQUEST_DELEGATE  [dt=5]
t=7910 [st=0]      DELEGATE_INFO  [dt=5]
                   --> delegate_info = "extension [Name of extension]"
t=7915 [st=5]      CHROME_EXTENSION_REDIRECTED_REQUEST
                   --> extension_id = "ebmlimjkpnhckbaejoagnjlgcdhdnjlb"
t=7915 [st=5]   -URL_REQUEST_DELEGATE
t=7915 [st=5]   +URL_REQUEST_START_JOB  [dt=1]
                 --> load_flags = 339804160 (BYPASS_DATA_REDUCTION_PROXY | MAYBE_USER_GESTURE | REPORT_RAW_HEADERS | VERIFY_EV_CERT)
                 --> method = "GET"
                 --> priority = "LOW"
                 --> url = "https://www.google-analytics.com/analytics.js"
t=7915 [st=5]      URL_REQUEST_REDIRECT_JOB
                   --> reason = "Delegate"
t=7915 [st=5]      URL_REQUEST_FAKE_RESPONSE_HEADERS_CREATED
                   --> HTTP/1.1 307 Internal Redirect
                       Location: about:blank
                       Non-Authoritative-Reason: Delegate

в этом примере журнала расширение с именем " [Имя расширения] "и идентификатором расширения" ebmlimjkpnhckbaejoagnjlgcdhdnjlb " перенаправило запрос. После нахождения имени расширения и / или ID, вы можете посетить chrome://extensions и отключить или удалить расширение, которое изменило запрос.

в моем случае причина перенаправления 307 была более прозаичной. По привычке использовать протокол-относительные url, Я удалил протокол из URL в сценарии встраивания Google Universal Analytics, изменив https://www.google-analytics.com/analytics.js до //www.google-analytics.com/analytics.js.

например (Не пытайтесь сделать это дома):

(функция(я,ю,о,г,р,а,м){я['GoogleAnalyticsObject']=R;с Я[р]=я[Р] функция||(){ (i[r].q=i[r].вопрос.)][||push (аргументы)},i[r].l=1 * новая дата (); a=s. createElement (o), м=ы.метод getelementsbytagname(о)[0];а.ключевые слова async=1;а.СРЦ=г;м. parentNode.insertBefore(a, m) })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

это нецелесообразно, поскольку Google, по-видимому, обслуживает скрипт и отслеживает запросы только по https. Поэтому удаление протокола вызывает перенаправление как при первом включение скрипт как и в любом(!) последующий запрос отслеживания. Кроме того, как заявил Пол Айриш в обновлении к своему канонический пост о протоколе-относительные URL-адреса эта техника не рекомендуется, или действительно имеет достоинство:

теперь, когда SSL поощряется для всех и не имеет проблем с производительностью, этот метод теперь является анти-шаблоном. Если необходимый ресурс доступен по протоколу SSL, всегда используйте https: / / asset.