Repository files navigation

⚠️Status: untested. This extension is provided as-is and has not been tested in production. Please feel free to fork, modify, improve, and open pull requests.

Licensed under GNU GPLv3 (see LICENSE).

IP Block for Apache httpd 2.4

Two install-ready approaches to consult the ip-block.com decision API and block matching IPs.

  • Tested against: Apache httpd 2.4 (current stable 2.4.x, 2026).
  • Approach A (recommended):mod_lua access hook — ip_block.lua.
  • Approach B (LuaSec-free):mod_rewrite + external RewriteMap program — checker_map.php.

Pick one. Both honour the same shared contract (POST /v1/check, api_key in the body, block only on action == "block", 1s timeout, fail-open, per-IP cache, whitelist).

Files

FileApproachPurpose
ip_block.luaAmod_lua access checker hook.
checker_map.phpBPersistent RewriteMap prg: decision program (PHP).
ip-block.confA+Bhttpd config for both (enable one).

Approach A — mod_lua (recommended)

  1. Ensure mod_lua is available (LoadModule lua_module modules/mod_lua.so).
  2. Install LuaSec (ssl.https) and LuaSocket (ltn12) for the Lua that mod_lua uses — e.g. luarocks install luasec luasocket. If they are missing the hook fails open and logs a warning; use Approach B instead.
  3. Copy ip_block.lua to e.g. /etc/httpd/ip-block/ip_block.lua.
  4. Add the SetEnv IPB_* lines and the LuaHookAccessChecker directive from ip-block.conf (globally or inside a <Location>).
  5. apachectl configtest && apachectl graceful.

Real client IP comes from r.useragent_ip, which respects mod_remoteip when you configure RemoteIPHeader / RemoteIPTrustedProxy for your CDN/LB.

Approach B — mod_rewrite RewriteMap program

  1. LoadModule rewrite_module modules/mod_rewrite.so.
  2. Copy checker_map.php to /etc/httpd/ip-block/checker_map.php, make it executable (chmod +x), and confirm the php CLI is installed.
  3. Export config to Apache's environment (systemd unit / /etc/sysconfig/httpd): IPB_SITE_ID, IPB_API_KEY, etc.
  4. Uncomment the Approach B block in ip-block.conf (and comment out A).
  5. apachectl configtest && apachectl restart (a full restart is needed so Apache launches the persistent map program).

The RewriteMap prg: program is started once and kept running; it caches decisions in memory. The composite lookup key IP|USER_AGENT|REFERER is built in the config so the checker can forward all three fields to the API.

Configuration reference

Env varDefaultMeaning
IPB_ENABLED1(A) Master switch.
IPB_SITE_IDSite id.
IPB_API_KEYAPI key (JSON body).
IPB_API_URLhttps://api.ip-block.com/v1/checkEndpoint.
IPB_FAIL_OPEN11 allow on error, 0 fail closed.
IPB_TIMEOUT_MS1000(B) API timeout (ms).
IPB_TIMEOUT_S1(A) API timeout (s).
IPB_CACHE_TTL300Per-IP cache seconds.
IPB_CACHE_DIR/tmp/ip-block-cache(A) disk cache dir.
IPB_BLOCK_ACTION403(A) 403 or redirect.
IPB_BLOCK_REDIRECThttps://www.ip-block.com/blocked.php(A) redirect target.
IPB_BLOCK_MESSAGEAccess denied.(A) 403 body.
IPB_WHITELISTComma-separated IPs never checked.

Behaviour

  • Only {"action":"block"} blocks; anything else allows (subject to fail_open).
  • Infrastructure errors are never cached, so an API blip does not pin an IP.
  • Whitelisted IPs are short-circuited before the cache/API.

Caching notes

  • Approach A caches to disk (survives across processes/reloads); safe for a prefork/worker/event MPM.
  • Approach B caches in the single long-lived map process's memory (fast, but reset on Apache restart). Both use a 300s default TTL.

About

IP Block protection for Apache httpd — ip-block.com integration. Untested at the moment; please feel free to modify. GPLv3.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

