В стеке LAMP у нас есть статический manifest.appcache
файл, который работает нормально. Но теперь нам нужно динамически генерировать этот appcache. К сожалению, Chrome и FF отказываются принять manifest.appcache
когда генерируется динамически.
Вот HTTP-ответ для статически сгенерированного appcache (я получаю это из Chrome >> about-appcache-internals
>> View Entries
>> Нажмите на example.com/manifest.appcache
):
http://www.openbook.pub/manifest.appcache
HTTP/1.1 200 OK
Date: Tue, 07 Apr 2015 06:43:53 GMT
Server: Apache
Last-Modified: Tue, 07 Apr 2015 06:34:13 GMT
ETag: "207-5131c9a591f11"Accept-Ranges: bytes
Content-Length: 519
Cache-Control: no-cache, private
Expires: Tue, 07 Apr 2015 06:43:53 GMT
Content-Type: text/cache-manifest
Showing 519 of 519 bytes
00000000: 43 41 43 48 45 20 4d 41 4e 49 46 45 53 54 0a 23 CACHE MANIFEST.#
00000010: 31 34 32 38 33 34 36 33 38 35 0a 0a 43 41 43 48 1428346385..CACH
00000020: 45 3a 0a 2f 61 73 73 65 74 73 2f 62 64 62 66 30 E:./assets/bdbf0
00000030: 38 38 2f 63 73 73 2f 6f 70 65 6e 62 6f 6f 6b 2e 88/css/openbook.
00000040: 63 73 73 0a 2f 61 73 73 65 74 73 2f 62 64 62 66 css./assets/bdbf
00000050: 30 38 38 2f 66 6f 6e 74 65 6c 6c 6f 2f 63 73 73 088/fontello/css
00000060: 2f 66 6f 6e 74 65 6c 6c 6f 2e 63 73 73 0a 2f 61 /fontello.css./a
00000070: 73 73 65 74 73 2f 62 64 62 66 30 38 38 2f 6a 73 ssets/bdbf088/js
00000080: 2f 67 6c 6f 62 61 6c 2e 65 76 65 6e 74 73 2e 6a /global.events.j
00000090: 73 0a 2f 61 73 73 65 74 73 2f 62 64 62 66 30 38 s./assets/bdbf08
000000a0: 38 2f 6a 73 2f 6a 71 75 65 72 79 2e 6d 6f 75 73 8/js/jquery.mous
000000b0: 65 77 68 65 65 6c 2e 6a 73 0a 2f 61 73 73 65 74 ewheel.js./asset
000000c0: 73 2f 62 64 62 66 30 38 38 2f 6a 73 2f 70 6c 75 s/bdbf088/js/plu
000000d0: 67 2e 64 72 6f 70 2e 6d 65 73 73 61 67 65 2e 6a g.drop.message.j
000000e0: 73 0a 2f 61 73 73 65 74 73 2f 62 64 62 66 30 38 s./assets/bdbf08
000000f0: 38 2f 6a 73 2f 70 6c 75 67 2e 69 6e 74 65 72 70 8/js/plug.interp
00000100: 72 65 74 2e 6a 73 0a 2f 61 73 73 65 74 73 2f 62 ret.js./assets/b
00000110: 64 62 66 30 38 38 2f 6a 73 2f 70 6c 75 67 2e 74 dbf088/js/plug.t
00000120: 6f 6f 6c 2e 6a 73 0a 2f 61 73 73 65 74 73 2f 62 ool.js./assets/b
00000130: 64 62 66 30 38 38 2f 6a 73 2f 70 6c 75 67 2e 6f dbf088/js/plug.o
00000140: 70 65 6e 62 6f 6f 6b 2e 6a 73 0a 2f 62 6f 6f 6b penbook.js./book
00000150: 73 2f 54 72 75 74 68 2b 61 6e 64 2b 50 6f 77 65 s/Truth+and+Powe
00000160: 72 0a 2f 62 6f 6f 6b 73 2f 54 72 75 74 68 2b 61 r./books/Truth+a
00000170: 6e 64 2b 50 6f 77 65 72 2f 70 6f 73 74 6d 6f 64 nd+Power/postmod
00000180: 65 72 6e 2b 6d 61 6e 2b 70 65 72 73 6f 6e 0a 2f ern+man+person./
00000190: 62 6f 6f 6b 73 2f 54 72 75 74 68 2b 61 6e 64 2b books/Truth+and+
000001a0: 50 6f 77 65 72 2f 77 68 61 74 2b 69 73 2b 68 69 Power/what+is+hi
000001b0: 73 74 6f 72 79 25 33 46 0a 2f 62 6f 6f 6b 73 2f story%3F./books/
000001c0: 54 72 75 74 68 2b 61 6e 64 2b 50 6f 77 65 72 2f Truth+and+Power/
000001d0: 73 6f 75 72 63 65 73 2b 6f 66 2b 74 72 75 74 68 sources+of+truth
000001e0: 0a 0a 46 41 4c 4c 42 41 43 4b 3a 0a 2f 20 2f 73 ..FALLBACK:./ /s
000001f0: 69 74 65 2f 6f 66 66 6c 69 6e 65 0a 0a 4e 45 54 ite/offline..NET
00000200: 57 4f 52 4b 3a 0a 2a WORK:.*
Все идет нормально. Теперь я использую PHP / Yii2 для динамического генерирования идентичного ответа HHTP. Вот код:
$manifest = $this->assembleManifest();
$etag = md5('openbook' . $timestamp);
header('Last-Modified: '.gmdate('D, d M Y H:i:s \G\M\T', time()-3600));
header("ETag: \"2e2-51312d1828aa4\"");
header('Accept-Ranges: bytes');
header("Content-length: ". strlen($manifest));
header('Cache-Control: no-cache, private');
header('Expires: '.gmdate('D, d M Y H:i:s \G\M\T', time()));
header('Content-Type: text/cache-manifest');
echo $manifest;
Как уже было сказано, и Chrome, и FF не распознают этот HTTP-ответ как appcache
, В Fiddler я могу проверить ответ и не вижу существенных различий со статически сгенерированным ответом. Вот заголовки:
HTTP/1.1 200 OK
Date: Tue, 07 Apr 2015 07:04:18 GMT
Server: Apache
ETag: "2e2-51312d1828aa4"Accept-Ranges: bytes
Cache-Control: no-cache, private
Expires: Tue, 07 Apr 2015 07:04:18 GMT
Last-Modified: Tue, 07 Apr 2015 06:04:18 GMT
Content-length: 519
Keep-Alive: timeout=2, max=98
Connection: Keep-Alive
Content-Type: text/cache-manifest
Браузеры просто не могут распознать это как appcache. Например, в FF-консоли команда appcache validate
получает ответ «Указанная страница не имеет манифеста.»
Я также попытался установить заголовок, как предложено в этот урок
header('Cache-Control: max-age=0, no-cache, no-store, must-revalidate');
header('Pragma: no-cache');
header('Expires: Wed, 11 Jan 1984 05:00:00 GMT');
header('Content-Type: text/cache-manifest');
Тоже не работает
Что может быть не так?
Задача ещё не решена.
Других решений пока нет …