CINXE.COM
HOW TO: Handle query strings for Wordpress in nginx (like a crazy person would) - 403 Page Labs
<!DOCTYPE html> <html lang="en-US" > <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- WP_HEAD() START --> <!-- Manifest added by SuperPWA - Progressive Web Apps Plugin For WordPress --> <link rel="manifest" href="/superpwa-manifest.json"> <meta name="theme-color" content="#ee076e"> <!-- / SuperPWA.com --> <meta name='robots' content='index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1' /> <!-- This site is optimized with the Yoast SEO Premium plugin v17.1 (Yoast SEO v23.3) - https://yoast.com/wordpress/plugins/seo/ --> <title>HOW TO: Handle query strings for Wordpress in nginx (like a crazy person would) - 403 Page Labs</title> <link rel="canonical" href="https://403.ie/how-to-handle-query-strings-for-wordpress-in-nginx-like-a-crazy-person-would/" /> <meta property="og:locale" content="en_US" /> <meta property="og:type" content="article" /> <meta property="og:title" content="HOW TO: Handle query strings for Wordpress in nginx (like a crazy person would)" /> <meta property="og:description" content="You need a wacky method for nginx to uniquely handle incoming requests that contain a specific query string using error page handling." /> <meta property="og:url" content="https://403.ie/how-to-handle-query-strings-for-wordpress-in-nginx-like-a-crazy-person-would/" /> <meta property="og:site_name" content="403 Page Labs" /> <meta property="article:published_time" content="2020-04-05T10:07:24+00:00" /> <meta property="article:modified_time" content="2021-10-26T18:31:56+00:00" /> <meta property="og:image" content="https://403.ie/wp-content/uploads/2020/04/Screenshot-2020-04-05-at-10.33.02.png" /> <meta name="author" content="403" /> <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:label1" content="Written by" /> <meta name="twitter:data1" content="403" /> <meta name="twitter:label2" content="Est. reading time" /> <meta name="twitter:data2" content="2 minutes" /> <script type="application/ld+json" class="yoast-schema-graph">{"@context":"https://schema.org","@graph":[{"@type":"Article","@id":"https://403.ie/how-to-handle-query-strings-for-wordpress-in-nginx-like-a-crazy-person-would/#article","isPartOf":{"@id":"https://403.ie/how-to-handle-query-strings-for-wordpress-in-nginx-like-a-crazy-person-would/"},"author":{"name":"403","@id":"https://403.ie/#/schema/person/21d48d387f1152ee950f6aead3040eaf"},"headline":"HOW TO: Handle query strings for WordPress in nginx (like a crazy person would)","datePublished":"2020-04-05T10:07:24+00:00","dateModified":"2021-10-26T18:31:56+00:00","mainEntityOfPage":{"@id":"https://403.ie/how-to-handle-query-strings-for-wordpress-in-nginx-like-a-crazy-person-would/"},"wordCount":439,"commentCount":0,"publisher":{"@id":"https://403.ie/#organization"},"image":{"@id":"https://403.ie/how-to-handle-query-strings-for-wordpress-in-nginx-like-a-crazy-person-would/#primaryimage"},"thumbnailUrl":"https://403.ie/wp-content/uploads/2020/04/Screenshot-2020-04-05-at-10.33.02.png","keywords":["action=postpass","nginx","password protected","whitelist","Wordpress Core"],"articleSection":["Errors","How To...","Security"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https://403.ie/how-to-handle-query-strings-for-wordpress-in-nginx-like-a-crazy-person-would/#respond"]}]},{"@type":"WebPage","@id":"https://403.ie/how-to-handle-query-strings-for-wordpress-in-nginx-like-a-crazy-person-would/","url":"https://403.ie/how-to-handle-query-strings-for-wordpress-in-nginx-like-a-crazy-person-would/","name":"HOW TO: Handle query strings for Wordpress in nginx (like a crazy person would) - 403 Page Labs","isPartOf":{"@id":"https://403.ie/#website"},"primaryImageOfPage":{"@id":"https://403.ie/how-to-handle-query-strings-for-wordpress-in-nginx-like-a-crazy-person-would/#primaryimage"},"image":{"@id":"https://403.ie/how-to-handle-query-strings-for-wordpress-in-nginx-like-a-crazy-person-would/#primaryimage"},"thumbnailUrl":"https://403.ie/wp-content/uploads/2020/04/Screenshot-2020-04-05-at-10.33.02.png","datePublished":"2020-04-05T10:07:24+00:00","dateModified":"2021-10-26T18:31:56+00:00","breadcrumb":{"@id":"https://403.ie/how-to-handle-query-strings-for-wordpress-in-nginx-like-a-crazy-person-would/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https://403.ie/how-to-handle-query-strings-for-wordpress-in-nginx-like-a-crazy-person-would/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https://403.ie/how-to-handle-query-strings-for-wordpress-in-nginx-like-a-crazy-person-would/#primaryimage","url":"https://403.ie/wp-content/uploads/2020/04/Screenshot-2020-04-05-at-10.33.02.png","contentUrl":"https://403.ie/wp-content/uploads/2020/04/Screenshot-2020-04-05-at-10.33.02.png"},{"@type":"BreadcrumbList","@id":"https://403.ie/how-to-handle-query-strings-for-wordpress-in-nginx-like-a-crazy-person-would/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://403.ie/"},{"@type":"ListItem","position":2,"name":"Articles","item":"https://403.ie/articles/"},{"@type":"ListItem","position":3,"name":"HOW TO: Handle query strings for WordPress in nginx (like a crazy person would)"}]},{"@type":"WebSite","@id":"https://403.ie/#website","url":"https://403.ie/","name":"403 Page Labs","description":"Next-gen WordPress based in Ireland","publisher":{"@id":"https://403.ie/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://403.ie/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":["Organization","Place","ProfessionalService"],"@id":"https://403.ie/#organization","name":"403 Page Labs","url":"https://403.ie/","logo":{"@id":"https://403.ie/how-to-handle-query-strings-for-wordpress-in-nginx-like-a-crazy-person-would/#local-main-organization-logo"},"image":{"@id":"https://403.ie/how-to-handle-query-strings-for-wordpress-in-nginx-like-a-crazy-person-would/#local-main-organization-logo"},"openingHoursSpecification":[{"@type":"OpeningHoursSpecification","dayOfWeek":["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"opens":"00:00","closes":"23:59"},{"@type":"OpeningHoursSpecification","dayOfWeek":["Sunday"],"opens":"09:00","closes":"17:00"}],"email":"labs@403page.com","areaServed":"Ireland"},{"@type":"Person","@id":"https://403.ie/#/schema/person/21d48d387f1152ee950f6aead3040eaf","name":"403","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https://403.ie/#/schema/person/image/","url":"https://secure.gravatar.com/avatar/e3308f3d8de71d3befe19242a554a46b?s=96&d=mm&r=g","contentUrl":"https://secure.gravatar.com/avatar/e3308f3d8de71d3befe19242a554a46b?s=96&d=mm&r=g","caption":"403"},"sameAs":["https://403.ie"]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https://403.ie/how-to-handle-query-strings-for-wordpress-in-nginx-like-a-crazy-person-would/#local-main-organization-logo","url":"https://403.ie/wp-content/uploads/2021/10/New-Project-1-svg.svg","contentUrl":"https://403.ie/wp-content/uploads/2021/10/New-Project-1-svg.svg","width":675,"height":449,"caption":"403 Page Labs"}]}</script> <meta name="geo.placename" content="Limerick" /> <meta name="geo.region" content="Republic of Ireland" /> <!-- / Yoast SEO Premium plugin. --> <link rel="alternate" type="application/rss+xml" title="403 Page Labs » HOW TO: Handle query strings for WordPress in nginx (like a crazy person would) Comments Feed" href="https://403.ie/how-to-handle-query-strings-for-wordpress-in-nginx-like-a-crazy-person-would/feed/" /> <link id="ma-customfonts" href="//403.ie/wp-content/uploads/fonts/ma_customfonts.css?ver=91db782c" rel="stylesheet" type="text/css" /><link rel='stylesheet' id='wp-block-library-css' href='https://403.ie/wp-includes/css/dist/block-library/style.min.css?ver=6.6.2' type='text/css' media='all' /> <style id='classic-theme-styles-inline-css' type='text/css'> /*! This file is auto-generated */ .wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none} </style> <style id='global-styles-inline-css' type='text/css'> :root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;} :where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;} :where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;} :root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;} </style> <link rel='stylesheet' id='oxygen-css' href='https://403.ie/wp-content/mu-plugins/oxygen/component-framework/oxygen.css?ver=4.0.3' type='text/css' media='all' /> <link rel='stylesheet' id='mkaz-code-syntax-prism-css-css' href='https://403.ie/wp-content/plugins/code-syntax-block/assets/prism-a11y-dark.css?ver=1724272885' type='text/css' media='all' /> <script type="text/javascript" src="https://403.ie/wp-includes/js/jquery/jquery.min.js?ver=3.7.1" id="jquery-core-js"></script> <link rel="https://api.w.org/" href="https://403.ie/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://403.ie/wp-json/wp/v2/posts/4467" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://403.ie/xmlrpc.php?rsd" /> <meta name="generator" content="WordPress 6.6.2" /> <link rel='shortlink' href='https://403.ie/?p=4467' /> <link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://403.ie/wp-json/oembed/1.0/embed?url=https%3A%2F%2F403.ie%2Fhow-to-handle-query-strings-for-wordpress-in-nginx-like-a-crazy-person-would%2F" /> <link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://403.ie/wp-json/oembed/1.0/embed?url=https%3A%2F%2F403.ie%2Fhow-to-handle-query-strings-for-wordpress-in-nginx-like-a-crazy-person-would%2F&format=xml" /> <!-- Stream WordPress user activity plugin v4.0.1 --> <link rel='stylesheet' id='oxygen-cache-20-css' href='//403.ie/wp-content/uploads/oxygen/css/20.css?cache=1654791436&ver=6.6.2' type='text/css' media='all' /> <link rel='stylesheet' id='oxygen-cache-17-css' href='//403.ie/wp-content/uploads/oxygen/css/17.css?cache=1653416048&ver=6.6.2' type='text/css' media='all' /> <link rel='stylesheet' id='oxygen-universal-styles-css' href='//403.ie/wp-content/uploads/oxygen/css/universal.css?cache=1704911731&ver=6.6.2' type='text/css' media='all' /> <!-- END OF WP_HEAD() --> </head> <body class="post-template-default single single-post postid-4467 single-format-standard wp-embed-responsive oxygen-body" > <div id="div_block-47-42" class="ct-div-block" ><div id="div_block-52-42" class="ct-div-block" ><header id="_header-104-20" class="oxy-header-wrapper oxy-header" ><div id="_header_row-105-20" class="oxy-header-row" ><div class="oxy-header-container"><div id="_header_left-106-20" class="oxy-header-left" ><a id="link-107-20" class="ct-link finance-logo" href="/" target="_self" ><img id="image-36-42" alt="403 Labs" src="https://403.ie/wp-content/uploads/2021/10/New-Project-1-svg.svg" class="ct-image"/></a></div><div id="_header_center-109-20" class="oxy-header-center" ><nav id="_nav_menu-41-42" class="oxy-nav-menu" ><div class='oxy-menu-toggle'><div class='oxy-nav-menu-hamburger-wrap'><div class='oxy-nav-menu-hamburger'><div class='oxy-nav-menu-hamburger-line'></div><div class='oxy-nav-menu-hamburger-line'></div><div class='oxy-nav-menu-hamburger-line'></div></div></div></div><div class="menu-navigation-container"><ul id="menu-navigation" class="oxy-nav-menu-list"><li id="menu-item-4947" class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-item-4947"><a href="https://403.ie/category/how-to/">How To...</a></li> <li id="menu-item-4948" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-4948"><a href="https://403.ie/category/performance/">Performance</a></li> <li id="menu-item-4949" class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-item-4949"><a href="https://403.ie/category/security/">Security</a></li> <li id="menu-item-4950" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-4950"><a href="https://403.ie/category/seo/">SEO</a></li> <li id="menu-item-4951" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-4951"><a href="https://403.ie/category/cloudflare-workers/">Workers</a></li> </ul></div></nav></div><div id="_header_right-110-20" class="oxy-header-right" ><div id="div_block-112-20" class="ct-div-block" ><div id="code_block-113-20" class="ct-code-block" ></div><div id="fancy_icon-115-20" class="ct-fancy-icon" onClick="focusSearch()"><svg id="svg-fancy_icon-115-20"><use xlink:href="#FontAwesomeicon-search"></use></svg></div></div> <div tabindex="-1" class="oxy-modal-backdrop top " style="background-color: rgba(0,0,0,0.3);" data-trigger="user_clicks_element" data-trigger-selector="#fancy_icon-115-20" data-trigger-time="5" data-trigger-time-unit="seconds" data-close-automatically="no" data-close-after-time="10" data-close-after-time-unit="seconds" data-trigger_scroll_amount="50" data-trigger_scroll_direction="down" data-scroll_to_selector="" data-time_inactive="60" data-time-inactive-unit="seconds" data-number_of_clicks="3" data-close_on_esc="on" data-number_of_page_views="3" data-close-after-form-submit="no" data-open-again="always_show" data-open-again-after-days="3" > <div id="modal-116-20" class="ct-modal" data-aos="fade-down" data-aos-duration="200"><div id="div_block-117-20" class="ct-div-block" > <div id="_search_form-118-20" class="oxy-search-form" > <form role="search" method="get" id="searchform" class="searchform" action="https://403.ie/"> <div> <label class="screen-reader-text" for="s">Search for:</label> <input type="text" value="" name="s" id="s" /> <input type="submit" id="searchsubmit" value="Search" /> </div> </form> </div> <div id="code_block-120-20" class="ct-code-block" ></div><div id="fancy_icon-121-20" class="ct-fancy-icon oxy-close-modal" ><svg id="svg-fancy_icon-121-20"><use xlink:href="#FontAwesomeicon-close"></use></svg></div></div></div> </div> </div></div></div></header> <section id="section-9-67" class=" ct-section" style="background-image: linear-gradient(135deg, rgba(228,34,79,0.9), rgba(255,100,0,0.9)), url();background-size:auto, cover;" ><div class="ct-section-inner-wrap"><h1 id="headline-10-67" class="ct-headline conference-heading-one"><span id="span-11-67" class="ct-span" >HOW TO: Handle query strings for WordPress in nginx (like a crazy person would)</span></h1><div id="text_block-12-67" class="ct-text-block conference-subheading" ><span id="span-13-67" class="ct-span" >April 5, 2020</span></div></div></section><section id="section-3-67" class=" ct-section" ><div class="ct-section-inner-wrap"><div id="text_block-5-67" class="ct-text-block" ><span id="span-7-67" class="ct-span oxy-stock-content-styles conference-other-single" > <blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>You need a method for nginx to uniquely handle incoming requests that contain a specific query string. For the purposes of this guide, we'll be looking at proper handling of WordPress core's post/page password protection feature.</p></blockquote> <p>It's common practice for WordPress site admins to use nginx to <code>deny all</code> IPs except for a specific list, which they specify like <code>allow 123.123.123.123</code> on any requests to <code>wp-admin</code> or <code>wp-login.php</code></p> <p>The rule might look something like this:</p> <pre class="wp-block-code"><code lang="nginx" class="language-nginx"> location ~ ^/(wp-admin|wp-login\.php) { allow 123.123.123.123; allow 456.456.456.456; allow 789.789.789.789; deny all; }</code></pre> <p>This way, only pre-approved users (administrators, editors, etc.) can access the login page. </p> <p>But an interesting problem arises if your WordPress site has public facing posts or pages that are set to Password Protected:</p> <figure class="wp-block-image size-large"><img decoding="async" src="https://403.ie/wp-content/uploads/2020/04/Screenshot-2020-04-05-at-10.33.02.png" alt="" class="wp-image-4472"/></figure> <p>These might be posts that are directed to a different userbase than admins/editors (ie. a customer mailing list, or staff associated with the website's company who are not involved in maintaining it).</p> <p>Once a page is set to use WordPress core's password protected feature, frontend users need to enter the correct password which is validated through <code>wp-login.php</code>. Here's what the password submission request looks like:</p> <pre class="wp-block-code"><code lang="bash" class="language-bash">https://YOUR_DOMAIN.com/wp-login.php?action=postpass</code></pre> <p>Naturally, as long as the user does not have their IP whitelisted in nginx - they will be blocked by nginx before WordPress can validate the password. </p> <p>Somewhat less obviously, the site admins/editors won't know about this problem, even if they test themselves because they are whitelisted already.</p> <h4 class="wp-block-heading">A solution</h4> <p>One way to handle this is to exempt requests that contain the query string <code>postpass</code>, from the location block that performs the whitelisting check. This way, only WordPress will be responsible for validation of password protected page, not nginx .</p> <p>While we can't make nginx match a query string in a location block. Something like <code>location ~ ^?action=postpass {allow all}</code> will NOT work. Location blocks match for URIs, not query strings.</p> <p>But we can get a little creative and use nginx's error page handler:</p> <pre class="wp-block-code"><code lang="nginx" class="language-nginx">error_page 418 = @passwordprotected; if ( $query_string ~ "postpass" ) { return 418; } location @passwordprotected { allow all; }</code></pre> <p>The first line instantiates a new <em>"error"</em> page that responds with a 418 status code. You can pick any number but don't use an existing http status code like 200, 301, 402, 503, etc. You can find a full list of http status codes at <a href="https://en.wikipedia.org/wiki/List_of_HTTP_status_codes">https://en.wikipedia.org/wiki/List_of_HTTP_status_codes</a>.</p> <p>The second line instructs nginx to send that 418 response to a request if the query string <code>postpass</code> is present.</p> <p>The third line opens a location block that specifies what the "error" response does. In this case, the "error" simply allows all IPs access, overriding the existing whitelist.</p> <blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>Fun fact:</strong> 418 is technically a recognised status code "I'm a teapot". It was part of an <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/418">April fool's joke in 1998</a>. </p></blockquote> </span></div><div id="code_block-4-67" class="ct-code-block" ><!-- --></div></div></section><section id="section-14-67" class=" ct-section" ><div class="ct-section-inner-wrap"></div></section></div><section id="section-13-42" class=" ct-section" ><div class="ct-section-inner-wrap"><a id="link-42-42" class="ct-link conference-logo" href="https://403.ie" target="_self" ><img id="image-43-42" alt="403 Labs" src="https://403.ie/wp-content/uploads/2021/10/New-Project-1-svg.svg" class="ct-image"/></a></div></section></div> <!-- WP_FOOTER --> <!-- Global site tag (gtag.js) - Google Analytics --> <script async src="https://www.googletagmanager.com/gtag/js?id=G-W2V0BSPHH2"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-W2V0BSPHH2'); </script> <style>.ct-FontAwesomeicon-search{width:0.92857142857143em}</style> <style>.ct-FontAwesomeicon-close{width:0.78571428571429em}</style> <?xml version="1.0"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" style="position: absolute; width: 0; height: 0; overflow: hidden;" version="1.1"><defs><symbol id="FontAwesomeicon-search" viewBox="0 0 26 28"><title>search</title><path d="M18 13c0-3.859-3.141-7-7-7s-7 3.141-7 7 3.141 7 7 7 7-3.141 7-7zM26 26c0 1.094-0.906 2-2 2-0.531 0-1.047-0.219-1.406-0.594l-5.359-5.344c-1.828 1.266-4.016 1.937-6.234 1.937-6.078 0-11-4.922-11-11s4.922-11 11-11 11 4.922 11 11c0 2.219-0.672 4.406-1.937 6.234l5.359 5.359c0.359 0.359 0.578 0.875 0.578 1.406z"/></symbol><symbol id="FontAwesomeicon-close" viewBox="0 0 22 28"><title>close</title><path d="M20.281 20.656c0 0.391-0.156 0.781-0.438 1.062l-2.125 2.125c-0.281 0.281-0.672 0.438-1.062 0.438s-0.781-0.156-1.062-0.438l-4.594-4.594-4.594 4.594c-0.281 0.281-0.672 0.438-1.062 0.438s-0.781-0.156-1.062-0.438l-2.125-2.125c-0.281-0.281-0.438-0.672-0.438-1.062s0.156-0.781 0.438-1.062l4.594-4.594-4.594-4.594c-0.281-0.281-0.438-0.672-0.438-1.062s0.156-0.781 0.438-1.062l2.125-2.125c0.281-0.281 0.672-0.438 1.062-0.438s0.781 0.156 1.062 0.438l4.594 4.594 4.594-4.594c0.281-0.281 0.672-0.438 1.062-0.438s0.781 0.156 1.062 0.438l2.125 2.125c0.281 0.281 0.438 0.672 0.438 1.062s-0.156 0.781-0.438 1.062l-4.594 4.594 4.594 4.594c0.281 0.281 0.438 0.672 0.438 1.062z"/></symbol></defs></svg><script type="text/javascript" id="ct_custom_js_100116">/*jQuery Watch Plugin @author Darcy Clarke @version 2.0 Copyright (c) 2012 Darcy Clarke Dual licensed under the MIT and GPL licenses.*/ (function(e){e.fn.watch=function(t,n,r){var i=document.createElement("div");var s=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;var o=window.CustomEvent||function(){return arguments||{}};var u=function(e,t){e="on"+e;var n=e in t;if(!n){t.setAttribute(e,"return;");n=typeof t[e]=="function"}return n};if(typeof n=="function"){r=n;n={}}if(typeof r!="function")r=function(){};n=e.extend({},{throttle:10},n);var a=function(t){var n=this;e.each(this.watching,function(){var e=this;var r=false;var i;for(var s=0;s<e.props.length;s++){i=t[0].attributes[e.props[s]]||t.css(e.props[s]);if(e.vals[s]!=i){e.vals[s]=i;r=true;break}}if(r&&e.callback)e.callback.call(n,new o("AttrChange"))})};return this.each(function(){var o=this;var f=e(this);var l={props:t.split(" "),vals:[],changed:[],callback:r};e.each(l.props,function(e){l.vals[e]=f[0].attributes[l.props[e]]||f.css(l.props[e]);l.changed[e]=false});if(!this.watching)this.watching=[];this.watching.push(l);if(s){var c=new s(function(e){e.forEach(function(e){r.call(o,e)})});c.observe(this,{subtree:false,attributes:true})}else if(u("DOMAttrModified",i)){f.on("DOMAttrModified",r)}else if(u("propertychange",i)){f.on("propertychange",r)}else{setInterval(function(){a.call(o,f)},n.throttle)}})}})(jQuery); jQuery(document).ready(function($) { $('.oxygen-builder-body .oxy-modal-backdrop').css('height','auto'); if($('html').attr('ng-app') == 'CTFrontendBuilder') return; function scrollbarWidth(){var block = $('<div>').css({'height':'50px','width':'50px'}),indicator = $('<div>').css({'height':'200px'});$('body').append(block.append(indicator));var w1 = $('div',block).innerWidth();block.css('overflow-y','scroll');var w2 = $('div', block).innerWidth();$(block).remove();return (w1 - w2);} var bg = $('#modal-116-20').parent('.oxy-modal-backdrop'), backsize = $(bg).height(); function fixflex () { var backpos = $(bg).css('align-items'), screenh = $(window).height(), barh = $('#wpadminbar').height(); $(bg).css({'height':'calc(100% - '+barh+'px)','top':+barh+'px'}); if(backsize > screenh) { if($(bg).hasClass('right')) { $(bg).css('align-items','flex-end'); $(bg).css('justify-content','flex-start'); } else if($(bg).hasClass('left')) { $(bg).css('justify-content','flex-start'); } else { $(bg).css('align-items','flex-start'); } } else { if($(bg).hasClass('right')) { $(bg).css('justify-content','center'); } else if($(bg).hasClass('left')) { $(bg).css('justify-content','center'); } else { $(bg).css('align-items',backpos); } } } $(window).resize(function(event) { fixflex(); }); fixflex(); if(typeof $().watch == 'function') { $(bg).watch('display', function() { if($(this).css('display')=='flex') { $('body').css({'overflow-y':'hidden', 'height':'100%', 'position':'relative', 'margin-right':scrollbarWidth()+'px'}); $(this).css('overflow-y','auto'); $('.oxy-sticky-header-active').css('padding-right',scrollbarWidth()+'px'); if($('#modal-116-20[data-aos*="left"]')) { $(bg).css('overflow-x','hidden'); } } else if($(this).css('display')=='none') { $('.oxy-modal-backdrop').removeClass("live"); setTimeout(function() { $('body').css({'overflow-y':'auto','margin-right':'0'}); $('.oxy-sticky-header-active').css('padding-right','0'); }, 300); } }); } });</script> <script type="text/javascript"> jQuery(document).ready(function() { jQuery('body').on('click', '.oxy-menu-toggle', function() { jQuery(this).parent('.oxy-nav-menu').toggleClass('oxy-nav-menu-open'); jQuery('body').toggleClass('oxy-nav-menu-prevent-overflow'); jQuery('html').toggleClass('oxy-nav-menu-prevent-overflow'); }); var selector = '.oxy-nav-menu-open .menu-item a[href*="#"]'; jQuery('body').on('click', selector, function(){ jQuery('.oxy-nav-menu-open').removeClass('oxy-nav-menu-open'); jQuery('body').removeClass('oxy-nav-menu-prevent-overflow'); jQuery('html').removeClass('oxy-nav-menu-prevent-overflow'); jQuery(this).click(); }); }); </script> <script type="text/javascript"> // Initialize Oxygen Modals jQuery(document).ready(function() { function showModal( modal ) { var $modal = jQuery( modal ); $modal.addClass("live"); var modalId = $modal[0].querySelector('.ct-modal').id; var focusable = modal.querySelector('a[href]:not([disabled]), button:not([disabled]), textarea:not([disabled]), input[type="text"]:not([disabled]), input[type="radio"]:not([disabled]), input[type="checkbox"]:not([disabled]), select:not([disabled])'); if(focusable) { setTimeout(() => { focusable.focus(); }, 500); } else { setTimeout(() => { $modal.focus(); }, 500) } // Check if this modal can be shown according to settings and last shown time // Current and last time in milliseconds var currentTime = new Date().getTime(); var lastShownTime = localStorage && localStorage['oxy-' + modalId + '-last-shown-time'] ? JSON.parse( localStorage['oxy-' + modalId + '-last-shown-time'] ) : false; // manual triggers aren't affected by last shown time if( $modal.data( 'trigger' ) != 'user_clicks_element' ) { switch( $modal.data( 'open-again' ) ) { case 'never_show_again': // if it was shown at least once, don't show it again if( lastShownTime !== false ) return; break; case 'show_again_after': var settingDays = parseInt( $modal.data( 'open-again-after-days' ) ); var actualDays = ( currentTime - lastShownTime ) / ( 60*60*24*1000 ); if( actualDays < settingDays ) return; break; default: //always show break; } } // Body manipulation to prevent scrolling while modal is active, and maintain scroll position. document.querySelector('body').style.top = `-${window.scrollY}px`; document.querySelector('body').classList.add('oxy-modal-active'); // save current time as last shown time if( localStorage ) localStorage['oxy-' + modalId + '-last-shown-time'] = JSON.stringify( currentTime ); // trick to make jQuery fadeIn with flex $modal.css("display", "flex"); $modal.hide(); // trick to force AOS trigger on elements inside the modal $modal.find(".aos-animate").removeClass("aos-animate").addClass("aos-animate-disabled"); // show the modal $modal.fadeIn(250, function(){ // trick to force AOS trigger on elements inside the modal $modal.find(".aos-animate-disabled").removeClass("aos-animate-disabled").addClass("aos-animate"); }); if( $modal.data( 'close-automatically' ) == 'yes' ) { var time = parseInt( $modal.data( 'close-after-time' ) ); if( $modal.data( 'close-after-time-unit' ) == 'seconds' ) { time = parseInt( parseFloat( $modal.data( 'close-after-time' ) ) * 1000 ); } setTimeout( function(){ hideModal(modal); }, time ); } // close modal automatically after form submit (Non-AJAX) if( $modal.data( 'close-after-form-submit' ) == 'yes' && $modal.data("trigger") == "after_specified_time" ) { // WPForms // WPForms replaces the form with a confirmation message on page refresh if( $modal.find(".wpforms-confirmation-container-full").length > 0 ) { setTimeout(function () { hideModal(modal); }, 3000); } // Formidable Forms // Formidable Forms replaces the form with a confirmation message on page refresh if( $modal.find(".frm_message").length > 0 ) { setTimeout(function () { hideModal(modal); }, 3000); } // Caldera Forms // Caldera Forms replaces the form with a confirmation message on page refresh if( $modal.find(".caldera-grid .alert-success").length > 0 ) { setTimeout(function () { hideModal(modal); }, 3000); } } } window.oxyShowModal = showModal; var hideModal = function ( modal ) { // Body manipulation for scroll prevention and maintaining scroll position var scrollY = document.querySelector('body').style.top; document.querySelector('body').classList.remove('oxy-modal-active'); document.querySelector('body').style.top = ''; window.scrollTo(0, parseInt(scrollY || '0') * -1); // The function may be called by third party code, without argument, so we must close the first visible modal if( typeof modal === 'undefined' ) { var openModals = jQuery(".oxy-modal-backdrop.live"); if( openModals.length == 0 ) return; modal = openModals[0]; } var $modal = jQuery( modal ); // refresh any iframe so media embedded this way is stopped $modal.find( 'iframe').each(function(index){ this.src = this.src; }); // HTML5 videos can be stopped easily $modal.find( 'video' ).each(function(index){ this.pause(); }); // If there are any forms in the modal, reset them $modal.find("form").each(function(index){ this.reset(); }); $modal.find(".aos-animate").removeClass("aos-animate").addClass("aos-animate-disabled"); $modal.fadeOut(400, function(){ $modal.removeClass("live"); $modal.find(".aos-animate-disabled").removeClass("aos-animate-disabled").addClass("aos-animate"); }); }; window.oxyCloseModal = hideModal; jQuery( ".oxy-modal-backdrop" ).each(function( index ) { var modal = this; (function( modal ){ var $modal = jQuery( modal ); var exitIntentFunction = function( e ){ if( e.clientY <= 0 ) { showModal( modal ); document.removeEventListener( "mouseleave", exitIntentFunction ); document.removeEventListener( "mouseout", exitIntentFunction ); } } switch ( jQuery( modal ).data("trigger") ) { case "on_exit_intent": document.addEventListener( "mouseleave", exitIntentFunction, false); document.addEventListener( "mouseout", exitIntentFunction, false); break; case "user_clicks_element": jQuery( jQuery( modal ).data( 'trigger-selector' ) ).click( function( event ) { showModal( modal ); event.preventDefault(); } ); break; case "after_specified_time": var time = parseInt( jQuery( modal ).data( 'trigger-time' ) ); if( jQuery( modal ).data( 'trigger-time-unit' ) == 'seconds' ) { time = parseInt( parseFloat( jQuery( modal ).data( 'trigger-time' ) ) * 1000 ); } setTimeout( function(){ showModal( modal ); }, time ); break; case "after_scrolled_amount": window.addEventListener("scroll", function scrollDetection(){ var winheight= window.innerHeight || (document.documentElement || document.body).clientHeight; var docheight = jQuery(document).height(); var scrollTop = window.pageYOffset || (document.documentElement || document.body.parentNode || document.body).scrollTop; var isScrollUp = false; var oxyPreviousScrollTop = parseInt( jQuery( modal ).data( 'previous_scroll_top' ) ); if( !isNaN( oxyPreviousScrollTop ) ) { if( oxyPreviousScrollTop > scrollTop) isScrollUp = true; } jQuery( modal ).data( 'previous_scroll_top', scrollTop ); var trackLength = docheight - winheight; var pctScrolled = Math.floor(scrollTop/trackLength * 100); if( isNaN( pctScrolled ) ) pctScrolled = 0; if( ( isScrollUp && jQuery( modal ).data( 'trigger_scroll_direction' ) == 'up' ) || ( !isScrollUp && jQuery( modal ).data( 'trigger_scroll_direction' ) == 'down' && pctScrolled >= parseInt( jQuery( modal ).data( 'trigger_scroll_amount' ) ) ) ) { showModal( modal ); window.removeEventListener( "scroll", scrollDetection ); } }, false); break; case "on_scroll_to_element": window.addEventListener("scroll", function scrollDetection(){ var $element = jQuery( jQuery( modal ).data( 'scroll_to_selector' ) ); if( $element.length == 0 ) { window.removeEventListener( "scroll", scrollDetection ); return; } var top_of_element = $element.offset().top; var bottom_of_element = $element.offset().top + $element.outerHeight(); var bottom_of_screen = jQuery(window).scrollTop() + jQuery(window).innerHeight(); var top_of_screen = jQuery(window).scrollTop(); if ((bottom_of_screen > bottom_of_element - $element.outerHeight() /2 ) && (top_of_screen < top_of_element + $element.outerHeight() /2 )){ showModal( modal ); window.removeEventListener( "scroll", scrollDetection ); } }, false); break; case "after_number_of_clicks": document.addEventListener("click", function clickDetection(){ var number_of_clicks = parseInt( jQuery( modal ).data( 'number_of_clicks' ) ); var clicks_performed = isNaN( parseInt( jQuery( modal ).data( 'clicks_performed' ) ) ) ? 1 : parseInt( jQuery( modal ).data( 'clicks_performed' ) ) + 1; jQuery( modal ).data( 'clicks_performed', clicks_performed ); if ( clicks_performed == number_of_clicks ){ showModal( modal ); document.removeEventListener( "click", clickDetection ); } }, false); break; case "after_time_inactive": var time = parseInt( jQuery( modal ).data( 'time_inactive' ) ); if( jQuery( modal ).data( 'time-inactive-unit' ) == 'seconds' ) { time = parseInt( parseFloat( jQuery( modal ).data( 'time_inactive' ) ) * 1000 ); } var activityDetected = function(){ jQuery( modal ).data( 'millis_idle', 0 ); }; document.addEventListener( "click", activityDetected); document.addEventListener( "mousemove", activityDetected); document.addEventListener( "keypress", activityDetected); document.addEventListener( "scroll", activityDetected); var idleInterval = setInterval(function(){ var millis_idle = isNaN( parseInt( jQuery( modal ).data( 'millis_idle' ) ) ) ? 100 : parseInt( jQuery( modal ).data( 'millis_idle' ) ) + 100; jQuery( modal ).data( 'millis_idle', millis_idle ); if( millis_idle > time ){ clearInterval( idleInterval ); document.removeEventListener( "click", activityDetected ); document.removeEventListener( "mousemove", activityDetected ); document.removeEventListener( "keypress", activityDetected ); document.removeEventListener( "scroll", activityDetected ); showModal( modal ); } }, 100); break; case "after_number_of_page_views": var modalId = modal.querySelector('.ct-modal').id; var pageViews = localStorage && localStorage['oxy-' + modalId + '-page-views'] ? parseInt( localStorage['oxy-' + modalId + '-page-views'] ) : 0; pageViews++; if( localStorage ) localStorage['oxy-' + modalId + '-page-views'] = pageViews; if( parseInt( jQuery( modal ).data( 'number_of_page_views' ) ) == pageViews ) { if( localStorage ) localStorage['oxy-' + modalId + '-page-views'] = 0; showModal( modal ); } break; } // add event handler to close modal automatically after AJAX form submit if( $modal.data( 'close-after-form-submit' ) == 'yes' ) { // Contact Form 7 if (typeof wpcf7 !== 'undefined') { $modal.find('div.wpcf7').each(function () { var $form = jQuery(this).find('form'); this.addEventListener('wpcf7submit', function (event) { if (event.detail.contactFormId == $form.attr("id")) { setTimeout(function () { hideModal(modal); }, 3000); } }, false); }); } // Caldera Forms document.addEventListener( "cf.submission", function(event){ // Pending, Caldera AJAX form submissions aren't working since Oxygen 2.2, see: https://github.com/soflyy/oxygen/issues/1638 }); // Ninja Forms jQuery(document).on("nfFormSubmitResponse", function(event, response){ // Only close the modal if the event was triggered from a Ninja Form inside the modal if( $modal.find("#nf-form-" + response.id + "-cont").length > 0 ) { setTimeout(function () { hideModal(modal); }, 3000); } }); } })( modal ); }); // handle clicks on modal backdrop and on .oxy-close-modal jQuery("body").on('click touchend', '.oxy-modal-backdrop, .oxy-close-modal', function( event ) { var $this = jQuery( this ); var $target = jQuery( event.target ); // Click event in the modal div and it's children is propagated to the backdrop if( !$target.hasClass( 'oxy-modal-backdrop' ) && !$this.hasClass( 'oxy-close-modal' ) ) { //event.stopPropagation(); return; } if( $target.hasClass( 'oxy-modal-backdrop' ) && $this.hasClass( 'oxy-not-closable' ) ) { return; } if( $this.hasClass( 'oxy-close-modal' ) ) event.preventDefault(); var $modal = $this.hasClass( 'oxy-close-modal' ) ? $this.closest('.oxy-modal-backdrop') : $this; hideModal( $modal[0] ); }); jQuery(document).keyup( function(e){ if( e.key == 'Escape' ){ jQuery(".oxy-modal-backdrop:visible").each(function(index){ if( jQuery(this).data("close_on_esc") == 'on' ) hideModal(this); }); } } ); }); </script> <link rel='stylesheet' id='oxygen-aos-css' href='https://403.ie/wp-content/mu-plugins/oxygen/component-framework/vendor/aos/aos.css?ver=6.6.2' type='text/css' media='all' /> <script type="text/javascript" id="mkaz-code-syntax-prism-js-js-extra"> /* <![CDATA[ */ var prism_settings = {"pluginUrl":"https:\/\/403.ie\/wp-content\/plugins\/code-syntax-block\/"}; /* ]]> */ </script> <script type="text/javascript" src="https://403.ie/wp-content/plugins/code-syntax-block/assets/prism/prism.js?ver=1724272885" id="mkaz-code-syntax-prism-js-js"></script> <script type="text/javascript" id="superpwa-register-sw-js-extra"> /* <![CDATA[ */ var superpwa_sw = {"url":"\/superpwa-sw.js?2.2.7","disable_addtohome":"1","enableOnDesktop":"","offline_message":"1","offline_message_txt":"You are currently offline."}; /* ]]> */ </script> <script type="text/javascript" src="https://403.ie/wp-content/plugins/super-progressive-web-apps/public/js/register-sw.js" id="superpwa-register-sw-js"></script> <script type="text/javascript" src="https://403.ie/wp-content/mu-plugins/oxygen/component-framework/vendor/aos/aos.js?ver=1" id="oxygen-aos-js"></script> <script type="text/javascript" id="ct-footer-js"> AOS.init({ }) jQuery('body').addClass('oxygen-aos-enabled'); </script><style type="text/css" id="ct_code_block_css_100113"> #fancy_icon-115-20 {cursor: pointer;}</style> <script type="text/javascript" id="ct_code_block_js_100120">focusSearch = function getFocus() { setTimeout( function() { document.getElementById('s').focus(); }, 800); } document.getElementById("s").placeholder = "What are you looking for?";</script> <style type="text/css" id="ct_code_block_css_100120">#s { width: 100%; font-family: Arial Black; font-size: 24px; color: rgba(238,7,110,0.8); } #searchsubmit {display:none;} input:focus, select:focus, textarea:focus, button:focus { outline: none; } #_search_form-118-20 input { border-bottom: 3px solid rgba(238,7,110,0.8); } ::placeholder { color: rgba(238,7,110,0.8); } .oxy-modal-backdrop.live { position: absolute !important; }</style> <style type="text/css" id="ct_code_block_css_4">.conference-other-single h1, .conference-other-single h2, .conference-other-single h3, .conference-other-single h4, .conference-other-single h5, .conference-other-single h6 { color: #5157c6; line-height: 1.3; font-weight: 700; margin-bottom: .4em; text-transform: uppercase; background: -webkit-linear-gradient(45deg, #5157c6, #ee076e); -webkit-background-clip: text; -webkit-text-fill-color: transparent; } .conference-other-single h1 { font-size: 56px; } .conference-other-single h2 { font-size: 48px; font-family: Arial Black, Gadget, sans-serif; } .conference-other-single h3 { font-size: 38px; padding-top: 30px; font-family: Arial Black, Gadget, sans-serif; } .conference-other-single h4 { font-size: 32px; padding-top: 30px; } .conference-other-single h5 { font-size: 24px; letter-spacing: 2px; text-transform: uppercase; line-height: 1.2; } .conference-other-single h6 { font-size: 24px; letter-spacing: 2px; } .conference-other-single blockquote { color: #000; padding: 4px 40px; margin-left: 12px; margin-right: 0; font-size: 20px; line-height: 1.6em; border-left: 4px solid #5157c6; } .conference-other-single img { max-width: 100%; height: auto; } .conference-other-single p { max-width: 100%; height: auto; font-size: 20px; color: #000; } .conference-other-single ol li { counter-increment: list; list-style-type: none; position: relative; line-height: 1.6; margin-bottom: 1em; } /* Output the numbers using the counter() function, but use a custom color, and position the numbers how we want */ .conference-other-single ol li:before { color: #E64034; content: counter(list) "."; left: -36px; font-weight: 700; position: absolute; text-align: right; width: 1.5em; } .conference-other-single ul li { counter-increment: list; list-style-type: none; position: relative; line-height: 1.6; margin-bottom: 1em; } /* Output the numbers using the counter() function, but use a custom color, and position the numbers how we want */ .conference-other-single ul li:before { color: #E64034; content:"•"; left: -44px; position: absolute; text-align: right; width: 1.5em; font-weight: 900; } .conference-other-single .wp-caption-text { color: rgba(0,0,0,0.3); font-style: italic; font-size: 16px; margin-top: 0; } .conference-other-single { color: #000; font-size: 18px; } .conference-other-single a { color: #FF4C1C; text-decoration: none; background: -webkit-linear-gradient(45deg, #5157c6, #ee076e); -webkit-background-clip: text; -webkit-text-fill-color: transparent; } .conference-other-single a:hover { background: -webkit-linear-gradient(45deg, #ee076e, #5157c6); -webkit-background-clip: text; -webkit-text-fill-color: transparent; } .conference-other-single .wp-caption.alignnone { width: 100% !important; } .conference-other-single img { max-width: 100%; height: auto; } pre { white-space: normal !important; color: black; } #span-7-67 { max-width: 80vw !important; } </style> <!-- /WP_FOOTER --> </body> </html> <!-- Performance optimized by Redis Object Cache. Learn more: https://wprediscache.com Retrieved 1534 objects (2 MB) from Redis using PhpRedis (v5.3.7). -->