2016-12-29 7 views
10

Когда я пытаюсь добавить сервис-работника на страницу прогрессивного веб-приложения, почему в консоли браузера отображается следующая ошибка?Почему я вижу «Ошибка - только защищенные корни разрешены» для моего сервисного работника?

ERROR "Uncaught (in promise) DOMException: Only secure origins are allowed 

JS код:

(function() { 
    'use strict'; 

    // TODO add service worker code here 
    if ('serviceWorker' in navigator) { 
     navigator.serviceWorker 
      .register('service-worker.js') 
      .then(function() { 
       console.log('Service Worker Registered'); 
      }); 
    } 
})(); 

ответ

13

От Service Worker FAQ:

Q: Я получаю сообщение об ошибке о "Только безопасные происхождение разрешено". Зачем?

A: Работники сферы обслуживания доступны только «безопасные происхождение» (HTTPS сайтов, в основном) в соответствии с политикой, предпочитать безопасные истоки для новых мощных функций. Однако http://localhost также считается безопасным источником, поэтому, если вы можете, разработка на localhost - это простой способ избежать этой ошибки.

Вы также можете использовать флаг командной строки --unsafely-treat-insecure-origin-as-secure. Этот флаг должен быть объединен с флагом --user-data-dir. Например:

$ ./chrome --user-data-dir=/tmp/foo --unsafely-treat-insecure-origin-as-secure=http://your.insecure.site 

Если вы хотите проверить на https://localhost с самоподписанным сертификатом, сделайте следующее:

$ ./chrome --allow-insecure-localhost https://localhost 

Вы также можете найти --ignore-certificate-errors флаг полезным.

+7

Опции локальной плохо реализован. Он должен проверять все, что разрешает 127.0.0.1, а не имя хоста. Поэтому я должен иметь возможность использовать 'local.example.com', если он указывает на 127.0.0.1, как и на всех моих других сайтах разработки. – colan

+0

Где я могу запустить все эти флаги? Похоже, вы передаете флаги при установке хром на платформу * nix. Если это так, как насчет пользователей Windows? – samayo

+0

Могу ли я добавить исключение прямо в браузер или конфигурацию где-нибудь. Вместо того, чтобы запускать это так. –

0

Вы можете проверить протокол перед регистрацией работника службы, как это, location.protocol === 'https:' && serviceWorker.register('service-worker.js')