⚠️Status: untested. This extension is provided as-is and has not been tested in production. Please feel free to fork, modify, improve, and open pull requests.

Licensed under GNU GPLv3 (see LICENSE).

IP Block for Apache httpd 2.4

Two install-ready approaches to consult the ip-block.com decision API and block matching IPs.

  • Tested against: Apache httpd 2.4 (current stable 2.4.x, 2026).
  • Approach A (recommended):mod_lua access hook — ip_block.lua.
  • Approach B (LuaSec-free):mod_rewrite + external RewriteMap program — checker_map.php.

Pick one. Both honour the same shared contract (POST /v1/check, api_key in the body, block only on action == "block", 1s timeout, fail-open, per-IP cache, whitelist).

Files

FileApproachPurpose
ip_block.luaAmod_lua access checker hook.
checker_map.phpBPersistent RewriteMap prg: decision program (PHP).
ip-block.confA+Bhttpd config for both (enable one).

Approach A — mod_lua (recommended)

  1. Ensure mod_lua is available (LoadModule lua_module modules/mod_lua.so).
  2. Install LuaSec (ssl.https) and LuaSocket (ltn12) for the Lua that mod_lua uses — e.g. luarocks install luasec luasocket. If they are missing the hook fails open and logs a warning; use Approach B instead.
  3. Copy ip_block.lua to e.g. /etc/httpd/ip-block/ip_block.lua.
  4. Add the SetEnv IPB_* lines and the LuaHookAccessChecker directive from ip-block.conf (globally or inside a <Location>).
  5. apachectl configtest && apachectl graceful.

Real client IP comes from r.useragent_ip, which respects mod_remoteip when you configure RemoteIPHeader / RemoteIPTrustedProxy for your CDN/LB.

Approach B — mod_rewrite RewriteMap program

  1. LoadModule rewrite_module modules/mod_rewrite.so.
  2. Copy checker_map.php to /etc/httpd/ip-block/checker_map.php, make it executable (chmod +x), and confirm the php CLI is installed.
  3. Export config to Apache's environment (systemd unit / /etc/sysconfig/httpd): IPB_SITE_ID, IPB_API_KEY, etc.
  4. Uncomment the Approach B block in ip-block.conf (and comment out A).
  5. apachectl configtest && apachectl restart (a full restart is needed so Apache launches the persistent map program).

The RewriteMap prg: program is started once and kept running; it caches decisions in memory. The composite lookup key IP|USER_AGENT|REFERER is built in the config so the checker can forward all three fields to the API.

Configuration reference

Env varDefaultMeaning
IPB_ENABLED1(A) Master switch.
IPB_SITE_IDSite id.
IPB_API_KEYAPI key (JSON body).
IPB_API_URLhttps://api.ip-block.com/v1/checkEndpoint.
IPB_FAIL_OPEN11 allow on error, 0 fail closed.
IPB_TIMEOUT_MS1000(B) API timeout (ms).
IPB_TIMEOUT_S1(A) API timeout (s).
IPB_CACHE_TTL300Per-IP cache seconds.
IPB_CACHE_DIR/tmp/ip-block-cache(A) disk cache dir.
IPB_BLOCK_ACTION403(A) 403 or redirect.
IPB_BLOCK_REDIRECThttps://www.ip-block.com/blocked.php(A) redirect target.
IPB_BLOCK_MESSAGEAccess denied.(A) 403 body.
IPB_WHITELISTComma-separated IPs never checked.

Behaviour

  • Only {"action":"block"} blocks; anything else allows (subject to fail_open).
  • Infrastructure errors are never cached, so an API blip does not pin an IP.
  • Whitelisted IPs are short-circuited before the cache/API.

Caching notes

  • Approach A caches to disk (survives across processes/reloads); safe for a prefork/worker/event MPM.
  • Approach B caches in the single long-lived map process's memory (fast, but reset on Apache restart). Both use a 300s default TTL.

About

IP Block protection for Apache httpd — ip-block.com integration. Untested at the moment; please feel free to modify. GPLv3.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

