Administrator comparing a printed sitemap outline with a muted forum thread list on a widescreen monitor

Search engines already know how to crawl a forum. XenForo’s job is to stop hiding the threads behind index.php?, to hand Google a sitemap that matches the live tree, and to ping IndexNow when a post actually changes. That is the 2026 setup. It is not a bag of meta-description add-ons and it is not a Core Web Vitals rebuild.

This is not the speed and Core Web Vitals article. That one owns guest page cache, Symfony Cache, WebP, Gzip, and the hour when TTFB is the ranking problem. This one owns Setup → Options → Search engine optimization (SEO) and Setup → Options → XML sitemap generation. Wiring Google Analytics 4 and Search Console is a later article. Do not wait for it to flip friendly URLs.

Official sources: the XenForo 2 manual pages Friendly URLs (docs.xenforo.com/manual/configuration/friendly-urls) and Search engine management (docs.xenforo.com/manual/configuration/seo). Where this article names a checkbox, it is on those pages or on the matching ACP option group. Where the manual is silent — per-thread meta descriptions, title templates, an ACP robots.txt editor — this article stays silent too.

What “SEO” means on a XenForo board

A forum is a pile of URLs that grow every time someone hits Post. Google does not need a marketing landing page to find /threads/how-do-i-reset-permissions.18421/. It needs three things:

  1. A URL it can fetch without index.php?. Friendly URLs.
  2. A list of the URLs you actually want indexed. The XML sitemap, plus Extra sitemap URLs for pages the generator will not invent.
  3. A hint when a URL changed. IndexNow, on top of the sitemap crawl.

Everything else that people call “forum SEO” is either content (a thread that answers a real query) or performance (the CWV article). XenForo does not ship a keyword planner. It ships rewrite rules and a sitemap job.

Two official switches live under Setup → Options → Search engine optimization (SEO):

Option Off On
Use full friendly URLs /index.php?threads/thread-title-here.12345/ /threads/thread-title-here.12345/
Include content title in URLs /threads/12345/ /threads/thread-title-here.12345/

Official default: friendly URLs are off, because they need web-server help. Leave them off on a box you have not configured and the front end 404s while the ACP still loads. Official note, do not skip it: if friendly URLs are broken, the admin control panel remains accessible. Fix the rewrite, then come back.

Leave Include content title in URLs on unless you have a reason to hide keywords. Official wording: turning it off makes URLs “much shorter, but less friendly to humans as no keywords will be included.” The numeric ID is still the address XenForo routes on. Rename a thread and the slug updates; the .12345 does not. That is why old links keep working after a title edit. Official docs do not spell that last sentence. The URL shape they print does.

Flip the two switches, then prove the rewrite

Do not enable Use full friendly URLs on production until you can load a thread, a member profile, and /admin.php in a private window. The ACP path is Setup → Options → Search engine optimization (SEO). The option group is the one the friendly-URL manual names as Options → Search engine optimization (SEO). Same screen.

Apache

Apache is the case XenForo ships a file for. Official: after upload, if you do not see .htaccess in the XenForo root, rename htaccess.txt to .htaccess (keep the leading dot). Then enable friendly URLs.

If the board then fails to load, official next step is not “install an SEO add-on.” Contact the host and confirm:

  • mod_rewrite is installed
  • AllowOverride lets .htaccess actually run

That is the whole Apache story in the manual. LiteSpeed reads the same Apache configuration, including .htaccess. Official: use the Apache instructions on LiteSpeed.

IIS 7

Official: put their web.config snippet in the XenForo root. Three rewrite rules: leave real files and directories alone, leave data|js|styles|install alone, rewrite everything else to index.php. Plus httpErrors existingResponse="PassThrough". Do not invent a fourth rule. Copy the official block.

Nginx

Nginx does not read .htaccess. Official configuration uses try_files and then protects directories that must not be web-reachable. The sample is written for an install in /xf/. Official instruction: change every /xf/ path to match your installation. A board in the domain root uses / and /index.php?$uri&$args, not /xf/.

