Рейтинг:0

Как вернуть Service Worker с настраиваемым заголовком HTTP из настраиваемого модуля

флаг ng

У меня есть собственный модуль, предоставляющий файл Service Worker HTML5 под /modules/custom/my_blocks/assets/js/service-worker.js. Поскольку Service Worker находится не в корне сервера Drupal, мне нужно вернуть файл с дополнительным Service-Worker-Allowed HTTP-заголовок.

Как это сделать в моем модуле?

Jaypan avatar
флаг de
Это не проблема Drupal. Файл является статическим файлом, он не обрабатывается через Drupal, поэтому заголовки HTTP необходимо добавлять через сервер.
david avatar
флаг ng
Но я мог бы предоставить статический файл динамически через Drupal, верно? Следовательно, он также должен быть перехватываемым.
Jaypan avatar
флаг de
Ах, я понял, Реми дал ответ, как обслуживать его через Drupal. Тем не менее, я бы посмотрел, как это сделать с помощью `.htaccess` или чего-то еще, чтобы Drupal не нужно было загружать для обслуживания файла.
david avatar
флаг ng
`.htaccess` не сработает. Мне нужно динамически создавать сервис-воркер и/или связанные файлы кеша, так как их нужно обновлять по мере изменения содержимого моего сайта Drupal.
Рейтинг:4
флаг vg

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

 публичная функция serve (запрос $ request) {
    $file_str = $file_system->realpath($module_handler->getModule('my_module')->getPath()) . '/assets/js/service-worker.js';

    если (файл_существует($file_str)) {

      $response = новый BinaryFileResponse($file_str, 200);
      $response->headers->set('Content-Type', 'application/javascript');
      // Разрешить сервис-воркер того же происхождения.
      $response->headers->set('Service-Worker-Allowed', '/');

      вернуть $ответ;
    }

    бросить новое исключение NotFoundHttpException();
  }

А затем определите для него маршрут, где путь не существует в виде статического файла, например:

пример.serviceworker:
  путь: '/serviceworker' 
  значения по умолчанию: 
    _controller: '\Drupal\my_module\Controller\ExampleController::serve' 
  требования: 
    _permission: 'доступ к содержимому' 

видеть - https://www.drupal.org/docs/drupal-apis/routing-system/introductory-drupal-8-routes-and-controllers-example.

david avatar
флаг ng
Отличное прозрачное и чистое решение. Это то, что я искал. Большое спасибо!
david avatar
флаг ng
Исправлена ​​небольшая проблема: Drupal не перехватывает маршрут «serviceworker.js», поэтому мне пришлось удалить расширение. С другой стороны, маршрут «/serviceworker» работает, как и ожидалось.
флаг vg
np ;) и спасибо за исправления кода ;) Не могли бы вы также пометить ответ как принятый, пожалуйста?

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.