Permalinks are the addresses of your posts and pages. WordPress generates them from a pattern you choose, and the server has to be told how to route them, which is where the problem everybody eventually hits comes from.
The symptom is unmistakable: the homepage works, and every other page returns a 404.
Why the homepage works and nothing else does
A URL like /2026/08/my-post/ does not correspond to a directory on disk. There is no my-post folder. The server looks for one, does not find it, and returns 404.
WordPress solves this with a rewrite rule in .htaccess that says: if the requested path is not a real file or directory, hand the request to index.php and let WordPress work out what was meant.
The homepage is the exception because it maps directly to index.php anyway. So when the rewrite rule is missing, the homepage keeps working and gives the misleading impression that WordPress is fine.
The rule that has to be there
Open .htaccess in the WordPress directory. This block must be present:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
The two RewriteCond lines are the important part. They say "only do this if the request is not a real file and not a real directory", which is what keeps images and stylesheets loading normally instead of being swallowed by WordPress.
If the block is missing, WordPress will write it for you: go to Settings → Permalinks and press Save without changing anything. That is not a superstition, saving that screen is what triggers WordPress to regenerate the rules.
When saving permalinks does not fix it
Two causes, both about the file rather than WordPress.
The file is not writable. WordPress then shows the rules on the Permalinks screen and asks you to paste them in yourself. People miss that message and assume the save worked.
The file does not exist. .htaccess starts with a dot, so File Manager hides it until you turn on hidden files. Directory indexes and hidden files walks through switching that on. An FTP client may hide it too.
Create it if it is not there, put the block above in it, and set permissions to 644.
Choosing a structure
Under Settings → Permalinks you pick the pattern. The choice matters more than it appears, because changing it later changes every URL on the site.
Post name: /my-post/. Short, readable, and right for almost every site. This is the default recommendation and the one to pick unless you have a specific reason not to.
Day and name, /2026/08/19/my-post/. Makes sense for a news site where the date is part of the identity. On an evergreen site it makes articles look stale.
Month and name. The same trade-off, slightly shorter.
Numeric: /?p=123 or /archives/123. Tells neither a visitor nor a search engine anything. Avoid.
Changing the structure on a live site
This is the part people underestimate. Switching from one pattern to another changes the address of every post at once.
Every inbound link, every bookmark and every indexed URL now points at an address that does not exist. WordPress handles some of this with its own guessing, and that behaviour is not something to rely on across hundreds of URLs.
If you must change it, set up redirects from the old pattern to the new one at the same time, not afterwards. Redirecting a domain or page deals with the mechanics, and a pattern-to-pattern move is exactly what RedirectMatch is for.
On a site that has been running for years, the honest advice is usually to leave it alone. The gain from a tidier URL rarely exceeds the cost of moving every address you have.
Post slugs
The slug is the per-post part of the URL, and you can edit it on the post itself.
Keep it short and descriptive. WordPress generates it from the title, which means a long title produces a long slug carrying words that add nothing: strip out "a", "the", "how to" and the rest.
Change a slug only before publishing. After publishing, it is a live address, and editing it breaks every link to it unless you add a redirect.
Category and tag bases
The same screen sets the prefix for category and tag archives, /category/news/ by default.
You can shorten or change these. Removing the prefix entirely is possible with a plugin and creates a real risk: a category called services and a page called services then compete for the same address, and which one wins is not something you control.
Leaving the default is the safe answer here.
Checking it actually works
Test three kinds of address, because a broken rule can affect one and not the others.
A single post. A category archive. And a paginated page, /page/2/, which is the one most often broken by a partially correct rule.
Then check that images still load. If a rewrite rule is missing the two conditions above, WordPress starts intercepting requests for real files and the site loses its stylesheets.
If you are behind a caching layer
A 404 that persists after you fixed the rules is often a cached 404 instead of a live one. Purge the cache and check again in a private window before continuing to investigate. Fixing common WordPress errors explains separating cached symptoms from real ones.
Changing a permalink structure changes every address the site has published. How to Plan Redirects for a WordPress Redesign goes into doing that without losing the traffic.