Official locations marked internal:

  • install/data/
  • install/templates/
  • internal_data/
  • library/ (legacy)
  • src/

That last pair is security, not SEO, but it sits in the same snippet because a friendly-URL try_files that blindly maps unknown paths into PHP is how people expose internal_data. Official sentence: “This configuration also helps protect web-based access to directories that aren’t normally accessible.” Do not skip the internal blocks to “make SEO work.”

The PHP location in the official example is a \.php$ block with try_files $uri =404; and fastcgi_pass 127.0.0.1:9000. Your socket or port may differ. That is host configuration, not a XenForo option.

Lighttpd

Official: load mod_rewrite and use their url.rewrite map (leave data|install|js|styles and *.php alone, send the rest to /index.php). Rare on a 2026 VPS. Mentioned so you do not invent a fourth server family.

Which server are you actually on?

If you do not know, do not guess Nginx and paste try_files into a file Apache will ignore. Official friendly-URL page: “If you are unsure what web server you are running, it is likely Apache.” That is still the right first bet on cPanel-style shared hosting. A VPS you built with a “LEMP” image is Nginx. LiteSpeed announces itself in response headers (server: LiteSpeed) and still wants the Apache .htaccess file.

Worked check, in order:

  1. Look in the XenForo root for .htaccess or htaccess.txt. On Apache/LiteSpeed that file is the rewrite. On Nginx it does nothing.
  2. Ask the host or read the vhost. Nginx config lives in a server { } block, not in the board directory.
  3. Enable friendly URLs on a clone first if the live board is already indexed on /index.php? URLs. Official docs do not ship a bulk normalizer. A clone lets you see whether old index.php? links still resolve after the option is on — they usually do — before you do it in public.
  4. Only then flip the option on production and hit a thread, a member, and /admin.php in a private window.

A managed XenForo host often enables friendly URLs for you and already dropped .htaccess or the Nginx map in place. Still confirm. “The host said it is on” is not a 200 from Googlebot.

What a crawler actually requests

Once friendly URLs work, a guest request looks like a static path. XenForo still runs PHP. The rewrite only hid index.php. That is why guest page cache still matters for TTFB, and why this article will not pretend a slug is a cache.

Useful mental model:

URL Who uses it
/threads/reset-permissions.18421/ Humans, Google, your sitemap
/threads/18421/ Same thread if titles are off
/index.php?threads/reset-permissions.18421/ Fallback when friendly URLs are off
/admin.php You. Official: still works if rewrites fail

Do not also publish the index.php? form on purpose. One canonical shape. XenForo’s public pages already emit the friendly form once the option is on. Official docs do not document a separate “canonical URL format” checkbox on that SEO screen. They document the two options above. Stop there.

A portal homepage or a campaign landing is still just a route. If you pointed Index page route at a page node, that URL is the thing Google will treat as /. The configuration mistakes article already covered an index route that ate forum-list widgets. SEO consequence: the forum list may no longer be the root URL. Put the old forum list somewhere a human can still find, and add that URL to Extra sitemap URLs if the generator does not include it.

XML sitemap generation

Official search-engine chapter: a sitemap is “essentially a list of all the pages from your site that you want search engines to include.” XenForo builds one.

Path: Setup → Options → XML sitemap generation.

Official controls on that page:

  • How the sitemap is built
  • Which content types are included
  • Whether the sitemap is automatically submitted to Google
  • Extra sitemap URLs — additional URLs you want inside the generated sitemap

That is the official list. The public page does not print every checkbox label for every content type. It names the group. Include the types that are public threads, forums, and pages you actually want indexed. Do not include a staff-only node and then wonder why Search Console fetches a login wall. Private nodes are a permissions problem, not a sitemap bug.

