Created
June 25, 2024 16:34
-
-
Save sriharsha-y/4182b601c2daef407758d90cb3e68fe4 to your computer and use it in GitHub Desktop.
rocket-nginx mobile cache fix (for CloudFlare APO / Pro users)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
################################################################################################### | |
# 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