⚠️Status: untested. This extension is provided as-is and has not been tested in production. Please feel free to fork, modify, improve, and open pull requests.

Licensed under GNU GPLv3 (see LICENSE).

IP Block for Apache httpd 2.4

Two install-ready approaches to consult the ip-block.com decision API and block matching IPs.

  • Tested against: Apache httpd 2.4 (current stable 2.4.x, 2026).
  • Approach A (recommended):mod_lua access hook — ip_block.lua.
  • Approach B (LuaSec-free):mod_rewrite + external RewriteMap program — checker_map.php.

Pick one. Both honour the same shared contract (POST /v1/check, api_key in the body, block only on action == "block", 1s timeout, fail-open, per-IP cache, whitelist).

Files

FileApproachPurpose
ip_block.luaAmod_lua access checker hook.
checker_map.phpBPersistent RewriteMap prg: decision program (PHP).
ip-block.confA+Bhttpd config for both (enable one).

Approach A — mod_lua (recommended)

  1. Ensure mod_lua is available (LoadModule lua_module modules/mod_lua.so).
  2. Install LuaSec (ssl.https) and LuaSocket (ltn12) for the Lua that mod_lua uses — e.g. luarocks install luasec luasocket. If they are missing the hook fails open and logs a warning; use Approach B instead.
  3. Copy ip_block.lua to e.g. /etc/httpd/ip-block/ip_block.lua.
  4. Add the SetEnv IPB_* lines and the LuaHookAccessChecker directive from ip-block.conf (globally or inside a <Location>).
  5. apachectl configtest && apachectl graceful.

Real client IP comes from r.useragent_ip, which respects mod_remoteip when you configure RemoteIPHeader / RemoteIPTrustedProxy for your CDN/LB.

Approach B — mod_rewrite RewriteMap program

  1. LoadModule rewrite_module modules/mod_rewrite.so.
  2. Copy checker_map.php to /etc/httpd/ip-block/checker_map.php, make it executable (chmod +x), and confirm the php CLI is installed.
  3. Export config to Apache's environment (systemd unit / /etc/sysconfig/httpd): IPB_SITE_ID, IPB_API_KEY, etc.
  4. Uncomment the Approach B block in ip-block.conf (and comment out A).
  5. apachectl configtest && apachectl restart (a full restart is needed so Apache launches the persistent map program).

The RewriteMap prg: program is started once and kept running; it caches decisions in memory. The composite lookup key IP|USER_AGENT|REFERER is built in the config so the checker can forward all three fields to the API.

Configuration reference

Env varDefaultMeaning
IPB_ENABLED1(A) Master switch.
IPB_SITE_IDSite id.
IPB_API_KEYAPI key (JSON body).
IPB_API_URLhttps://api.ip-block.com/v1/checkEndpoint.
IPB_FAIL_OPEN11 allow on error, 0 fail closed.
IPB_TIMEOUT_MS1000(B) API timeout (ms).
IPB_TIMEOUT_S1(A) API timeout (s).
IPB_CACHE_TTL300Per-IP cache seconds.
IPB_CACHE_DIR/tmp/ip-block-cache(A) disk cache dir.
IPB_BLOCK_ACTION403(A) 403 or redirect.
IPB_BLOCK_REDIRECThttps://www.ip-block.com/blocked.php(A) redirect target.
IPB_BLOCK_MESSAGEAccess denied.(A) 403 body.
IPB_WHITELISTComma-separated IPs never checked.

Behaviour

  • Only {"action":"block"} blocks; anything else allows (subject to fail_open).
  • Infrastructure errors are never cached, so an API blip does not pin an IP.
  • Whitelisted IPs are short-circuited before the cache/API.

Caching notes

  • Approach A caches to disk (survives across processes/reloads); safe for a prefork/worker/event MPM.
  • Approach B caches in the single long-lived map process's memory (fast, but reset on Apache restart). Both use a 300s default TTL.

About

IP Block protection for Apache httpd — ip-block.com integration. Untested at the moment; please feel free to modify. GPLv3.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

