Az alábbi problémával találkoztam a minap: egyszerű, lokális futtatáskor, ha adott egy Google Analytics (egészen pontosan Universal Analytics) JS snippet-et is tartalmazó HTML oldal (mondjuk egy egyszerű „index.html”), akkor azt közvetlenül böngészőben megnyitva (file:///C:/<elérés>/index.html az address box-ban) a Google Analytics hívás előbb-utóbb timeout-tal elszáll Google Chrome böngészőben (v36), és a végeredmény:
Failed to load resource: net::ERR_FILE_NOT_FOUND file://www.google-analytics.com/analytics.js
Az Internet Explorer 11-ben is hasonló a helyzet, csak még tovább „próbálkozik” (érdekes, hogy Firefox v30 esetében viszont kevésbé érzékelhető mindez).
A probléma lényegében minden böngésző esetében ugyanarra az okra vezethető vissza (és nem is Analytics JS snippet specifikus a jelenség): ha „file://” protokollal történik a HTML oldal megnyitása, akkor a böngészők lokális helyről („file://” protokollal) próbálják betölteni a kért erőforrást, és nem is adják fel a próbálkozást egykönnyen… (a „file://” hivatkozás igen árulkodó a fenti hibajelzésben is).
Egyébként a „//” kezdetű URL hivatkozás teljesen helyes (protocol relative URL), az RFC3986 tartalmazza.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
The generic URI syntax consists of a hierarchical sequence of components referred to as the scheme, authority, path, query, and fragment. URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] hier-part = "//" authority path-abempty / path-absolute / path-rootless / path-empty The scheme and path components are required, though the path may be empty (no characters). When authority is present, the path must either be empty or begin with a slash ("/") character. When authority is not present, the path cannot begin with two slash characters ("//"). These restrictions result in five different ABNF rules for a path (Section 3.3), only one of which will match any given URI reference. The following are two example URIs and their component parts: foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment | _____________________|__ / \ / \ urn:example:animal:ferret:nose |
(from: http://www.ietf.org/rfc/rfc3986.txt)
Természetesen szerveren futtatva nincs is probléma, de ha mégis szükséges a lokális működés (akár csak tesztelési céllal), akkor gyors megoldásként kicsit módosítsunk a JS snippet-en:
1 2 3 4 5 6 7 8 9 10 11 12 |
<!-- Google Analytics --> <script> (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-XXXX-Y', 'auto'); ga('send', 'pageview'); </script> <!-- End Google Analytics --> |
A ‘//www.google-analytics.com/analytics.js’ string-et írjuk át ‘http://www.google-analytics.com/analytics.js’ értékre. Vagy http és https vegyes használat esetén: cseréljük ki az alábbiakra: (‘https:’ == document.location.protocol ? ‘https://’ : ‘http://’) +’www.google-analytics.com/analytics.js’
Azt nem ellenőriztem, hogy ilyenkor az események megjelennek-e Analytics-ben, de vélhetően a következetes működés/hit-ek regisztrálása nem működik, mert pl. nincs domain amihez a cookie-k beállíthatóak lennének… Ez utóbbi eset még localhost-on történő tesztelésnél is gond, de erre legalább van hivatalos megoldás:
Testing on localhost
In some cases you might want to test analytics.js from a webserver running on
localhost
. To set analytics.js cookies, you need to disable the default cookie domain using: ga(‘create’, ‘UA-XXXX-Y’, { ‘cookieDomain’: ‘none’ });
(from: https://developers.google.com/analytics/devguides/collection/analyticsjs/advanced)