Redirect Priority Conflicts
-
Hello,
Running the diagnostics tool, I see that the main problems come from template_redirect priority conflicts. Since this conficts are involving many plugins, I think RankReady should adapt itself and its priority, and not asking the user to contact other plugins developers.The page I need help with: [log in to see the link]
-
Hi @editor ,
Thanks for using RankReady.
I had a look at your site, and I’m glad to say nothing seems to be conflicting there. Your llms.txt is serving correctly, the Markdown version of your homepage is serving correctly, and both discovery links are in place on your home page.
The two that come back empty, the full index and WebMCP, are switched off in your settings rather than blocked by anything.
Sorry for the confusion that warning caused. It flags anything sitting near RankReady on the same WordPress hook whether or not it’s causing trouble, so it ends up showing on almost every site. That’s on us, and we’re reworking it to only speak up when something is genuinely broken, and to stop pointing at other plugins.
So there’s nothing you need to do here. But if you have seen something actually misbehaving beyond that warning, please tell me what you noticed and I’ll look into it properly.
Thanks again for flagging it, it’s genuinely useful.
Hello,
Thanks for your reply. The llms.txt actually gave a 404 message. I turned it off, I’m currently using a code snippet and your plugin finds it. Quite strange.
I think your plugin is very promising, I hope it will be further improved in the next releases.
Mario
Hello,
The file is served through a WordPress rewrite rule rather than a real file on disk, so a few things can make it 404: the rules going stale, permalinks set to Plain, or your host caching the 404 before the rules got refreshed.
Your site sits behind a page cache, so that last one would explain why it looked permanent.
I can’t tell which it was from outside. If RankReady is still installed, go to Settings → Advanced → Diagnostics, hit Run Diagnostics, then Copy Diagnostic Report and paste it here.
That covers all three. Leave your snippet running, it won’t affect the result.
One heads up before you do: that report lists your plugins and versions, so trim anything you’d rather not have in a public thread.
Thanks for the patience, and for the kind words.
╔══════════════════════════════════════════════════════════════════════╗
║ RankReady Diagnostic Report — Support Bundle ║
╚══════════════════════════════════════════════════════════════════════╝Generated: 2026-09-23 18:26:25 UTC
Site URL:
Plugin: RankReady 1.3.1
WordPress: 7.1.2
PHP: 8.4.25 (SAPI: fpm-fcgi)
MySQL: 11.8.9
Theme:
Server: nginx
Multisite: no
HTTPS: yes
Permalinks: /%year%/%monthnum%/%day%/%postname%/
WP_DEBUG: false WP_DEBUG_LOG: falseSummary: 11 pass · 1 warn · 3 fail · 8 info
═══ PROBE RESULTS ═════════════════════════════════════════════════════════
ℹ INFO /llms.txt loads
Toggle is OFF in AI Visibility → LLMs.txt.
FIX → Enable LLMs.txt to expose your site index to AI engines.ℹ INFO /llms-full.txt loads
Requires LLMs.txt to be enabled (it’s OFF).
FIX → Enable AI Visibility → LLMs.txt first.✗ FAIL Homepage .md route
HTTP 200 but Content-Type is text/html; charset=UTF-8 (HTML returned).
FIX → Theme template is winning. Add ?format=md to URL as a workaround.
(url: )
(content_type: text/html; charset=UTF-8)✗ FAIL Post .md route
HTML returned instead of Markdown.
FIX → Page builder intercepting. Check template_redirect priority conflicts.
(url: )
(content_type: text/html; charset=UTF-8)✓ PASS /robots.txt has RankReady block
RankReady block present with crawler directives.
(url: https://…./robots.txt)
(body_len: 1486)ℹ INFO /.well-known/mcp.json loads
WebMCP toggle is OFF.
FIX → Enable AI Visibility → WebMCP Manifest to expose 16 abilities to Claude/Cursor/VS Code.✓ PASS Rewrite rules flushed
107 rewrite rules registered.ℹ INFO Webserver detected
Nginx — Nginx requires server-block configuration (no .htaccess support). RankReady ships an Nginx snippet via the “Server bypass snippet” section below. The standard WP server block “try_files $uri $uri/ /index.php?$args;” rule is required for REST routes.
(family: nginx)
(server_software: nginx)
(recommended_snippet: nginx)✗ FAIL REST API reachable (loopback)
HTTP 401 from https://xxxxxxxx/wp-json/rankready/v1 — REST API is not routing. Diagnostics + bulk operations + freshness scan will fail until this resolves.
FIX → Visit Settings → Permalinks → Save (rewrites .htaccess on Apache/LiteSpeed). On Nginx, add the “Server bypass snippet → Nginx” block from below to your server config.
(url: https://xxxxxxxx/wp-json/rankready/v1)
(code: 401)✓ PASS Cron firing
31 events scheduled (WP-Cron). None overdue.✓ PASS Crawler log DB table
Table exists, 1,892 rows logged.
(table: wp_3878964_rnrd_crawler_log)
(rows: 1892)✓ PASS WP Abilities API (6.9+)
wp_register_ability() is available — MCP uses native registration.✓ PASS Page cache plugin
Perfmatters — RankReady bypass rules appliedℹ INFO Page builder
No major page builder detected.✓ PASS SEO plugin
xxxxxx detected. Schema merging active, double meta-robots tag prevented.
(plugin: xxxxxxx)ℹ INFO Cache constants
WP_CACHE = true; DONOTCACHEPAGE = defined; DISABLE_WP_CRON = falseℹ INFO Edge cache HIT scan
/llms.txt is disabled; skipped.✓ PASS Markdown endpoint (/index.md)
Markdown is served at the distinct /index.md URL (cache-safe path). Same-URL Accept negotiation is off by default — the canonical homepage correctly returns HTML, so no cache can be poisoned. AI agents discover /index.md via the Link header and llms.txt.
(content-type: text/markdown; charset=utf-8)⚠ WARN template_redirect priority race
5 competing hook(s) at priority ≤ 5: priority 0: _wp_admin_bar_init; priority 0: xxxxxxx\Extension\Origin_go; priority 1: xxxxxx_opengraph_meta_tags
FIX → If /llms.txt or /.well-known/mcp.json returns HTML, ask the conflicting plugin to lower its template_redirect priority below 1. RankReady cannot go any earlier.✓ PASS Brand Identity filled
All 3 core fields are populated (name, summary, about).✓ PASS PHP version
PHP 8.4.25✓ PASS WordPress version
WordPress 7.1.2ℹ INFO LLM provider keys
Not tested — click “Test API keys” to verify reachability (uses 1 API call per provider).═══ WHAT TO FIX FIRST (plain English) ═════════════════════════════════════
- Homepage .md route
What we saw: HTTP 200 but Content-Type is text/html; charset=UTF-8 (HTML returned).
What to do: Theme template is winning. Add ?format=md to URL as a workaround.
Why it matters: AI bots request your homepage with Accept: text/markdown. If you return HTML, they parse it inefficiently or skip you. - Post .md route
What we saw: HTML returned instead of Markdown.
What to do: Page builder intercepting. Check template_redirect priority conflicts.
Why it matters: Each post needs a .md route so AI bots can grab clean Markdown instead of parsing your full HTML/JS bundle. - REST API reachable (loopback)
What we saw: HTTP 401 from https://xxxxxxx/wp-json/rankready/v1 — REST API is not routing. Diagnostics + bulk operations + freshness scan will fail until this resolves.
What to do: Visit Settings → Permalinks → Save (rewrites .htaccess on Apache/LiteSpeed). On Nginx, add the “Server bypass snippet → Nginx” block from below to your server config.
Why it matters: See the FIX line above for the action to take.
═══ LIVE ENDPOINT RESPONSE HEADERS ════════════════════════════════════════
(What an AI crawler actually sees when it fetches each URL right now.)── GET /llms.txt ──
HTTP status: 200
Body bytes: 19264
server: cloudflare
content-type: text/plain; charset=utf-8
cache-control: public, max-age=3600, s-maxage=300
cf-cache-status: DYNAMIC
link: ; rel=”alternate”; type=”text/markdown”, ; rel=”describedby”; type=”text/plain”── GET /llms-full.txt ──
HTTP status: 404
Body bytes: 100474
server: cloudflare
content-type: text/html; charset=UTF-8
cache-control: no-cache, must-revalidate, max-age=0, no-store, private
cf-cache-status: DYNAMIC
link: ; rel=”alternate”; type=”text/markdown”, ; rel=”describedby”; type=”text/plain”
Body preview: Pagina non trovata | xxxxxxxx <!– Jetpack Site Verification Tag── GET /robots.txt ──
HTTP status: 200
Body bytes: 1486
server: cloudflare
content-type: text/plain; charset=utf-8
age: 41
cf-cache-status: HIT
link: ; rel=”alternate”; type=”text/markdown”, ; rel=”describedby”; type=”text/plain”
Body preview: User-agent: * Disallow: /wp-admin/ Allow: /wp-admin/admin-ajax.php User-agent: AhrefsBot User-agent: AhrefsSiteAudit User-agent: barkrowler User-agent: DataForSeoBot User-agent: dotbot User-agent: rogerbot User-agent: S── GET /.well-known/mcp.json ──
HTTP status: 503
Body bytes: 30
server: cloudflare
content-type: application/json; charset=utf-8
cache-control: no-cache, must-revalidate, max-age=0, no-store, private
cf-cache-status: DYNAMIC
link: ; rel=”alternate”; type=”text/markdown”, ; rel=”describedby”; type=”text/plain”
Body preview: {“error”:”WebMCP is disabled”}═══ PHYSICAL FILES IN WEBROOT ═════════════════════════════════════════════
(These trump WordPress rewrite rules. A physical robots.txt wins at the
webserver level before WP even runs.)
robots.txt (not present) /wordpress/core/7.1.2/robots.txt
llms.txt (not present) /wordpress/core/7.1.2/llms.txt
llms-full.txt (not present) /wordpress/core/7.1.2/llms-full.txt
.htaccess (not present) /wordpress/core/7.1.2/.htaccess═══ REWRITE RULES MATCHING llms.txt / robots / .md / mcp ══════════════════
^(?!wp-admin|wp-content|wp-includes|wp-json)(.+)\… → index.php?rnrd_md_path=$matches[1]
robots.txt$ → index.php?robots=1═══ HOOKS ON
robots_txtFILTER (priority order, lower = earlier) ════════
priority 10 SEO\RobotsTXT\Main::get_robots_txt
priority 12 Automattic\Jetpack\Jetpack_Mu_Wpcom\Blog_Privacy\robots_txt
priority 9223372036854775807 RNRD_Robots::add_to_robots_txt═══ HOOKS ON
template_redirect(early priorities only — these race for /llms.txt etc.) ═
⚠ priority 1 xxxxxx_opengraph_meta_tags
⚠ priority 1 Automattic\Jetpack\Stats\Main::template_redirect
⚠ priority 1 wpcom_handle_post_like_from_email
✓ priority 1 RNRD_Llms_Txt::handle_request
✓ priority 1 RNRD_Markdown::handle_request
✓ priority 1 RNRD_MCP::handle_request
⚠ priority 1 Closure@20-llms-txt.php:140
⚠ priority 2 Closure@atomic-platform-virtual-patches.php:28267
✓ priority 2 RNRD_Markdown::handle_accept_headerLegend: ✓ = RankReady (expected), ⚠ = other plugin/theme racing us
═══ SEO PLUGIN ACTUAL CONFIG (what RankReady defers to vs. takes over) ════
xxxxxxx
• schema_enabled managed by (default ON when active)═══ CACHE PLUGIN EXCLUSION STATUS ═════════════════════════════════════════
xxxxxx unknown — RankReady applies exclusion filters but cache plugin doesn’t expose verification API═══════════════════ End Diagnostic Report ═══════════════════
Here it is. Please consider I’m on a wordpress.com Business Plan, with their own edge cache. I’m also on Cloudflare
Thanks @editor, that report clears it up.
The
llms.txt/llms-full.txt404s as RankReady’s ownllms.txtoutput is turned off on this setup, and the snippet is answering instead, so there’s nothing to fix there.The real findings are the two FAILs around the homepage and post
.mdroutes returning HTML. From what I understand, this isn’t a RankReady bug.The site is on WordPress.com Business behind Cloudflare, and Cloudflare doesn’t vary its cache by the
Acceptheader by design. So same-URL content negotiation can’t reliably work in this setup.The good news is that it isn’t actually needed here. The report shows that
/index.mdis already passing with the correct Markdown content and content type. That’s the distinct, cache-safe URL RankReady points AI crawlers to through theLinkheader on every page, so it looks like the setup is already working as intended.The REST 401 and priority warning also appear to be the same cosmetic issues mentioned earlier.
-
This reply was modified 1 week, 2 days ago by
Aditya Ranjan Sharma.
Good news, then, thanks!
- Homepage .md route
You must be logged in to reply to this topic.