微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Service Worker Network-Only for a single route

如何解决Service Worker Network-Only for a single route

我有一个 Apache VirtualHost,它被配置为充当反向代理,以便在 React 应用程序和节点服务器之间切换请求

<IfModule mod_ssl.c>
<VirtualHost *:443>
    
        ProxyPreserveHost On

        ServerAdmin ###     
        ServerName url.dom
        ServerAlias www.url.dom
    
    
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        ProxyPass /img http://0.0.0.0:8081/img/
        ProxyPassReverse /img http://0.0.0.0:8081/img/

        <Location /api/>

        ProxyPass http://0.0.0.0:8081/api/
        ProxyPassReverse http://0.0.0.0:8081/api/

        Header unset etag 
        Header add Cache-Control "no-store"
        </Location>

        ProxyPass / http://0.0.0.0:5000/
        ProxyPassReverse / http://0.0.0.0:5000/


SSLCertificateFile /etc/letsencrypt/live/candycandy.filippotiberio.it/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/candycandy.filippotiberio.it/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

这很完美。

在我的 React 应用程序中,我有一个路由器,它为包括 404-notFound 在内的所有路由提供服务。

...
              <Route exact path="/notfound">
                <Navbar />
                <Sidebar />
                <div class="E404">
                  <h1>Oops.</h1>
                  <small>404 - Not Found</small>
                  <br />
                  <Link to="/" className="b2h">
                    Go to Home
                  </Link>
                </div>
              </Route>

              <Route>
                <Redirect to="/notfound" />
              </Route>
            </Switch>
...

这也很完美...

我还有一个 manifest.json 和一个 service worker,它允许我像 PWA 一样安装应用程序。 这再次完美运行...

现在我遇到了问题: 我需要一个用户重定向https://url.dom/api/google 的按钮,这并不难... 当我单击按钮时,请求被 service worker 拦截,该请求将其发送到 React 而不是服务器上的 apache。该请求由呈现 notFound 页面的 React 处理。 禁用 Service Worker 不会出现问题,但 PWA 需要安装 Service Worker 才能工作。

请求网址:https://candycandy.filippotiberio.it/api/googleoauth/

请求方式:GET

状态代码:200 OK(来自服务工作者

推荐人政策:strict-origin-when-cross-origin

我可以告诉 Service Worker 仅针对特定路径将请求直接发送到网络而不是从缓存中选择吗?

我曾尝试做这样的事情:

// Listen for requests
self.addEventListener("fetch",(event) => {
  if (event.request.url.indexOf("/api/") !== -1) {
    return false;
  }

  event.respondWith(
    caches.match(event.request).then(() => {
      return fetch(event.request).catch(() => caches.match("offline.html"));
    })
  );
});

但它不起作用。

这是整个 Service Worker:

const CACHE_NAME = "version-2";
const urlsToCache = ["index.html","offline.html"];
const self = this;
// Install SWw
self.addEventListener("install",(event) => {
  event.waitUntil(
    caches.open(CACHE_NAME).then((cache) => {
      console.log("Opened cache");
      return cache.addAll(urlsToCache);
    })
  );
});
// Listen for requests
self.addEventListener("fetch",(event) => {
  if (event.request.url.indexOf("/api/") !== -1) {
    return false;
  }

  event.respondWith(
    caches.match(event.request).then(() => {
      return fetch(event.request).catch(() => caches.match("offline.html"));
    })
  );
});
// Activate the SW
self.addEventListener("activate",(event) => {
  const cacheWhitelist = [];
  cacheWhitelist.push(CACHE_NAME);
  event.waitUntil(
    caches.keys().then((cacheNames) =>
      Promise.all(
        cacheNames.map((cacheName) => {
          if (!cacheWhitelist.includes(cacheName)) {
            return caches.delete(cacheName);
          }
        })
      )
    )
  );
});

我知道这不是一个好问题,但我无法摆脱它。 非常感谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。