Extra sitemap URLs is the official escape hatch for things the job will not invent: a WordPress blog on a subdomain you still want listed (only if it is really the same property — usually it is not), a static /status page, a page node that is not in the default content-type set. Put full URLs. One per line if the field is a list; official wording is “list additional URLs.” Do not paste a third-party sitemap index and hope XenForo merges the XML.

Automatically submit to Google is the official ping. It is not a Search Console property. It tells Google “there is a sitemap here.” You still add the property and paste the sitemap URL on Google’s side. That wiring is the later analytics article. For this article: turn the XenForo auto-submit on, then confirm the sitemap URL loads as XML in a private window.

Typical sitemap URL on a friendly-URL board is a path under the board root (community threads usually cite /sitemap.php or a /sitemap.xml route XenForo serves). Official SEO page does not print the public filename. Confirm it on your board: view source of a public page or fetch the URL the ACP mentions after you save. If you cannot load it logged out, Google cannot either.

A large board will emit a sitemap index that points at split files. That is normal sitemap spec behaviour (50,000 URLs / 50 MB per file). Official XenForo page does not walk the split. Google’s Sitemaps report does. Submit the index URL, not every child, unless XenForo only exposes one file.

The official sitemap option group does not document a “Rebuild sitemap now” button on the public page cited here. If your ACP shows a tools rebuild for sitemaps, treat it as a Tools cache rebuild, not a missing SEO checkbox. After you change content types or Extra sitemap URLs, fetch the public sitemap URL again logged out. If the XML still lists a content type you unchecked, wait for the generation job and fetch again. Do not invent a cron name the manual does not print.

Content types, practically. Include public threads and forums. Include pages if you use page nodes as a handbook. Exclude anything whose View node is staff-only or paid-only. A sitemap that lists URLs Google cannot fetch is how the Page indexing report fills with “Crawled — currently not indexed” and login-walled addresses. That is not a Google penalty story. It is a list you handed them.

Thread URLs after a rename, a move, or page two

Official examples all keep the numeric ID at the end: thread-title-here.12345. That ID is the stable object. The hyphenated title is decoration for humans and for the snippet.

What that means in operations:

  • Rename the thread. The slug in new links changes. The .12345 does not. XenForo still serves the thread at the new slug. Official SEO pages do not document a 301 table for old slugs. In practice the ID is what the router needs; do not “fix SEO” by creating a second thread with a cleaner title.
  • Move the thread to another forum. The thread URL pattern official docs print is /threads/…, not /forums/forum-name/threads/…. A move should not invent a new public address. If an add-on changed that, name the add-on.
  • Page two of a long thread. Official SEO chapter does not document a separate pagination option. XenForo paginates; the sitemap’s job is to list content, not every page-2 variation as a unique essay. Do not noindex page two because a general SEO blog said “paginated URLs are duplicates.” The conversation continues there.
  • Prefixes and sort tabs. /forums/support/?order=post_date is a filter, not a new article. Official SEO options do not offer a “noindex sort URLs” matrix. Do not paste noindex into a forum template to chase that. Fix crawl noise in Search Console’s Page indexing report later, with evidence.

If you pointed Index page route at a portal or a landing page, / is that page. Add the real forum list to Extra sitemap URLs if it is no longer the root and the generator does not list it. Members still need a path that is not a marketing hero.

IndexNow

Official: IndexNow “provides a way for your site to instantly and directly inform search engines about your latest content changes” so they can “prioritize refreshing those pages in their index.”

Official enable path: Setup → Options → Search engine optimization (SEO) → IndexNow.

That is the entire XenForo side. One toggle. Further reading the manual names is IndexNow.org. Do not invent a per-node IndexNow checkbox or a “ping Bing only” switch. The core option is on or off.

IndexNow is not a replacement for the sitemap. Official framing: it goes “a step beyond building an XML sitemap.” Keep both. The sitemap is the census. IndexNow is the doorbell.

