WordPress, Permalinks, Mod_Rewrite, and Avoiding 404s

I made a mistake in changing my WordPress permalinks, but by the time I’d discovered it my blog had already been indexed. Fixing the permalinks meant breaking those indexed URLs, leading to a bad user experience, but leaving them as is wasn’t really an option.

Last night, after getting 404′d while using Google to search my own blog, I realized I had to do something.

First I looked at Apache mod_rewrite and the URL rewriting guide (as well as this cheat sheet from ilovejackdaniels), Then, frustrated, I found some items in the WordPress Codex, including this one about conflicts between .htaccess files/rules and this about problems with subdirectories inside the WordPress root.

The suggestions in both boil down to creating a specific error document:

Create a file on your website. Call it onerror.html. It can be empty or have just <html></html> in it for all that it matters.

In WordPress’s .htaccess file, add this to the top of the file:
ErrorDocument 401 /path/to/onerror.html
ErrorDocument 403 /path/to/onerror.html

The explanation, though even the poster doesn’t claim to know that it’s the correct explanation, is that the rules are additive, and WordPress is greedy with trying to get requests directed to its own URL parsing routines. The ErrorDocument is supposed to keep more of the processing in mod_rewrite.

But after all that, and only limited success achieving what I wanted, I realized that what I really wanted was not to parse requests before WordPress had a chance at them (as would happen with rewrite rules), but to handle requests that WordPress’ internal rules couldn’t match.

What I ended up doing is writing a tiny plugin that hooked into the template_redirect hook. The short of it is that if WordPress thinks it’s 404′d, and I can divine some meaning from the requested URL, then I redirect to browser (including a HTTP/1.1 301 Moved Permanently statement). Voila, it works.

wordpress, rewrite, mod_rewrite, rewrite rules, apache rewrite, permalinks, redirect, 404

11 Comments

  1. hot damn, I would like to see this.

  2. See it? It’s in use now.

    Examples

    The URL to this post
    http://maisonbisson.com/blog/post/11617/

    Some broken URLs to this post:
    http://maisonbisson.com/blog/post/11617/wordpress-permalinks-mod_rewrite
    http://maisonbisson.com/blog/post/11617/asdasdasd

  3. Can you publish your code? I’m interested in this as well.

  4. i need please a username n’ password of google earth pro

  5. Can you explain a little bit more about what you did or show some code or anything?
    I’m really interested because I’m having same kind of 404′s errors.

    Thanks in advance.

  6. Hi,

    I would like to know the code what you implemented to redirect 404 by not invoking any query, as my site is going down often due to some ips accessing non existent urls. if you can provide me the code it would be a great help for me.

  7. @smartdesis: the method discussed here likely creates additional load on the server for 404s. You might, however, be interested in this discussion: http://maisonbisson.com/blog/post/12035/wordpress-invalid-urls-extra-database-queries

  8. Hi, on my wordpress, i have searched a lot, but not found any .htaccess file there, please tell me how wordpress do mode-rewite.

  9. Thanks for the info – You totally helped me solve my problem. I spent hours on this,
    so I decided to spend 20 mins and blog about .. here’s what i did exactly
    http://chadnorwood.com/2008/12/02/wordpress-template_redirect/

  10. [...] know not to do that. There are plenty of examples of how to do the re-write if you’re using apache, but if you’re an nginx fanboy like I am, there wasn’t very much information. So to [...]

  11. [...] “WordPress, Permalinks, Mod_Rewrite, and Avoiding 404s“ [...]


Comments RSS TrackBack Identifier URI

Leave a comment

 

User contributed tags for this post:

wordpress mod_rewrite (444) - wordpress permalinks 404 (424) - wordpress permalink 404 (236) - wordpress permalinks mod_rewrite (145) - mod_rewrite wordpress (109) - wordpress mod_rewrite 404 (85) - wordpress permalinks apache (79) - wordpress mod rewrite (62) - mod_rewrite 404 redirect (61) - wordpress template_redirect (60) - wordpress permalink mod_rewrite (57) - permalinks wordpress 404 (57) - wordpress rewrite 404 (54) - wordpress 404 permalink (54) - mod_rewrite permalinks (53) - mod_rewrite leopard (50) - mod_rewrite wordpress permalinks (48) - wordpress permalink apache (48) - wordpress permalinks 403 (47) - mod rewrite wordpress (46) - permalinks mod_rewrite (44) - wordpress permalink rewrite (42) - apache permalinks (41) - wordpress permalinks mod rewrite (40) - mod_rewrite redirect 404 (39) - mod_rewrite errordocument (37) - apache mod_rewrite wordpress (37) - wordpress 404 permalinks (35) - wordpress apache rewrite (34) - wordpress permalink 403 (33) - mod_rewrite 404 (33) - wordpress 404 hook (33) - rewrite wordpress (32) - leopard mod_rewrite (31) - wordpress apache mod_rewrite (31) - wordpress subdirectory 404 (29) - wordpress 404 rewrite (29) - rewrite 404 (28) - wordpress permalinks broken (28) - wordpress 404 mod_rewrite (28) - wordpress permalinks rewrite (28) - wordpress mod_rewrite permalinks (27) - apache wordpress Permalink (27) - mod rewrite 404 redirect (26) - mod rewrite 404 (26) - wordpress apache permalinks (26) - Permalink wordpress 404 (26) - permalinks wordpress apache (23) - permalinks apache (22) - mod rewrite ErrorDocument (21) - wordpress permalink 404 error (21) - mod_rewrite wordpress (20) - apache wordpress permalinks (20) - permalinks 404 (19) - permalink 404 wordpress (19) - apache rewrite wordpress (17) - permalink apache (17) - WordPress 404 subdirectory (17) - wordpress permalinks error 404 (17) - mod rewrite avoid 404 processing (16) - permalinks mod rewrite (16) - wordpress mod rewrite 404 (16) - mod_rewrite permalinks wordpress (16) - wordpress 403 (16) - wordpress (15) - mod rewrite redirect 404 (15) - mod rewrite permalinks (15) - Wordpress permalinks 404 error (15) - mod_rewrite wordpress 404 (14) - wordpress apache2 (14) - mod_rewrite permalink (14) - wordpress permalinks without mod_rewrite (14) - mod_Rewrite 404 wordpress (14) - wordpress permalinks (13) - permalink 404 (13) - apache2 wordpress (13) - permalinks 404 wordpress (13) - wordpress mod_rewrite apache (13) - modrewrite wordpress (12) - wordpress permalink broken (12) - wordpress apache2 rewrite (12) - wordpress permalinks leopard (12) - wordpress apache permalink (12) - wordpress rewrite permalinks (12) - permalinks apache wordpress (12) - mod rewrite for wordpress (11) - mod rewrite leopard (11) - wordpress permalinks apache2 (11) - wordpress permalinks htaccess (11) - apache2 wordpress permalink (11) - wordpress template_redirect 404 (11) - template_redirect (11) - wordpress internal rewrite (10) - rewrite wordpress 404 (10) - F (10) - template_redirect wordpress (10) - wordpress apache 404 (10) - Permalinks without mod_rewrite (10) - htaccess leopard (9) - mod_rewrite .htaccess wordpress (9) - wordpress permalink mod rewrite (9) - 404 wordpress permalinks (9) - wordpress permalink apache2 (9) - permalinks wordpress 403 (9) - wordpress rewrite permalink (9) - permalink 403 (9) - rewrite permalinks (9) - mod_rewrite wordpress Permalink (9) - wordpress 2.7 permalinks broken (9) - template_redirect 404 (9) - errordocument mod rewrite (8) - apache rewrite 404 (8) - permalink wordpress apache (8) - rewrite redirect 404 (8) - mod rewrite wordpress permalinks (8) - apache2 wordpress rewrite (8) - wordpress leopard permalinks (8) - apache2 wordpress permalinks (8) - permalinks wordpress mac (8) - wordpress permalinks 404 apache (8) - wordpress 404 apache (8) - wordpress without mod_rewrite (8) - wordpress permalink error 404 (8) - permalink mod_rewrite (8) - wordpress invalid permalinks (8) - leopard htaccess (7) - wordpress rewrite (7) - apache2 rewrite 404 (7) - permalinks wordpress mod_rewrite (7) - wordpress permalink mac (7) - wordpress hook 404 (7) - permalink wordpress 403 (7) - wordpress permalink 403 error (7) - permalinks wordpress leopard (7) - wordpress permalink error 403 (7) - 404 Permalinks wordpress (7) - permalinks 403 (7) - apache permalink (7) - wordpress mod_rewrite subdirectory (7) - handle 404 with mod_rewrite (6) - wordpress 2 2 apache rewrite (6) - wordpress mod rewrite permalinks (6) - wordpress avoiding 404 google permalinks (6) - mod rewrite for wordpress permalinks (6) - wordpress modrewrite (6) - mod rewrite wordpress 404 (6) - wordpress 404 redirect (6) - wordpress rewrite apache (6) - apache2 rewrite wordpress (6) -