⚠️Status: untested. This extension is provided as-is and has not been tested in production. Please feel free to fork, modify, improve, and open pull requests.

Licensed under GNU GPLv3 (see LICENSE).

IP Block for Apache httpd 2.4

Two install-ready approaches to consult the ip-block.com decision API and block matching IPs.

  • Tested against: Apache httpd 2.4 (current stable 2.4.x, 2026).
  • Approach A (recommended):mod_lua access hook — ip_block.lua.
  • Approach B (LuaSec-free):mod_rewrite + external RewriteMap program — checker_map.php.

Pick one. Both honour the same shared contract (POST /v1/check, api_key in the body, block only on action == "block", 1s timeout, fail-open, per-IP cache, whitelist).

Files

FileApproachPurpose
ip_block.luaAmod_lua access checker hook.
checker_map.phpBPersistent RewriteMap prg: decision program (PHP).
ip-block.confA+Bhttpd config for both (enable one).

Approach A — mod_lua (recommended)

  1. Ensure mod_lua is available (LoadModule lua_module modules/mod_lua.so).
  2. Install LuaSec (ssl.https) and LuaSocket (ltn12) for the Lua that mod_lua uses — e.g. luarocks install luasec luasocket. If they are missing the hook fails open and logs a warning; use Approach B instead.
  3. Copy ip_block.lua to e.g. /etc/httpd/ip-block/ip_block.lua.
  4. Add the SetEnv IPB_* lines and the LuaHookAccessChecker directive from ip-block.conf (globally or inside a <Location>).
  5. apachectl configtest && apachectl graceful.

Real client IP comes from r.useragent_ip, which respects mod_remoteip when you configure RemoteIPHeader / RemoteIPTrustedProxy for your CDN/LB.

Approach B — mod_rewrite RewriteMap program

  1. LoadModule rewrite_module modules/mod_rewrite.so.
  2. Copy checker_map.php to /etc/httpd/ip-block/checker_map.php, make it executable (chmod +x), and confirm the php CLI is installed.
  3. Export config to Apache's environment (systemd unit / /etc/sysconfig/httpd): IPB_SITE_ID, IPB_API_KEY, etc.
  4. Uncomment the Approach B block in ip-block.conf (and comment out A).
  5. apachectl configtest && apachectl restart (a full restart is needed so Apache launches the persistent map program).

The RewriteMap prg: program is started once and kept running; it caches decisions in memory. The composite lookup key IP|USER_AGENT|REFERER is built in the config so the checker can forward all three fields to the API.

Configuration reference

Env varDefaultMeaning
IPB_ENABLED1(A) Master switch.
IPB_SITE_IDSite id.
IPB_API_KEYAPI key (JSON body).
IPB_API_URLhttps://api.ip-block.com/v1/checkEndpoint.
IPB_FAIL_OPEN11 allow on error, 0 fail closed.
IPB_TIMEOUT_MS1000(B) API timeout (ms).
IPB_TIMEOUT_S1(A) API timeout (s).
IPB_CACHE_TTL300Per-IP cache seconds.
IPB_CACHE_DIR/tmp/ip-block-cache(A) disk cache dir.
IPB_BLOCK_ACTION403(A) 403 or redirect.
IPB_BLOCK_REDIRECThttps://www.ip-block.com/blocked.php(A) redirect target.
IPB_BLOCK_MESSAGEAccess denied.(A) 403 body.
IPB_WHITELISTComma-separated IPs never checked.

Behaviour

  • Only {"action":"block"} blocks; anything else allows (subject to fail_open).
  • Infrastructure errors are never cached, so an API blip does not pin an IP.
  • Whitelisted IPs are short-circuited before the cache/API.

Caching notes

  • Approach A caches to disk (survives across processes/reloads); safe for a prefork/worker/event MPM.
  • Approach B caches in the single long-lived map process's memory (fast, but reset on Apache restart). Both use a 300s default TTL.

About

IP Block protection for Apache httpd — ip-block.com integration. Untested at the moment; please feel free to modify. GPLv3.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

⚠️Status: untested. This extension is provided as-is and has not been tested in production. Please feel free to fork, modify, improve, and open pull requests.

Licensed under GNU GPLv3 (see LICENSE).

IP Block for Apache httpd 2.4

Two install-ready approaches to consult the ip-block.com decision API and block matching IPs.

  • Tested against: Apache httpd 2.4 (current stable 2.4.x, 2026).
  • Approach A (recommended):mod_lua access hook — ip_block.lua.
  • Approach B (LuaSec-free):mod_rewrite + external RewriteMap program — checker_map.php.

Pick one. Both honour the same shared contract (POST /v1/check, api_key in the body, block only on action == "block", 1s timeout, fail-open, per-IP cache, whitelist).

Files

FileApproachPurpose
ip_block.luaAmod_lua access checker hook.
checker_map.phpBPersistent RewriteMap prg: decision program (PHP).
ip-block.confA+Bhttpd config for both (enable one).

Approach A — mod_lua (recommended)

  1. Ensure mod_lua is available (LoadModule lua_module modules/mod_lua.so).
  2. Install LuaSec (ssl.https) and LuaSocket (ltn12) for the Lua that mod_lua uses — e.g. luarocks install luasec luasocket. If they are missing the hook fails open and logs a warning; use Approach B instead.
  3. Copy ip_block.lua to e.g. /etc/httpd/ip-block/ip_block.lua.
  4. Add the SetEnv IPB_* lines and the LuaHookAccessChecker directive from ip-block.conf (globally or inside a <Location>).
  5. apachectl configtest && apachectl graceful.

Real client IP comes from r.useragent_ip, which respects mod_remoteip when you configure RemoteIPHeader / RemoteIPTrustedProxy for your CDN/LB.

Approach B — mod_rewrite RewriteMap program

  1. LoadModule rewrite_module modules/mod_rewrite.so.
  2. Copy checker_map.php to /etc/httpd/ip-block/checker_map.php, make it executable (chmod +x), and confirm the php CLI is installed.
  3. Export config to Apache's environment (systemd unit / /etc/sysconfig/httpd): IPB_SITE_ID, IPB_API_KEY, etc.
  4. Uncomment the Approach B block in ip-block.conf (and comment out A).
  5. apachectl configtest && apachectl restart (a full restart is needed so Apache launches the persistent map program).

The RewriteMap prg: program is started once and kept running; it caches decisions in memory. The composite lookup key IP|USER_AGENT|REFERER is built in the config so the checker can forward all three fields to the API.

Configuration reference

Env varDefaultMeaning
IPB_ENABLED1(A) Master switch.
IPB_SITE_IDSite id.
IPB_API_KEYAPI key (JSON body).
IPB_API_URLhttps://api.ip-block.com/v1/checkEndpoint.
IPB_FAIL_OPEN11 allow on error, 0 fail closed.
IPB_TIMEOUT_MS1000(B) API timeout (ms).
IPB_TIMEOUT_S1(A) API timeout (s).
IPB_CACHE_TTL300Per-IP cache seconds.
IPB_CACHE_DIR/tmp/ip-block-cache(A) disk cache dir.
IPB_BLOCK_ACTION403(A) 403 or redirect.
IPB_BLOCK_REDIRECThttps://www.ip-block.com/blocked.php(A) redirect target.
IPB_BLOCK_MESSAGEAccess denied.(A) 403 body.
IPB_WHITELISTComma-separated IPs never checked.

Behaviour

  • Only {"action":"block"} blocks; anything else allows (subject to fail_open).
  • Infrastructure errors are never cached, so an API blip does not pin an IP.
  • Whitelisted IPs are short-circuited before the cache/API.

Caching notes

  • Approach A caches to disk (survives across processes/reloads); safe for a prefork/worker/event MPM.
  • Approach B caches in the single long-lived map process's memory (fast, but reset on Apache restart). Both use a 300s default TTL.

About

IP Block protection for Apache httpd — ip-block.com integration. Untested at the moment; please feel free to modify. GPLv3.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

⚠️Status: untested. This extension is provided as-is and has not been tested in production. Please feel free to fork, modify, improve, and open pull requests.

Licensed under GNU GPLv3 (see LICENSE).

IP Block for Apache httpd 2.4

Two install-ready approaches to consult the ip-block.com decision API and block matching IPs.

  • Tested against: Apache httpd 2.4 (current stable 2.4.x, 2026).
  • Approach A (recommended):mod_lua access hook — ip_block.lua.
  • Approach B (LuaSec-free):mod_rewrite + external RewriteMap program — checker_map.php.

Pick one. Both honour the same shared contract (POST /v1/check, api_key in the body, block only on action == "block", 1s timeout, fail-open, per-IP cache, whitelist).

Files

FileApproachPurpose
ip_block.luaAmod_lua access checker hook.
checker_map.phpBPersistent RewriteMap prg: decision program (PHP).
ip-block.confA+Bhttpd config for both (enable one).

Approach A — mod_lua (recommended)

  1. Ensure mod_lua is available (LoadModule lua_module modules/mod_lua.so).
  2. Install LuaSec (ssl.https) and LuaSocket (ltn12) for the Lua that mod_lua uses — e.g. luarocks install luasec luasocket. If they are missing the hook fails open and logs a warning; use Approach B instead.
  3. Copy ip_block.lua to e.g. /etc/httpd/ip-block/ip_block.lua.
  4. Add the SetEnv IPB_* lines and the LuaHookAccessChecker directive from ip-block.conf (globally or inside a <Location>).
  5. apachectl configtest && apachectl graceful.

Real client IP comes from r.useragent_ip, which respects mod_remoteip when you configure RemoteIPHeader / RemoteIPTrustedProxy for your CDN/LB.

Approach B — mod_rewrite RewriteMap program

  1. LoadModule rewrite_module modules/mod_rewrite.so.
  2. Copy checker_map.php to /etc/httpd/ip-block/checker_map.php, make it executable (chmod +x), and confirm the php CLI is installed.
  3. Export config to Apache's environment (systemd unit / /etc/sysconfig/httpd): IPB_SITE_ID, IPB_API_KEY, etc.
  4. Uncomment the Approach B block in ip-block.conf (and comment out A).
  5. apachectl configtest && apachectl restart (a full restart is needed so Apache launches the persistent map program).

The RewriteMap prg: program is started once and kept running; it caches decisions in memory. The composite lookup key IP|USER_AGENT|REFERER is built in the config so the checker can forward all three fields to the API.

Configuration reference

Env varDefaultMeaning
IPB_ENABLED1(A) Master switch.
IPB_SITE_IDSite id.
IPB_API_KEYAPI key (JSON body).
IPB_API_URLhttps://api.ip-block.com/v1/checkEndpoint.
IPB_FAIL_OPEN11 allow on error, 0 fail closed.
IPB_TIMEOUT_MS1000(B) API timeout (ms).
IPB_TIMEOUT_S1(A) API timeout (s).
IPB_CACHE_TTL300Per-IP cache seconds.
IPB_CACHE_DIR/tmp/ip-block-cache(A) disk cache dir.
IPB_BLOCK_ACTION403(A) 403 or redirect.
IPB_BLOCK_REDIRECThttps://www.ip-block.com/blocked.php(A) redirect target.
IPB_BLOCK_MESSAGEAccess denied.(A) 403 body.
IPB_WHITELISTComma-separated IPs never checked.

Behaviour

  • Only {"action":"block"} blocks; anything else allows (subject to fail_open).
  • Infrastructure errors are never cached, so an API blip does not pin an IP.
  • Whitelisted IPs are short-circuited before the cache/API.

Caching notes

  • Approach A caches to disk (survives across processes/reloads); safe for a prefork/worker/event MPM.
  • Approach B caches in the single long-lived map process's memory (fast, but reset on Apache restart). Both use a 300s default TTL.

About

IP Block protection for Apache httpd — ip-block.com integration. Untested at the moment; please feel free to modify. GPLv3.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

⚠️Status: untested. This extension is provided as-is and has not been tested in production. Please feel free to fork, modify, improve, and open pull requests.

Licensed under GNU GPLv3 (see LICENSE).

IP Block for Apache httpd 2.4

Two install-ready approaches to consult the ip-block.com decision API and block matching IPs.

  • Tested against: Apache httpd 2.4 (current stable 2.4.x, 2026).
  • Approach A (recommended):mod_lua access hook — ip_block.lua.
  • Approach B (LuaSec-free):mod_rewrite + external RewriteMap program — checker_map.php.

Pick one. Both honour the same shared contract (POST /v1/check, api_key in the body, block only on action == "block", 1s timeout, fail-open, per-IP cache, whitelist).

Files

FileApproachPurpose
ip_block.luaAmod_lua access checker hook.
checker_map.phpBPersistent RewriteMap prg: decision program (PHP).
ip-block.confA+Bhttpd config for both (enable one).

Approach A — mod_lua (recommended)

  1. Ensure mod_lua is available (LoadModule lua_module modules/mod_lua.so).
  2. Install LuaSec (ssl.https) and LuaSocket (ltn12) for the Lua that mod_lua uses — e.g. luarocks install luasec luasocket. If they are missing the hook fails open and logs a warning; use Approach B instead.
  3. Copy ip_block.lua to e.g. /etc/httpd/ip-block/ip_block.lua.
  4. Add the SetEnv IPB_* lines and the LuaHookAccessChecker directive from ip-block.conf (globally or inside a <Location>).
  5. apachectl configtest && apachectl graceful.

Real client IP comes from r.useragent_ip, which respects mod_remoteip when you configure RemoteIPHeader / RemoteIPTrustedProxy for your CDN/LB.

Approach B — mod_rewrite RewriteMap program

  1. LoadModule rewrite_module modules/mod_rewrite.so.
  2. Copy checker_map.php to /etc/httpd/ip-block/checker_map.php, make it executable (chmod +x), and confirm the php CLI is installed.
  3. Export config to Apache's environment (systemd unit / /etc/sysconfig/httpd): IPB_SITE_ID, IPB_API_KEY, etc.
  4. Uncomment the Approach B block in ip-block.conf (and comment out A).
  5. apachectl configtest && apachectl restart (a full restart is needed so Apache launches the persistent map program).

The RewriteMap prg: program is started once and kept running; it caches decisions in memory. The composite lookup key IP|USER_AGENT|REFERER is built in the config so the checker can forward all three fields to the API.

Configuration reference

Env varDefaultMeaning
IPB_ENABLED1(A) Master switch.
IPB_SITE_IDSite id.
IPB_API_KEYAPI key (JSON body).
IPB_API_URLhttps://api.ip-block.com/v1/checkEndpoint.
IPB_FAIL_OPEN11 allow on error, 0 fail closed.
IPB_TIMEOUT_MS1000(B) API timeout (ms).
IPB_TIMEOUT_S1(A) API timeout (s).
IPB_CACHE_TTL300Per-IP cache seconds.
IPB_CACHE_DIR/tmp/ip-block-cache(A) disk cache dir.
IPB_BLOCK_ACTION403(A) 403 or redirect.
IPB_BLOCK_REDIRECThttps://www.ip-block.com/blocked.php(A) redirect target.
IPB_BLOCK_MESSAGEAccess denied.(A) 403 body.
IPB_WHITELISTComma-separated IPs never checked.

Behaviour

  • Only {"action":"block"} blocks; anything else allows (subject to fail_open).
  • Infrastructure errors are never cached, so an API blip does not pin an IP.
  • Whitelisted IPs are short-circuited before the cache/API.

Caching notes

  • Approach A caches to disk (survives across processes/reloads); safe for a prefork/worker/event MPM.
  • Approach B caches in the single long-lived map process's memory (fast, but reset on Apache restart). Both use a 300s default TTL.

About

IP Block protection for Apache httpd — ip-block.com integration. Untested at the moment; please feel free to modify. GPLv3.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

