{"id":2898,"date":"2025-09-02T17:27:34","date_gmt":"2025-09-02T09:27:34","guid":{"rendered":"https:\/\/www.ruianding.com\/blog\/?p=2898"},"modified":"2026-02-07T15:10:28","modified_gmt":"2026-02-07T07:10:28","slug":"use-matomo-api-block-ips","status":"publish","type":"post","link":"https:\/\/www.ruianding.com\/blog\/use-matomo-api-block-ips\/","title":{"rendered":"\u642d\u5efa\u81ea\u52a8\u5c01\u7981 WordPress \u767b\u5f55\u653b\u51fb\u7684 Matomo + Apache \u811a\u672c"},"content":{"rendered":"\n<p>\u5728\u7ba1\u7406 WordPress \u7f51\u7ad9\u65f6\uff0cwp-login.php \u5e38\u5e38\u6210\u4e3a\u653b\u51fb\u76ee\u6807\u3002\u672c\u6587\u5206\u4eab\u6211\u5982\u4f55\u5229\u7528 <strong>Matomo API<\/strong> \u83b7\u53d6\u8bbf\u95ee\u6570\u636e\uff0c\u5e76\u81ea\u52a8\u751f\u6210 <strong>Apache \u5c01\u7981\u89c4\u5219<\/strong>\uff0c\u5b9e\u73b0 T+1 \u81ea\u52a8\u5c01\u7981\u6076\u610f IP\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"273\" src=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-7-1024x273.png\" alt=\"\" class=\"wp-image-2918\" style=\"width:706px;height:auto\" srcset=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-7-1024x273.png 1024w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-7-300x80.png 300w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-7-768x205.png 768w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-7-1536x409.png 1536w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-7.png 1764w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-cyan-bluish-gray-color has-alpha-channel-opacity has-cyan-bluish-gray-background-color has-background is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>1. \u51c6\u5907\u5de5\u4f5c<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>1.1 \u83b7\u53d6 Matomo \u8bbf\u95ee Token<\/strong><\/h3>\n\n\n\n<p>1. \u767b\u5f55 Matomo \u540e\u53f0\u3002<\/p>\n\n\n\n<p>2. \u6253\u5f00 <strong>\u4e2a\u4eba \u2192 \u8bbe\u7f6e \u2192 \u5b89\u5168 \u751f\u6210\u9a8c\u8bc1\u4ee4\u724c<\/strong>\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"888\" src=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-1024x888.png\" alt=\"\" class=\"wp-image-2900\" srcset=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-1024x888.png 1024w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-300x260.png 300w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-768x666.png 768w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-1536x1332.png 1536w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-2048x1775.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>3. \u4fdd\u5b58 token\uff0c\u7528\u4e8e\u811a\u672c\u8c03\u7528 API\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>1.2 \u786e\u8ba4 Apache \u914d\u7f6e\u53ef\u7528<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Apache \u7248\u672c \u2265 2.4\u3002<\/li>\n\n\n\n<li>\u786e\u8ba4 \/etc\/apache2\/apache2.conf \u4e2d\u5305\u542b\uff1a<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">IncludeOptional conf-enabled\/*.conf\nIncludeOptional sites-enabled\/*.conf<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u786e\u4fdd\u80fd\u901a\u8fc7 apachectl graceful \u91cd\u8f7d\u914d\u7f6e\u3002<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"400\" src=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-5-1024x400.png\" alt=\"\" class=\"wp-image-2912\" style=\"width:454px;height:auto\" srcset=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-5-1024x400.png 1024w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-5-300x117.png 300w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-5-768x300.png 768w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-5.png 1070w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-cyan-bluish-gray-color has-alpha-channel-opacity has-cyan-bluish-gray-background-color has-background is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>2. Python \u811a\u672c\u5b9e\u73b0<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2.1 \u6838\u5fc3\u529f\u80fd<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u8c03\u7528 Matomo API \u83b7\u53d6\u6700\u8fd1\u8bbf\u95ee wp-login.php \u7684 IP\u3002<\/li>\n\n\n\n<li>\u68c0\u67e5 IP \u662f\u5426\u5728\u767d\u540d\u5355\u3002<\/li>\n\n\n\n<li>\u5386\u53f2\u5c01\u7981 IP \u7d2f\u52a0\uff0c\u4e0d\u8986\u76d6\u3002<\/li>\n\n\n\n<li>\u6253\u5370\u65e5\u5fd7\u81f3\u6307\u5b9a\u8def\u5f84\uff0c\u65b9\u4fbf\u8bb0\u5f55\u3002<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2.2 \u5b8c\u6574\u811a\u672c&nbsp;<\/strong><\/h3>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>matomo_block.py<\/strong><\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#!\/usr\/bin\/env python3\n# -*- coding: utf-8 -*-\n\nimport requests\nimport subprocess\nimport ipaddress\nimport os\nimport traceback\nfrom datetime import datetime\n\n# ================= \u914d\u7f6e =================\nMATOMO_API = \"http:\/\/matomo.ruianding.com\/index.php\"\nSITE_ID = 1\nTOKEN_AUTH = \"{your_matomo_api_token}\"\nBLOCK_CONF = \"\/etc\/apache2\/block_wp.conf\"  # Apache \u5168\u5c40\u5c01\u7981\u914d\u7f6e\nLIMIT = 1000  # \u62c9\u53d6\u6700\u8fd1\u8bbf\u95ee\u6570\nLOG_FILE = \"matomo_block.log\"\nHISTORY_FILE = \"blocked_ips.txt\"  # \u5386\u53f2\u5c01\u7981 IP \u6587\u4ef6\n\n# \u767d\u540d\u5355 IP \/ \u7f51\u6bb5 (CIDR \u652f\u6301)\nWHITELIST = [\n    \"{\u767d\u540d\u5355 IPV4 \u5730\u5740}\"\n]\n\n# ================= \u51fd\u6570 =================\ndef log(msg):\n    timestamp = datetime.now().strftime(\"%Y-%m-%d %H:%M:%S\")\n    line = f\"[{timestamp}] {msg}\"\n    print(line)\n    with open(LOG_FILE, \"a\") as f:\n        f.write(line + \"\\n\")\n\ndef ip_in_whitelist(ip_str):\n    \"\"\"\u5224\u65ad ip \u662f\u5426\u5728\u767d\u540d\u5355\"\"\"\n    ip = ipaddress.ip_address(ip_str)\n    for net in WHITELIST:\n        try:\n            if '\/' in net:\n                if ip in ipaddress.ip_network(net):\n                    return True\n            else:\n                if ip == ipaddress.ip_address(net):\n                    return True\n        except ValueError:\n            continue\n    return False\n\ndef load_blocked_ips():\n    \"\"\"\u8bfb\u53d6\u5386\u53f2\u5c01\u7981 IP\"\"\"\n    blocked = set()\n    if os.path.exists(HISTORY_FILE):\n        with open(HISTORY_FILE) as f:\n            for line in f:\n                line = line.strip()\n                if line:\n                    blocked.add(line)\n    return blocked\n\ndef save_blocked_ips(blocked_ips):\n    \"\"\"\u4fdd\u5b58\u7d2f\u79ef\u5c01\u7981 IP\"\"\"\n    with open(HISTORY_FILE, \"w\") as f:\n        for ip in sorted(blocked_ips):\n            f.write(ip + \"\\n\")\n\ndef get_wp_login_ips(limit=LIMIT):\n    \"\"\"\u4ece Matomo API \u83b7\u53d6\u8bbf\u95ee wp-login.php \u7684 IP\"\"\"\n    params = {\n        \"module\": \"API\",\n        \"method\": \"Live.getLastVisitsDetails\",\n        \"idSite\": SITE_ID,\n        \"period\": \"day\",\n        \"date\": \"today\",\n        \"format\": \"JSON\",\n        \"filter_limit\": limit,\n        \"token_auth\": TOKEN_AUTH\n    }\n    r = requests.post(MATOMO_API, data=params)\n    r.raise_for_status()\n    data = r.json()\n\n    wp_ips = set()\n    for visit in data:\n        for action in visit.get(\"actionDetails\") or []:\n            url = action.get(\"url\")\n            if url and \"wp-login.php\" in url:\n                ip = visit.get(\"visitIp\")\n                if ip:\n                    wp_ips.add(ip)\n    return wp_ips\n\ndef write_apache_conf(blocked_ips):\n    \"\"\"\u751f\u6210 Apache \u5168\u5c40\u5c01\u7981\u89c4\u5219\uff0c\u4f7f\u7528 &lt;If> \u5224\u65ad REMOTE_ADDR\"\"\"\n    lines = [\"# Auto-generated by matomo_block.py\"]\n    blocked_count = 0\n    for ip in sorted(blocked_ips):\n        if ip_in_whitelist(ip):\n            continue\n        lines.append(f'&lt;If \"%{{REMOTE_ADDR}} == \\'{ip}\\'\">')\n        lines.append(\"    Require all denied\")\n        lines.append(\"&lt;\/If>\")\n        blocked_count += 1\n\n    with open(BLOCK_CONF, \"w\") as f:\n        f.write(\"\\n\".join(lines))\n    log(f\"[+] Wrote {blocked_count} rules to {BLOCK_CONF}\")\n\ndef reload_apache():\n    \"\"\"\u91cd\u8f7d Apache\"\"\"\n    try:\n        subprocess.run([\"apachectl\", \"graceful\"], check=True)\n        log(\"[+] Apache reloaded\")\n    except subprocess.CalledProcessError as e:\n        log(f\"[-] Apache reload failed: {e}\")\n        log(traceback.format_exc())\n\n# ================= \u4e3b\u7a0b\u5e8f =================\nif __name__ == \"__main__\":\n    try:\n        old_blocked = load_blocked_ips()\n        log(f\"[+] Loaded {len(old_blocked)} previously blocked IPs\")\n        new_ips = get_wp_login_ips()\n        log(f\"[+] Fetched {len(new_ips)} IPs accessing wp-login.php today\")\n\n        # \u8fc7\u6ee4\u767d\u540d\u5355\u5e76\u7d2f\u52a0\n        to_block = {ip for ip in new_ips if not ip_in_whitelist(ip)}\n        all_blocked = old_blocked | to_block\n        save_blocked_ips(all_blocked)\n        log(f\"[+] Total {len(all_blocked)} IPs will be blocked (including history)\")\n\n        write_apache_conf(all_blocked)\n        reload_apache()\n    except Exception as e:\n        log(f\"[-] Error: {e}\")\n        log(traceback.format_exc())<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-cyan-bluish-gray-color has-alpha-channel-opacity has-cyan-bluish-gray-background-color has-background is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>3. Apache \u914d\u7f6e\u8bf4\u660e<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5c01\u7981\u89c4\u5219\u901a\u8fc7 &lt;RequireAll&gt; \u5305\u88f9\uff0c\u907f\u514d\u8d1f\u5411 Require \u62a5\u9519\u3002<\/li>\n\n\n\n<li>\u767d\u540d\u5355\u53ef\u652f\u6301\u5355\u4e2a IP \u6216 CIDR \u7f51\u6bb5\u3002<\/li>\n\n\n\n<li>\u5386\u53f2\u5c01\u7981 IP \u4f1a\u7d2f\u52a0\uff0c\u4e0d\u4f1a\u8986\u76d6\u3002<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><br>3.1 <strong>Apache \u52a0\u8f7d\u81ea\u5b9a\u4e49\u5c01\u7981\u89c4\u5219<\/strong><\/h3>\n\n\n\n<p><br>\u4e3a\u4e86\u8ba9 Apache \u5b9e\u9645\u5e94\u7528\u6211\u4eec\u751f\u6210\u7684 \/etc\/apache2\/block_wp.conf\uff0c\u9700\u8981\u5728\u4e3b\u914d\u7f6e\u91cc <strong>Include<\/strong> \u5b83\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"apache\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Include custom block rules for wp-login.php\nInclude \/etc\/apache2\/block_wp.conf<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4f60\u53ef\u4ee5\u52a0\u5728 \/etc\/apache2\/apache2.conf \u6216\u5bf9\u5e94\u7684\u865a\u62df\u4e3b\u673a\u914d\u7f6e\u6587\u4ef6\u4e2d\u3002<\/li>\n\n\n\n<li>\u8fd9\u6837\u811a\u672c\u751f\u6210\u7684\u65b0\u89c4\u5219\u6bcf\u6b21\u91cd\u8f7d Apache \u90fd\u4f1a\u751f\u6548\u3002<\/li>\n\n\n\n<li>\u6ce8\u610f Include \u8def\u5f84\u5fc5\u987b\u6b63\u786e\uff0c\u5426\u5219 Apache \u542f\u52a8\u4f1a\u62a5\u9519\u3002<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-cyan-bluish-gray-color has-alpha-channel-opacity has-cyan-bluish-gray-background-color has-background is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>4. \u8c03\u8bd5\u4e0e\u6392\u9519<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>4.1 Apache&nbsp;\u65e0\u6cd5\u8bc6\u522b\u914d\u7f6e\u62a5\u9519 &#8211; Require not ip<\/strong><\/h3>\n\n\n\n<p>\u4f7f\u7528 &lt;RequireAll&gt; \u5305\u88f9\u8d1f\u5411\u89c4\u5219\u5373\u53ef\u3002<\/p>\n\n\n\n<div id=\"wp-block-themeisle-blocks-advanced-columns-e0f1e448\" class=\"wp-block-themeisle-blocks-advanced-columns has-2-columns has-desktop-equal-layout has-tablet-equal-layout has-mobile-collapsedRows-layout has-vertical-unset\"><div class=\"wp-block-themeisle-blocks-advanced-columns-overlay\"><\/div><div class=\"innerblocks-wrap\">\n<div id=\"wp-block-themeisle-blocks-advanced-column-f39902bc\" class=\"wp-block-themeisle-blocks-advanced-column\">\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"729\" height=\"1024\" src=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/ips-729x1024.png\" alt=\"\" class=\"wp-image-2909\" style=\"width:303px;height:auto\" srcset=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/ips-729x1024.png 729w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/ips-214x300.png 214w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/ips-768x1079.png 768w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/ips.png 920w\" sizes=\"auto, (max-width: 729px) 100vw, 729px\" \/><figcaption class=\"wp-element-caption\">\u672a\u88ab\u5305\u88f9\u7684\u914d\u7f6e\u4fe1\u606f\uff08Apache \u65e0\u6cd5\u8bc6\u522b\uff09<\/figcaption><\/figure>\n<\/div>\n\n\n\n<div id=\"wp-block-themeisle-blocks-advanced-column-05302883\" class=\"wp-block-themeisle-blocks-advanced-column\">\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"664\" height=\"822\" src=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/2-covered.png\" alt=\"\" class=\"wp-image-2910\" style=\"width:344px;height:auto\" srcset=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/2-covered.png 664w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/2-covered-242x300.png 242w\" sizes=\"auto, (max-width: 664px) 100vw, 664px\" \/><figcaption class=\"wp-element-caption\">\u5305\u88f9\u540e\u7684\u5c01\u7981\u914d\u7f6e<\/figcaption><\/figure>\n<\/div>\n<\/div><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>4.2&nbsp;ServerName<\/strong> \u76f8\u5173\u62a5\u9519<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">AH00558: apache2: Could not reliably determine the server's fully qualified domain name<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"126\" src=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-1-1024x126.png\" alt=\"\" class=\"wp-image-2904\" srcset=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-1-1024x126.png 1024w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-1-300x37.png 300w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-1-768x95.png 768w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-1-1536x189.png 1536w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-1.png 1994w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>\u89e3\u51b3\u65b9\u5f0f\uff1a\u4e3aApache\u914d\u7f6e\u9ed8\u8ba4\u57df\u540d\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \/etc\/apache2\/conf-available\/servername.conf\nServerName www.ruianding.com<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo a2enconf servername\nsudo systemctl reload apache2<\/pre>\n\n\n\n<p>\u4e0d\u4f1a\u5f71\u54cd\u5176\u4ed6\u5b50\u57df\u540d\uff0c\u4f8b\u5982 grafana.ruianding.com\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>4.3 Cron \u6267\u884c<\/strong>\u914d\u7f6e<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u786e\u4fdd Python \u8def\u5f84\u6b63\u786e\u3002<\/li>\n\n\n\n<li>\u4f8b\u5b50\uff1a\u6bcf\u5929 0 \u70b9\u81ea\u52a8\u6267\u884c\uff1a<\/li>\n\n\n\n<li>\u7531\u4e8e\u811a\u672c\u5df2\u81ea\u5e26\u65e5\u5fd7\u6253\u5370\u529f\u80fd\uff0c\u6240\u4ee5\u65e0\u9700\u8f93\u51faCron\u65e5\u5fd7<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">0 0 * * * \/usr\/bin\/python3 \/data\/matomo\/matomo_block.py<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-cyan-bluish-gray-color has-alpha-channel-opacity has-cyan-bluish-gray-background-color has-background is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5. \u8fdb\u4e00\u6b65\u4f18\u5316<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">5.1 <strong>\u5168\u5c40\u5c01\u7981 vs \u5355\u8def\u5f84\u5c01\u7981\u7684\u8c03\u6574<\/strong><\/h3>\n\n\n\n<p>\u5728\u6700\u521d\u7684\u5b9e\u73b0\u4e2d\uff0c\u6211\u7684 Matomo IP \u5c01\u7981\u811a\u672c\u662f\u9488\u5bf9\u5355\u4e2a\u8def\u5f84 \/wp-login.php \u7684\uff0c\u4f7f\u7528 Apache &lt;RequireAll&gt;\/&lt;RequireAny&gt; \u914d\u7f6e\u6765\u62d2\u7edd\u8bbf\u95ee\u3002\u4f46\u6211\u60f3\u5230\u4e00\u4e2a\u95ee\u9898\uff1a<\/p>\n\n\n\n<p><strong>\u65e0\u6cd5\u8986\u76d6\u653b\u51fb\u8005\u7684\u5176\u4ed6\u5c1d\u8bd5\u8def\u5f84<\/strong> \u653b\u51fb\u8005\u53ef\u80fd\u901a\u8fc7\u4e0d\u540c\u7684 URL \u5c1d\u8bd5\u8bbf\u95ee\u767b\u5f55\u9875\uff0c\u4f8b\u5982 www.ruianding.com\/blog\/login-wp.php\u3002\u5982\u679c\u53ea\u5c01\u5355\u8def\u5f84\uff0c\u653b\u51fb\u8005\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u5176\u4ed6\u8def\u5f84\u5c1d\u8bd5\u66b4\u529b\u767b\u5f55\u3002<\/p>\n\n\n\n<p>\u56e0\u6b64\uff0c\u6211\u505a\u4e86\u4e24\u9879\u5173\u952e\u8c03\u6574\uff1a<\/p>\n\n\n\n<p><strong>\u5168\u5c40\u5c01\u7981<\/strong> \u4f7f\u7528 Apache &lt;If&gt; \u5224\u65ad REMOTE_ADDR\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;If \"%{REMOTE_ADDR} == '1.2.3.4'\">\n    Require all denied\n&lt;\/If><\/pre>\n\n\n\n<p>\u8fd9\u6837\u53ef\u4ee5\u9488\u5bf9\u6bcf\u4e2a\u653b\u51fb IP \u5168\u5c40\u62d2\u7edd\u8bbf\u95ee\uff0c\u4e0d\u518d\u4f9d\u8d56\u8def\u5f84\u9650\u5b9a\uff0c\u653b\u51fb\u8005\u65e0\u8bba\u8bbf\u95ee\u54ea\u4e2a URL \u90fd\u4f1a\u88ab\u963b\u6b62\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"708\" height=\"816\" src=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-6.png\" alt=\"\" class=\"wp-image-2916\" style=\"width:209px;height:auto\" srcset=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-6.png 708w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-6-260x300.png 260w\" sizes=\"auto, (max-width: 708px) 100vw, 708px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-cyan-bluish-gray-color has-alpha-channel-opacity has-cyan-bluish-gray-background-color has-background is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6. <strong>\u603b\u7ed3<\/strong><\/h2>\n\n\n\n<p>\u901a\u8fc7 Matomo + Python + Apache \u81ea\u52a8\u5316\u5c01\u7981\uff0c\u51cf\u5c11\u4e86\u624b\u52a8\u6392\u67e5\u653b\u51fb IP \u7684\u65f6\u95f4\uff0c\u63d0\u9ad8\u4e86\u7f51\u7ad9\u5b89\u5168\u6027\u3002<\/p>\n\n\n\n<p>\u6574\u4e2a\u6d41\u7a0b\u5305\u62ec\uff1a<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Matomo API \u8c03\u7528\u8c03\u8bd5<\/li>\n\n\n\n<li>Python \u81ea\u52a8\u5316\u811a\u672c\u751f\u6210\u5c01\u7981\u89c4\u5219<\/li>\n\n\n\n<li>Apache \u914d\u7f6e\u66f4\u65b0\u4e0e\u91cd\u8f7d<\/li>\n\n\n\n<li>Cron \u81ea\u52a8\u5316\u6267\u884c<\/li>\n\n\n\n<li>\u8c03\u8bd5\u3001\u6392\u9519\u4e0e\u4f18\u5316<\/li>\n<\/ol>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5728\u7ba1\u7406 WordPress \u7f51\u7ad9\u65f6\uff0cwp-login.php \u5e38\u5e38\u6210\u4e3a\u653b\u51fb\u76ee\u6807\u3002\u672c\u6587\u5206\u4eab\u6211\u5982\u4f55\u5229\u7528 Matomo API \u83b7\u53d6\u8bbf\u95ee\u6570\u636e\uff0c\u5e76\u81ea\u52a8\u751f\u6210 Apache \u5c01\u7981\u89c4\u5219\uff0c\u5b9e\u73b0 T+1 \u81ea\u52a8\u5c01\u7981\u6076\u610f IP\u3002 1. \u51c6\u5907\u5de5\u4f5c 1.1 \u83b7\u53d6 Matomo \u8bbf\u95ee Token 1. \u767b\u5f55 Matomo \u540e\u53f0\u3002 2. \u6253\u5f00 \u4e2a\u4eba \u2192 \u8bbe\u7f6e \u2192 \u5b89\u5168 \u751f\u6210\u9a8c\u8bc1\u4ee4\u724c\u3002 3. \u4fdd\u5b58 token\uff0c\u7528\u4e8e\u811a\u672c\u8c03\u7528 API\u3002 1.2 \u786e\u8ba4 Apache \u914d\u7f6e\u53ef\u7528 2. Python \u811a\u672c\u5b9e\u73b0 2.1 \u6838\u5fc3\u529f\u80fd 2.2 \u5b8c\u6574\u811a\u672c&nbsp; matomo_block.py 3. Apache \u914d\u7f6e\u8bf4\u660e 3.1 Apache \u52a0\u8f7d\u81ea\u5b9a\u4e49\u5c01\u7981\u89c4\u5219 \u4e3a\u4e86\u8ba9 Apache [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_themeisle_gutenberg_block_has_review":false,"footnotes":""},"categories":[13,1,10],"tags":[71,61],"class_list":["post-2898","post","type-post","status-publish","format-standard","hentry","category-handyscripts","category-miscellaneous","category-tutorial","tag-apache","tag-matomo"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>\u642d\u5efa\u81ea\u52a8\u5c01\u7981 WordPress \u767b\u5f55\u653b\u51fb\u7684 Matomo + Apache \u811a\u672c - \u6781\u7b80IT\uff5cSimpleIT<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.ruianding.com\/blog\/use-matomo-api-block-ips\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u642d\u5efa\u81ea\u52a8\u5c01\u7981 WordPress \u767b\u5f55\u653b\u51fb\u7684 Matomo + Apache \u811a\u672c - \u6781\u7b80IT\uff5cSimpleIT\" \/>\n<meta property=\"og:description\" content=\"\u5728\u7ba1\u7406 WordPress \u7f51\u7ad9\u65f6\uff0cwp-login.php \u5e38\u5e38\u6210\u4e3a\u653b\u51fb\u76ee\u6807\u3002\u672c\u6587\u5206\u4eab\u6211\u5982\u4f55\u5229\u7528 Matomo API \u83b7\u53d6\u8bbf\u95ee\u6570\u636e\uff0c\u5e76\u81ea\u52a8\u751f\u6210 Apache \u5c01\u7981\u89c4\u5219\uff0c\u5b9e\u73b0 T+1 \u81ea\u52a8\u5c01\u7981\u6076\u610f IP\u3002 1. \u51c6\u5907\u5de5\u4f5c 1.1 \u83b7\u53d6 Matomo \u8bbf\u95ee Token 1. \u767b\u5f55 Matomo \u540e\u53f0\u3002 2. \u6253\u5f00 \u4e2a\u4eba \u2192 \u8bbe\u7f6e \u2192 \u5b89\u5168 \u751f\u6210\u9a8c\u8bc1\u4ee4\u724c\u3002 3. \u4fdd\u5b58 token\uff0c\u7528\u4e8e\u811a\u672c\u8c03\u7528 API\u3002 1.2 \u786e\u8ba4 Apache \u914d\u7f6e\u53ef\u7528 2. Python \u811a\u672c\u5b9e\u73b0 2.1 \u6838\u5fc3\u529f\u80fd 2.2 \u5b8c\u6574\u811a\u672c&nbsp; matomo_block.py 3. Apache \u914d\u7f6e\u8bf4\u660e 3.1 Apache \u52a0\u8f7d\u81ea\u5b9a\u4e49\u5c01\u7981\u89c4\u5219 \u4e3a\u4e86\u8ba9 Apache [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.ruianding.com\/blog\/use-matomo-api-block-ips\/\" \/>\n<meta property=\"og:site_name\" content=\"\u6781\u7b80IT\uff5cSimpleIT\" \/>\n<meta property=\"article:published_time\" content=\"2025-09-02T09:27:34+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-02-07T07:10:28+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-7.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1764\" \/>\n\t<meta property=\"og:image:height\" content=\"470\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Ruian Ding\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ruian Ding\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.ruianding.com\/blog\/use-matomo-api-block-ips\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.ruianding.com\/blog\/use-matomo-api-block-ips\/\"},\"author\":{\"name\":\"Ruian Ding\",\"@id\":\"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/440d88575b7dc819a4cefc8c4199db3b\"},\"headline\":\"\u642d\u5efa\u81ea\u52a8\u5c01\u7981 WordPress \u767b\u5f55\u653b\u51fb\u7684 Matomo + Apache \u811a\u672c\",\"datePublished\":\"2025-09-02T09:27:34+00:00\",\"dateModified\":\"2026-02-07T07:10:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.ruianding.com\/blog\/use-matomo-api-block-ips\/\"},\"wordCount\":114,\"publisher\":{\"@id\":\"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/440d88575b7dc819a4cefc8c4199db3b\"},\"image\":{\"@id\":\"https:\/\/www.ruianding.com\/blog\/use-matomo-api-block-ips\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-7-1024x273.png\",\"keywords\":[\"APACHE\",\"Matomo\"],\"articleSection\":[\"HandyScripts\",\"Miscellaneous\",\"Tutorial\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.ruianding.com\/blog\/use-matomo-api-block-ips\/\",\"url\":\"https:\/\/www.ruianding.com\/blog\/use-matomo-api-block-ips\/\",\"name\":\"\u642d\u5efa\u81ea\u52a8\u5c01\u7981 WordPress \u767b\u5f55\u653b\u51fb\u7684 Matomo + Apache \u811a\u672c - \u6781\u7b80IT\uff5cSimpleIT\",\"isPartOf\":{\"@id\":\"https:\/\/www.ruianding.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.ruianding.com\/blog\/use-matomo-api-block-ips\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.ruianding.com\/blog\/use-matomo-api-block-ips\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-7-1024x273.png\",\"datePublished\":\"2025-09-02T09:27:34+00:00\",\"dateModified\":\"2026-02-07T07:10:28+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.ruianding.com\/blog\/use-matomo-api-block-ips\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.ruianding.com\/blog\/use-matomo-api-block-ips\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.ruianding.com\/blog\/use-matomo-api-block-ips\/#primaryimage\",\"url\":\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-7.png\",\"contentUrl\":\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-7.png\",\"width\":1764,\"height\":470},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.ruianding.com\/blog\/use-matomo-api-block-ips\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.ruianding.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u642d\u5efa\u81ea\u52a8\u5c01\u7981 WordPress \u767b\u5f55\u653b\u51fb\u7684 Matomo + Apache \u811a\u672c\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.ruianding.com\/blog\/#website\",\"url\":\"https:\/\/www.ruianding.com\/blog\/\",\"name\":\"Ruian's Tech Troubleshooting Toolbox\",\"description\":\"Debug the World.\",\"publisher\":{\"@id\":\"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/440d88575b7dc819a4cefc8c4199db3b\"},\"alternateName\":\"\u4e01\u777f\u5b89\u7684\u6280\u672f\u5206\u4eab\u535a\u5ba2\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.ruianding.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/440d88575b7dc819a4cefc8c4199db3b\",\"name\":\"Ruian Ding\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2023\/05\/logo.png\",\"contentUrl\":\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2023\/05\/logo.png\",\"width\":284,\"height\":284,\"caption\":\"Ruian Ding\"},\"logo\":{\"@id\":\"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"I am currently a Support Specialist at NIO, focusing on cloud-related issues for NIO Power. Previously, at Microsoft Entra ID, I specialized in identity and access management (IAM), including device registration, Windows Hello for Business (WHfB), multi-factor authentication (MFA), and single sign-on (SSO). In addition to my core expertise, I have a strong foundation in Active Directory, Servers, Cloud Computing, Network Administration, and Front-end Web Development. This diverse technical skill set enables me to effectively handle a wide range of challenges in a fast-paced IT environment.\",\"sameAs\":[\"https:\/\/www.ruianding.com\"],\"url\":\"https:\/\/www.ruianding.com\/blog\/author\/ruiand\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u642d\u5efa\u81ea\u52a8\u5c01\u7981 WordPress \u767b\u5f55\u653b\u51fb\u7684 Matomo + Apache \u811a\u672c - \u6781\u7b80IT\uff5cSimpleIT","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.ruianding.com\/blog\/use-matomo-api-block-ips\/","og_locale":"en_US","og_type":"article","og_title":"\u642d\u5efa\u81ea\u52a8\u5c01\u7981 WordPress \u767b\u5f55\u653b\u51fb\u7684 Matomo + Apache \u811a\u672c - \u6781\u7b80IT\uff5cSimpleIT","og_description":"\u5728\u7ba1\u7406 WordPress \u7f51\u7ad9\u65f6\uff0cwp-login.php \u5e38\u5e38\u6210\u4e3a\u653b\u51fb\u76ee\u6807\u3002\u672c\u6587\u5206\u4eab\u6211\u5982\u4f55\u5229\u7528 Matomo API \u83b7\u53d6\u8bbf\u95ee\u6570\u636e\uff0c\u5e76\u81ea\u52a8\u751f\u6210 Apache \u5c01\u7981\u89c4\u5219\uff0c\u5b9e\u73b0 T+1 \u81ea\u52a8\u5c01\u7981\u6076\u610f IP\u3002 1. \u51c6\u5907\u5de5\u4f5c 1.1 \u83b7\u53d6 Matomo \u8bbf\u95ee Token 1. \u767b\u5f55 Matomo \u540e\u53f0\u3002 2. \u6253\u5f00 \u4e2a\u4eba \u2192 \u8bbe\u7f6e \u2192 \u5b89\u5168 \u751f\u6210\u9a8c\u8bc1\u4ee4\u724c\u3002 3. \u4fdd\u5b58 token\uff0c\u7528\u4e8e\u811a\u672c\u8c03\u7528 API\u3002 1.2 \u786e\u8ba4 Apache \u914d\u7f6e\u53ef\u7528 2. Python \u811a\u672c\u5b9e\u73b0 2.1 \u6838\u5fc3\u529f\u80fd 2.2 \u5b8c\u6574\u811a\u672c&nbsp; matomo_block.py 3. Apache \u914d\u7f6e\u8bf4\u660e 3.1 Apache \u52a0\u8f7d\u81ea\u5b9a\u4e49\u5c01\u7981\u89c4\u5219 \u4e3a\u4e86\u8ba9 Apache [&hellip;]","og_url":"https:\/\/www.ruianding.com\/blog\/use-matomo-api-block-ips\/","og_site_name":"\u6781\u7b80IT\uff5cSimpleIT","article_published_time":"2025-09-02T09:27:34+00:00","article_modified_time":"2026-02-07T07:10:28+00:00","og_image":[{"width":1764,"height":470,"url":"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-7.png","type":"image\/png"}],"author":"Ruian Ding","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Ruian Ding","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.ruianding.com\/blog\/use-matomo-api-block-ips\/#article","isPartOf":{"@id":"https:\/\/www.ruianding.com\/blog\/use-matomo-api-block-ips\/"},"author":{"name":"Ruian Ding","@id":"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/440d88575b7dc819a4cefc8c4199db3b"},"headline":"\u642d\u5efa\u81ea\u52a8\u5c01\u7981 WordPress \u767b\u5f55\u653b\u51fb\u7684 Matomo + Apache \u811a\u672c","datePublished":"2025-09-02T09:27:34+00:00","dateModified":"2026-02-07T07:10:28+00:00","mainEntityOfPage":{"@id":"https:\/\/www.ruianding.com\/blog\/use-matomo-api-block-ips\/"},"wordCount":114,"publisher":{"@id":"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/440d88575b7dc819a4cefc8c4199db3b"},"image":{"@id":"https:\/\/www.ruianding.com\/blog\/use-matomo-api-block-ips\/#primaryimage"},"thumbnailUrl":"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-7-1024x273.png","keywords":["APACHE","Matomo"],"articleSection":["HandyScripts","Miscellaneous","Tutorial"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.ruianding.com\/blog\/use-matomo-api-block-ips\/","url":"https:\/\/www.ruianding.com\/blog\/use-matomo-api-block-ips\/","name":"\u642d\u5efa\u81ea\u52a8\u5c01\u7981 WordPress \u767b\u5f55\u653b\u51fb\u7684 Matomo + Apache \u811a\u672c - \u6781\u7b80IT\uff5cSimpleIT","isPartOf":{"@id":"https:\/\/www.ruianding.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.ruianding.com\/blog\/use-matomo-api-block-ips\/#primaryimage"},"image":{"@id":"https:\/\/www.ruianding.com\/blog\/use-matomo-api-block-ips\/#primaryimage"},"thumbnailUrl":"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-7-1024x273.png","datePublished":"2025-09-02T09:27:34+00:00","dateModified":"2026-02-07T07:10:28+00:00","breadcrumb":{"@id":"https:\/\/www.ruianding.com\/blog\/use-matomo-api-block-ips\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.ruianding.com\/blog\/use-matomo-api-block-ips\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.ruianding.com\/blog\/use-matomo-api-block-ips\/#primaryimage","url":"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-7.png","contentUrl":"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2025\/09\/image-7.png","width":1764,"height":470},{"@type":"BreadcrumbList","@id":"https:\/\/www.ruianding.com\/blog\/use-matomo-api-block-ips\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.ruianding.com\/blog\/"},{"@type":"ListItem","position":2,"name":"\u642d\u5efa\u81ea\u52a8\u5c01\u7981 WordPress \u767b\u5f55\u653b\u51fb\u7684 Matomo + Apache \u811a\u672c"}]},{"@type":"WebSite","@id":"https:\/\/www.ruianding.com\/blog\/#website","url":"https:\/\/www.ruianding.com\/blog\/","name":"Ruian's Tech Troubleshooting Toolbox","description":"Debug the World.","publisher":{"@id":"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/440d88575b7dc819a4cefc8c4199db3b"},"alternateName":"\u4e01\u777f\u5b89\u7684\u6280\u672f\u5206\u4eab\u535a\u5ba2","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.ruianding.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/440d88575b7dc819a4cefc8c4199db3b","name":"Ruian Ding","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2023\/05\/logo.png","contentUrl":"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2023\/05\/logo.png","width":284,"height":284,"caption":"Ruian Ding"},"logo":{"@id":"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/image\/"},"description":"I am currently a Support Specialist at NIO, focusing on cloud-related issues for NIO Power. Previously, at Microsoft Entra ID, I specialized in identity and access management (IAM), including device registration, Windows Hello for Business (WHfB), multi-factor authentication (MFA), and single sign-on (SSO). In addition to my core expertise, I have a strong foundation in Active Directory, Servers, Cloud Computing, Network Administration, and Front-end Web Development. This diverse technical skill set enables me to effectively handle a wide range of challenges in a fast-paced IT environment.","sameAs":["https:\/\/www.ruianding.com"],"url":"https:\/\/www.ruianding.com\/blog\/author\/ruiand\/"}]}},"_links":{"self":[{"href":"https:\/\/www.ruianding.com\/blog\/wp-json\/wp\/v2\/posts\/2898","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ruianding.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ruianding.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ruianding.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ruianding.com\/blog\/wp-json\/wp\/v2\/comments?post=2898"}],"version-history":[{"count":10,"href":"https:\/\/www.ruianding.com\/blog\/wp-json\/wp\/v2\/posts\/2898\/revisions"}],"predecessor-version":[{"id":2923,"href":"https:\/\/www.ruianding.com\/blog\/wp-json\/wp\/v2\/posts\/2898\/revisions\/2923"}],"wp:attachment":[{"href":"https:\/\/www.ruianding.com\/blog\/wp-json\/wp\/v2\/media?parent=2898"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ruianding.com\/blog\/wp-json\/wp\/v2\/categories?post=2898"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ruianding.com\/blog\/wp-json\/wp\/v2\/tags?post=2898"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}