Why WordPress Can’t Handle site.com/%postname%/someword ? Gives 404

Everything after the ? is considered part of the query string. Everything before the ? is part of the pretty permalinks, aka rewrite rules.

Rewrite rules are then processed to generate query variables. These are then plugged into a query ( which powers the main loop ), and a template is loaded based on this query.

The parameters that come after the ? in the URL can be used to add new query vars, or just plain GET variables.

So sitename.com/123/wrong-words?some=params&etc=etc is actually just sitename.com/123/wrong-words as far as the rewrite rule system is concerned. Rewrite rules are also powered by regular expressions, and the regular expression used to match a blog post, depends on how your pretty permalinks are configured.

Because of this, the same data is extracted from sitename.com/123/correct-full-postname and sitename.com/123/correct-full-postname/somemistakeword/, and since the only difference is a slash, they’re considered equivalent. Some processing of the URL may also take place, and there is a canonical URL redirection routine which is quite complicated, and large in scope in WP Core.

As for why sitename.com/123/correct-full-postname/somemistakeword doesn’t redirect to sitename.com/123/correct-full-postname, this is because they aren’t the same, there is no post at sitename.com/123/correct-full-postname/somemistakeword. There are rewrite rules that would pick up sitename.com/123/correct-full-postname/2 aka page 2 of that post, and other specific endpoints such as sitename.com/123/correct-full-postname/feed etc

But if we implemented such a feature, it would not be so simple, for example, what would happen if we visit this page:

sitename.com/parentpage/childpage

Would it:

  • Show you child page
  • Redirect you to parentpage
  • 404

As a sidenote, I have a blog post at:

http://tomjn.com/2015/05/07/escaping-the-unsecure/

If I remove the trailing slash, it redirects to the version with the trailing slash. If I append random characters to the end, I get a 404 as expected

Leave a Comment