When to leave it off: a staging clone that must not be indexed. If the clone has a public hostname, IndexNow plus a live sitemap is how you accidentally teach Bing about staging.example.com. Close the board or noindex the vhost first. Official SEO pages do not document a staging mode. Hosting and Board URL hygiene live in the mistakes article.

What this screen does not do

Say it plainly, because this is where people buy add-ons.

The official SEO option group, as documented, does not give you:

  • A per-thread meta description editor
  • A page-title template with {thread} tokens
  • An ACP robots.txt editor
  • A “noindex this prefix” matrix
  • Open Graph overrides per node
  • Schema.org thread markup as a named core feature

If your ACP shows extra fields, they came from an add-on. Name the add-on in the staff notes. Do not write them into a “XenForo SEO” runbook as if they were stock 2.3.

XenForo still prints a <title> from the content title and the board title. It still emits a description-ish snippet from the content for some pages. Official SEO chapter does not document those templates. Do not retune them in PAGE_CONTAINER to chase a SERP. You will merge that template on every upgrade.

Robots: if you need to block /account/ or a staging host, that is a web-server or robots.txt file on disk. Official friendly-URL and SEO pages do not provide an ACP editor for it. A wrong Disallow: / is an outage you will not see from inside the board.

noindex on a thank-you page or a filter-and-sort URL is a later content problem. Do not noindex the thread list because a YouTube video said “forums duplicate content.” The thread is the content.

Content Google will actually rank

Friendly URLs get you into the index. They do not write the post.

A XenForo thread that ranks in 2026 looks like a tutorial, not a bump:

  • A title that is the query (Analyze permissions for one user, not Help??)
  • A first post that answers in the first paragraph
  • Updates in the same thread, not a new thread every month
  • A page node or help page when the answer is staff canon, not a 40-page argument

The engagement article is about people coming back. SEO is about the one visitor who has never registered. Those two visitors want the same first screen: the answer, not a slider.

A news / announcements homepage can rank for brand + “update” queries. A landing page can rank for the campaign term you bought. Neither replaces the thread sitemap. Do not 301 every Google hit to a marketing page. That is how you lose the long tail the forum was built to own.

Internal links are just XenForo quotes, “similar threads,” and a widget you already configured. The widgets article owns the block. This article only needs you not to nofollow your own thread list.

Speed is a ranking input. It is not this checklist.

Google’s Core Web Vitals are real. A guest thread that paints in 4 seconds will lose to a page that paints in 1, even with a prettier slug.

Do the SEO options first (they are free and they do not need Redis). Then open the performance article and do guest page cache, icon sprites, and “do not let Cloudflare minify 2.3’s JavaScript.” Do not paste a PageSpeed score into this runbook. A logged-in moderator session will never look like a guest crawl.

2.3 already dropped jQuery, added style variations, and converts uploads to WebP. Stay on 2.3. SEO advice written for 1.5 rewrite maps does not apply.

Own-goals that look like “Google hates forums”

Friendly URLs on, rewrite off. Guests get 404. Googlebot gets 404. You still have an ACP. Official warning, and still the most common ticket.

Titles off “for cleanliness.” /threads/12345/ ranks worse as a human result and gives you nothing in the snippet. The ID was never the secret.

Sitemap includes a private Staff room. Search Console fetches it, gets a login or a soft 404, and you spend a week “fixing SEO” instead of unchecking a content type or fixing node permissions.

Two hostnames. www and apex, http and https, Board URL pointing at the old host after a move. Crawlers split the index. Fix the canonical host at the vhost and in XenForo’s Board URL. The mistakes article owns cookie path and Board URL. This article only needs one public origin.

Worked example: the board answers on both https://example.com and https://www.example.com. Friendly URLs work on both. The sitemap emits whichever Board URL you saved. Google indexes both hosts for the same thread IDs. You then “fix SEO” by submitting a second sitemap. Stop. Pick one host. 301 the other at the vhost (or the host panel). Set Board URL to the winner. Fetch the sitemap. It should contain only that origin. Then, in the later analytics article, the Search Console property must be that same origin. Two prefix properties are how people double-count clicks for a year.

