Skip to content

Instantly share code, notes, and snippets.

@sriharsha-y
Created June 25, 2024 16:34
Show Gist options
  • Save sriharsha-y/4182b601c2daef407758d90cb3e68fe4 to your computer and use it in GitHub Desktop.
Save sriharsha-y/4182b601c2daef407758d90cb3e68fe4 to your computer and use it in GitHub Desktop.
rocket-nginx mobile cache fix (for CloudFlare APO / Pro users)
###################################################################################################
# Rocket-Nginx
#
# Rocket-Nginx is a NGINX configuration to speedup your WordPress
# website with the cache plugin WP-Rocket (http://wp-rocket.me)
#
# Author: Maxime Jobin
# Maintainer: SatelliteWP.com
# URL: https://github.com/satellitewp/rocket-nginx
#
# Tested with WP-Rocket version: 3.14.4.2
# Tested with NGINX: 1.25.2 (mainline)
#
# Version 3.0.2
#
###################################################################################################
# Add debug information into header
set $rocket_debug #!# DEBUG #!#;
###################################################################################################
# Do not alter theses values
#
set $rocket_bypass 1; # Should NGINX bypass WordPress and call cache file directly ?
set $rocket_encryption ""; # Is GZIP accepted by client ?
set $rocket_file ""; # Filename to look for
set $rocket_is_bypassed "MISS"; # Header text added to check if the bypass worked or not. Header: X-Rocket-Nginx-Serving-Static
set $rocket_reason ""; # Reason why cache file was not used. If cache file is used, what file was used
set $rocket_https_prefix ""; # HTTPS prefix to use when cached files are using HTTPS
set $rocket_has_query_cache 0; # Checks if a query string from URL is found from the cached query string
set $rocket_is_https 0; # Checks if the request is HTTPS
set $rocket_support_webp 0; # Checks if the request supports WebP
set $rocket_dynamic ""; # Dynamic value to add to cached filename
###################################################################################################
# PAGE CACHE
#
#!# INCLUDE_START #!#
# Define Rocket-Nginx $is_args
set $rocket_is_args $is_args;
set $rocket_uri_path "";
if ($request_uri ~ "^([^?]*)(\?.*)?$") {
set $rocket_uri_path $1;
}
# Is GZIP accepted by client ?
if ($http_accept_encoding ~ gzip) {
set $rocket_encryption "_gzip";
}
# Is Brotli accepted by client ?
if ($http_accept_encoding ~ br) {
set $rocket_encryption "";
}
# Is HTTPS request ?
if ($https = "on") { set $rocket_is_https 1; }
if ($http_x_forwarded_proto = "https") { set $rocket_is_https 1; }
if ($http_front_end_https = "on") { set $rocket_is_https 1; }
if ($http_x_forwarded_protocol = "https") { set $rocket_is_https 1; }
if ($http_x_forwarded_ssl = "on") { set $rocket_is_https 1; }
if ($http_x_url_scheme = "https") { set $rocket_is_https 1; }
if ($http_forwarded ~ /proto=https/) { set $rocket_is_https 1; }
if ($rocket_is_https = "1") {
set $rocket_https_prefix "-https";
}
# Check if request supports WebP ?
if ($http_accept ~* "webp") {
set $rocket_support_webp "1";
}
# Set mobile detection file path
# set $rocket_mobile_detection "$document_root/#!# WP_CONTENT_URI #!#/cache/wp-rocket/$http_host/$request_uri/.mobile-active";
# Query strings to ignore
#!# QUERY_STRING_IGNORE #!#
if ($rocket_args = "") {
set $rocket_is_args "";
}
# Query string to cache
#!# QUERY_STRING_CACHE #!#
# File/URL to return IF we must bypass WordPress
# Desktop: index.html
# Gzip: index.html_gzip
# HTTPS: index-https.html
# Mobile: index-mobile-https.html
set $rocket_file_start "index$rocket_https_prefix";
# Check is mobile client
if ($http_cf_device_type = mobile) {
set $rocket_file_start "index-mobile$rocket_https_prefix";
}
set $rocket_pre_url "/#!# WP_CONTENT_URI #!#/cache/wp-rocket/$http_host/$rocket_uri_path/$rocket_args/";
set $rocket_pre_file "$document_root/#!# WP_CONTENT_URI #!#/cache/wp-rocket/$http_host/$rocket_uri_path/$rocket_args/";
# Standard cache file format
set $rocket_url "$rocket_pre_url$rocket_file_start$rocket_dynamic.html";
set $rocket_file "$rocket_pre_file$rocket_file_start$rocket_dynamic.html";
# Check if gzip version cached file is available
if (-f "$rocket_file$rocket_encryption") {
set $rocket_file "$rocket_file$rocket_encryption";
set $rocket_url "$rocket_url$rocket_encryption";
}
# Do not bypass if the cached file does not exist
if (!-f "$rocket_file") {
set $rocket_bypass 0;
set $rocket_is_bypassed "MISS";
set $rocket_reason "File not cached";
}
# Do not bypass if it's a POST request
if ($request_method = POST) {
set $rocket_bypass 0;
set $rocket_is_bypassed "BYPASS";
set $rocket_reason "POST request";
}
# Do not bypass if arguments are found (e.g. ?page=2)
if ($rocket_is_args) {
set $rocket_bypass 0;
set $rocket_is_bypassed "BYPASS";
set $rocket_reason "Arguments found";
}
# Do not bypass if the site is in maintenance mode
if (-f "$document_root/.maintenance") {
set $rocket_bypass 0;
set $rocket_is_bypassed "BYPASS";
set $rocket_reason "Maintenance mode";
}
# Do not bypass if one of those cookie if found
# wordpress_logged_in_[hash] : When a user is logged in, this cookie is created (we'd rather let WP-Rocket handle that)
# wp-postpass_[hash] : When a protected post requires a password, this cookie is created.
if ($http_cookie ~* "(#!# COOKIE_INVALIDATE #!#)") {
set $rocket_bypass 0;
set $rocket_is_bypassed "BYPASS";
set $rocket_reason "Cookie";
}
# if (-f "$rocket_mobile_detection") {
# set $rocket_bypass 0;
# set $rocket_is_bypassed "BYPASS";
# set $rocket_reason "Specific mobile cache activated";
# }
# If the bypass token is still on, let's bypass WordPress with the cached URL
if ($rocket_bypass = 1) {
set $rocket_is_bypassed "HIT";
set $rocket_reason "$rocket_url";
}
# Checks to set HIT-MOB for mobile clients
set $rocket_device_type "";
if ($rocket_is_bypassed = HIT) {
set $rocket_device_type "$http_cf_device_type";
}
if ($rocket_device_type = mobile) {
set $rocket_is_bypassed "HIT-MOB";
}
# Clear variables if debug is not needed
if ($rocket_debug = 0) {
set $rocket_reason "";
set $rocket_file "";
}
# If the bypass token is still on, rewrite according to the file linked to the request
if ($rocket_bypass = 1) {
rewrite .* "$rocket_url" last;
}
# Add header to HTML cached files
location ~ /#!# WP_CONTENT_URI #!#/cache/wp-rocket/.*html$ {
etag on;
add_header Vary "Accept-Encoding, Cookie";
add_header Cache-Control "#!# HTML_CACHE_CONTROL #!#";
add_header X-Rocket-Nginx-Serving-Static $rocket_is_bypassed;
add_header X-Rocket-Nginx-Reason $rocket_reason;
add_header X-Rocket-Nginx-File $rocket_file;
#!# INCLUDE_GLOBAL #!#
#!# INCLUDE_HTTP #!#
}
# Do not gzip cached files that are already gzipped
location ~ /#!# WP_CONTENT_URI #!#/cache/wp-rocket/.*_gzip$ {
etag on;
gzip off;
types {}
default_type text/html;
add_header Content-Encoding gzip;
add_header Vary "Accept-Encoding, Cookie";
add_header Cache-Control "#!# HTML_CACHE_CONTROL #!#";
add_header X-Rocket-Nginx-Serving-Static $rocket_is_bypassed;
add_header X-Rocket-Nginx-Reason $rocket_reason;
add_header X-Rocket-Nginx-File $rocket_file;
#!# INCLUDE_GLOBAL #!#
#!# INCLUDE_HTTP #!#
}
# Debug header (when file is not cached)
add_header X-Rocket-Nginx-Serving-Static $rocket_is_bypassed;
add_header X-Rocket-Nginx-Reason $rocket_reason;
add_header X-Rocket-Nginx-File $rocket_file;
#!# INCLUDE_GLOBAL #!#
###################################################################################################
# BROWSER CSS CACHE
#
location ~* \.css$ {
etag on;
gzip_vary on;
expires #!# CSS_EXPIRATION #!#;
#!# INCLUDE_GLOBAL #!#
#!# INCLUDE_CSS #!#
}
###################################################################################################
# BROWSER JS CACHE
#
location ~* \.js$ {
etag on;
gzip_vary on;
expires #!# JS_EXPIRATION #!#;
#!# INCLUDE_GLOBAL #!#
#!# INCLUDE_JS #!#
}
###################################################################################################
# BROWSER MEDIA CACHE
#
location ~* \.(#!# MEDIA_EXTENSIONS #!#)$ {
etag on;
expires #!# MEDIA_EXPIRATION #!#;
#!# INCLUDE_GLOBAL #!#
#!# INCLUDE_MEDIA #!#
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment