脱机网站将uri重定向为rootpage

时间:2017-08-28 08:26:08

标签: javascript http redirect progressive-web-apps

我尝试使用javascript serviceworkers 构建离线网页。 在我的情况下有我的网址:www.xxx.xx / home。 如果我调用像www.xxx.xx / index.php这样的页面,我可以将index.php放入离线缓存中,并且它可以脱机使用。 但/ home(内部路由到index.php与mod_rewrite / apache2.4)存储为密钥,但在iam离线后它不可用。

var CACHE_NAME = 'cache-v1';
var urlsToCache = ['/', '/home', '/index.php'];
self.addEventListener('install', function(event) {
  // Perform install steps
  console.log("Install Cache");
  event.waitUntil(
    caches.open(CACHE_NAME).then(function(cache) {
        console.log(urlsToCache.length + " files installed successfully");
        return cache.addAll(urlsToCache);
    })
  );
});

有了这样的东西,index.php可以离线调用,但不能调用xxx.xx / home。 如何缓存重定向/重写的uri?

类似的东西:

this.addEventListener('activate', function(event) {
    event.waitUntil(
        caches.open(CACHE_NAME).then(function(cache) {
            cache.keys().then(function(keys) {
                keys.forEach(function(request, index, array) {
                     console.log(index + " Url: " + request.url + " follow: " + request.redirect + " mode: " + request.cache);
                });
            });
        })
    );
});

结果

serviceworker.js:37 0 Url:--httpsurl - / follow:follow mode:undefined

serviceworker.js:37 1网址:--httpsurl - / home follow:关注模式:undefined

serviceworker.js:37 2 Url:--httpsurl - / index.php follow:follow mode:undefined

在Chrome和Firefox(最新版本)中测试

1 个答案:

答案 0 :(得分:0)

似乎cache.addAll仅缓存请求正文而不缓存已传递的内容。 它似乎与cache.put一起用作fetch事件监听器中的回退。 但是出现了第二个问题:Firefox说“从德语翻译”,“损坏内容,违反了网络协议”。

self.addEventListener('fetch', function(event) {
    event.respondWith(
    caches.match(event.request).then(function(response) {
        // Cache hit - return response
        if(response) {
             console.log("Found " + event.request + " in cache");
             return response;
        } else {
        console.log("Do not found " + event.request + " in cache");
    }

    console.log("Fetch Url: " + event.request.url + " follow: " + event.request.redirect + " mode: " + event.request.cache);
    if(event.request.headers.get('Accept').indexOf('text/html') !== -1 || event.request.headers.get('Accept').indexOf('css') !== -1 || event.request.headers.get('Accept').indexOf('javascript') !== -1) {
        return fetch(event.request).then(function(response) {
            let copy = response.clone();
            event.waitUntil(
                caches.open(CACHE_NAME).then(function(cache) { cache.put(event.request.url, copy); })
            );
            return response || caches.match('/offline');
        }).catch(function(error) {
            console.log(error);
        });
    } else {
        console.log(event.request.headers.get('Accept'));
        return fetch(event.request);
    }
    }));
});

如果你从静态chache中删除'/ home',它可以在chrome中使用。 但要注意:如果serviceworker激活在/ home上,则必须出现第二次单击才能调用fetch事件。