IndexNow on a clone. Covered above. Staging is not a search engine.

Buying an “SEO suite” to replace these four options. If the add-on only writes meta tags you could have left alone, it is a merge liability. If it rewrites URLs on top of XenForo’s router, it is a 404 generator.

Chasing /index.php links in old signatures. After you enable friendly URLs, old index.php? links usually still resolve. Do not run a sitewide 301 add-on until you have seen a real crawl report. Official docs do not ship a bulk URL-normalizer.

A first-hour setup that is enough for 2026

  1. Confirm Board URL is the https origin you want in the SERP.
  2. On Apache/LiteSpeed: .htaccess exists (rename htaccess.txt if needed). On Nginx: try_files plus internal on internal_data/ and src/. On IIS: official web.config.
  3. Setup → Options → Search engine optimization (SEO): enable Use full friendly URLs. Enable Include content title in URLs.
  4. Private window: open a thread, a forum, a member profile, /admin.php. All four must load.
  5. Setup → Options → XML sitemap generation: include public content types, add Extra sitemap URLs for any page node the job misses, enable auto-submit to Google.
  6. Load the sitemap URL logged out. It must be XML, not a login page.
  7. Enable IndexNow on the SEO options screen. Skip this on staging.
  8. Stop. Do not edit templates. Do not install an SEO add-on. Come back with Search Console data in the later analytics article, and with TTFB numbers in the CWV article.

Ongoing: what you actually maintain

The options do not need a weekly ritual. The content does.

  • When you add a public page node that should rank, add it to Extra sitemap URLs if it does not appear after the next sitemap rebuild.
  • When you add a private node, confirm it is not in a content type you are submitting as public, and confirm guests cannot View node.
  • When you rename the board or move hosts, re-test friendly URLs and the sitemap URL before you tell Google anything.
  • When a thread is the canonical answer, leave it. Merge duplicates into it. Do not start a fresh “2026 version” thread unless the old one is wrong.

Moderation that helps SEO is just moderation: merge, move, prefix, do not let a spam flood create 400 thin URLs overnight. The sitemap will faithfully list them if you let them exist.

Onboarding that helps SEO is a first-post quality bar, not a keyword worksheet. A new member who titles a thread like a search query is worth more than a rewrite plugin.

Checklist

  • HTTPS origin matches Board URL
  • htaccess.txt.htaccess (Apache/LiteSpeed), or official Nginx/IIS rewrite in place
  • Nginx internal on internal_data/, src/, install data/templates
  • Use full friendly URLs = on, and a guest can load a thread
  • Include content title in URLs = on
  • Sitemap option group includes only public content types
  • Extra sitemap URLs lists page nodes / static URLs the job skips
  • Auto-submit to Google = on (production only)
  • Sitemap URL returns XML to a logged-out client
  • IndexNow = on (production only)
  • No SEO add-on until these core options are proven
  • Performance work tracked in the CWV article, not here
  • Analytics / Search Console property left for the later article

Takeaways

  • Official 2.3 SEO is two option groups: Search engine optimization (SEO) and XML sitemap generation.
  • Use full friendly URLs needs a working rewrite. Official: ACP still loads if you get this wrong.
  • Include content title in URLs is the difference between /threads/12345/ and a URL a human will click.
  • Apache: rename htaccess.txt.htaccess, need mod_rewrite + AllowOverride. LiteSpeed: same. Nginx: try_files and protect internal_data / src.
  • The sitemap is the census. Extra sitemap URLs is the official hook for pages the generator will not invent.
  • IndexNow is one toggle on the SEO screen. It is not a sitemap replacement.
  • Official docs do not ship a meta-description studio. Do not invent one in a template.
  • Speed still ranks. It is a different article.

Flip the rewrites. Ship the sitemap. Write threads that answer the query. Everything after that is measurement.