# Note: You will want to add the snippet: `include "pagespeed-requirement.vcl";` above your `vcl_recv` in the default.vcl file. sub vcl_recv { call pagespeed_capability_detection; } # Function derived from requirements here https://modpagespeed.com/doc/downstream-caching#ps-capabilitylist # Additional detection logic for crawlers, tablet and mobile devices. sub pagespeed_capability_detection { if (req.http.User-Agent ~ "(?i)Chrome/[3][2-9]+\.|Chrome/[4-9][0-9]+\.|Chrome/[0-9]{3,}\.") { # Cache-fragment 1: Desktop User-Agents that support lazyload_images (ll), # inline_images (ii), defer_javascript (dj), webp (jw) and lossless_webp # (ws). set req.http.PS-CapabilityList = "ll,ii,dj,jw,ws:"; } else if (req.http.User-Agent ~ "(?i)Firefox/[4-9].+|Firefox/[\d][\d]+|MSIE 10\.|Safari") { # Cache-fragment 2: Desktop User-Agents that support lazyload_images (ll), # inline_images (ii) and defer_javascript (dj). # Note: Wget is added for testing purposes only. set req.http.PS-CapabilityList = "ll,ii,dj:"; } else { # As a fallback, the PS-CapabilityList header that is sent to the upstream # PageSpeed server should be for a device with no browser specific optimizations. set req.http.PS-CapabilityList = "fully general optimizations only"; } # Cache-fragment 3: This fragment contains (a) Desktop User-Agents that # match fragments 1 or 2 but should not because they represent older # versions of certain browsers or bots and (b) Tablet User-Agents that # on all browsers and use image compression qualities applicable to large # screens. Note that even Tablets that are capable of supporting inline or # webp images, e.g. Android 4.1.2, will not get these advanced # optimizations. if (req.http.User-Agent ~ "(?i)Firefox/[1-2]\.|MSIE [5-8]\.|bot|Yahoo!|Ruby|RPT-HTTPClient|(Google \(\+https\:\/\/developers\.google\.com\/\+\/web\/snippet\/\))|Android|iPad|TouchPad|Silk-Accelerated|Kindle Fire") { set req.http.PS-CapabilityList = "LargeScreen.SkipUADependentOptimizations:"; } # Cache-fragment 4: Mobiles and small screen Tablets will use image compression # qualities applicable to small screens, but all other optimizations will be # those that work on all browsers. if (req.http.User-Agent ~ "(?i)Mozilla.*Android.*Mobile*|iPhone|BlackBerry|Opera Mobi|Opera Mini|SymbianOS|UP.Browser|J-PHONE|Profile/MIDP|portalmmm|DoCoMo|Obigo|Galaxy Nexus|GT-I9300|GT-N7100|HTC One|Nexus [4|7|S]|Xoom|XT907") { set req.http.PS-CapabilityList = "TinyScreen.SkipUADependentOptimizations:"; } } sub vcl_hash { # Split cache by PageSpeed capability hash_data(req.http.PS-CapabilityList); } sub vcl_deliver { # The following line can be uncommented for debugging purposes and will # add a response header to show the header parameter sent to pagespeed. #set resp.http.section-io-PS-capability = req.http.PS-CapabilityList; }