⚠️Status: untested. This extension is provided as-is and has not been tested in production. Please feel free to fork, modify, improve, and open pull requests.

Licensed under GNU GPLv3 (see LICENSE).

IP Block for Apache httpd 2.4

Two install-ready approaches to consult the ip-block.com decision API and block matching IPs.

  • Tested against: Apache httpd 2.4 (current stable 2.4.x, 2026).
  • Approach A (recommended):mod_lua access hook — ip_block.lua.
  • Approach B (LuaSec-free):mod_rewrite + external RewriteMap program — checker_map.php.

Pick one. Both honour the same shared contract (POST /v1/check, api_key in the body, block only on action == "block", 1s timeout, fail-open, per-IP cache, whitelist).

Files

FileApproachPurpose
ip_block.luaAmod_lua access checker hook.
checker_map.phpBPersistent RewriteMap prg: decision program (PHP).
ip-block.confA+Bhttpd config for both (enable one).

Approach A — mod_lua (recommended)

  1. Ensure mod_lua is available (LoadModule lua_module modules/mod_lua.so).
  2. Install LuaSec (ssl.https) and LuaSocket (ltn12) for the Lua that mod_lua uses — e.g. luarocks install luasec luasocket. If they are missing the hook fails open and logs a warning; use Approach B instead.
  3. Copy ip_block.lua to e.g. /etc/httpd/ip-block/ip_block.lua.
  4. Add the SetEnv IPB_* lines and the LuaHookAccessChecker directive from ip-block.conf (globally or inside a <Location>).
  5. apachectl configtest && apachectl graceful.

Real client IP comes from r.useragent_ip, which respects mod_remoteip when you configure RemoteIPHeader / RemoteIPTrustedProxy for your CDN/LB.

Approach B — mod_rewrite RewriteMap program

  1. LoadModule rewrite_module modules/mod_rewrite.so.
  2. Copy checker_map.php to /etc/httpd/ip-block/checker_map.php, make it executable (chmod +x), and confirm the php CLI is installed.
  3. Export config to Apache's environment (systemd unit / /etc/sysconfig/httpd): IPB_SITE_ID, IPB_API_KEY, etc.
  4. Uncomment the Approach B block in ip-block.conf (and comment out A).
  5. apachectl configtest && apachectl restart (a full restart is needed so Apache launches the persistent map program).

The RewriteMap prg: program is started once and kept running; it caches decisions in memory. The composite lookup key IP|USER_AGENT|REFERER is built in the config so the checker can forward all three fields to the API.

Configuration reference

Env varDefaultMeaning
IPB_ENABLED1(A) Master switch.
IPB_SITE_IDSite id.
IPB_API_KEYAPI key (JSON body).
IPB_API_URLhttps://api.ip-block.com/v1/checkEndpoint.
IPB_FAIL_OPEN11 allow on error, 0 fail closed.
IPB_TIMEOUT_MS1000(B) API timeout (ms).
IPB_TIMEOUT_S1(A) API timeout (s).
IPB_CACHE_TTL300Per-IP cache seconds.
IPB_CACHE_DIR/tmp/ip-block-cache(A) disk cache dir.
IPB_BLOCK_ACTION403(A) 403 or redirect.
IPB_BLOCK_REDIRECThttps://www.ip-block.com/blocked.php(A) redirect target.
IPB_BLOCK_MESSAGEAccess denied.(A) 403 body.
IPB_WHITELISTComma-separated IPs never checked.

Behaviour

  • Only {"action":"block"} blocks; anything else allows (subject to fail_open).
  • Infrastructure errors are never cached, so an API blip does not pin an IP.
  • Whitelisted IPs are short-circuited before the cache/API.

Caching notes

  • Approach A caches to disk (survives across processes/reloads); safe for a prefork/worker/event MPM.
  • Approach B caches in the single long-lived map process's memory (fast, but reset on Apache restart). Both use a 300s default TTL.

About

IP Block protection for Apache httpd — ip-block.com integration. Untested at the moment; please feel free to modify. GPLv3.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages