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

Related:

7 Comments

  1. Comment by jessamyn on April 20, 2007 1:44 am

    hot damn, I would like to see this.

  2. Comment by Casey on April 20, 2007 10:46 am

    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. Comment by Mojo on May 9, 2007 12:39 am

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

  4. Comment by Yo on June 5, 2007 10:41 am

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

  5. Comment by kike on January 11, 2008 10:46 am

    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. Comment by smartdesis on January 19, 2008 9:22 pm

    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. Comment by Casey on January 21, 2008 9:21 am

    @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

Comments RSS TrackBack Identifier URI

Leave a comment

 

User contributed tags for this post:

wordpress permalinks 404 (71) - wordpress mod rewrite (48) - wordpress mod_rewrite (47) - mod_rewrite leopard (45) - wordpress permalink 404 (36) - leopard mod_rewrite (26) - mod rewrite 404 (23) - rewrite wordpress (22) - mod_rewrite wordpress (20) - mod rewrite wordpress (19) - mod_rewrite 404 (19) - wordpress permalinks mod rewrite (19) - mod_rewrite 404 redirect (18) - mod rewrite avoid 404 processing (16) - mod_rewrite redirect 404 (15) - mod rewrite 404 redirect (14) - mod rewrite permalinks (13) - wordpress permalink mod_rewrite (13) - mod_rewrite wordpress (12) - wordpress permalinks apache (12) - wordpress 403 (11) - mod rewrite ErrorDocument (11) - mod_rewrite permalinks (10) - mod rewrite leopard (10) - wordpress permalinks 403 (10) - wordpress permalinks (10) - wordpress permalinks mod_rewrite (10) - F (10) - wordpress mod rewrite 404 (9) - wordpress mod_rewrite 404 (9) - mod_rewrite .htaccess wordpress (9) - modrewrite wordpress (9) - permalinks mod rewrite (9) - time passing quote (9) - htaccess leopard (9) - wordpress permalink apache (8) - wordpress permalink rewrite (8) - wordpress (8) - wordpress rewrite 404 (8) - wordpress template_redirect (7) - wordpress permalinks broken (7) - wordpress 404 permalinks (7) - permalink 404 (7) - wordpress 404 mod_rewrite (7) - rewrite 404 (7) - permalinks mod_rewrite (7) - mod_rewrite errordocument (7) - mod rewrite redirect 404 (6) - wordpress 2 2 apache rewrite (6) - wordpress avoiding 404 google permalinks (6) - mod_rewrite wordpress permalinks (6) - handle 404 with mod_rewrite (6) - wordpress 404 permalink (6) - leopard htaccess (6) - wordpress permalink 403 (6) - mod rewrite for wordpress permalinks (5) - permalink apache (5) - .htaccess wordpress leopard server (5) - wordpress permalink mod rewrite (5) - mod rewrite for wordpress (5) - wordpress rewrite rules (5) - wordpress rewrite (5) - mod rewrite html it (5) - mod rewrite 403 (5) - mod rewrite wordpress permalinks (5) - Wordpress permalinks 404 error (5) - permalinks 404 (5) - WordPress 2 permalinks mod rewrite htaccess (5) - wordpress apache2 (5) - permalinks apache (5) - apache permalinks (4) - ErrorDocument wordpress (4) - wordpress search redirect mod rewrite (4) - apache2 rewrite 404 (4) - wordpress mod rewrite permalinks (4) - mod rewrite apache2 leopard (4) - wordpress mod_rewrite permalinks (4) - leopard mod rewrite (4) - ErrorDocument rewrite (4) - wordpress permalink htaccess (4) - wordpress permalink apache2 (4) - errordocument mod rewrite (4) - mod_rewrite error document (4) - mod rewrite permalink (4) - wordpress permalink broken (4) - wordpress apache 2 2 rewrite (4) - mod_rewrite apache leopard (4) - .htaccess rewrite wordpress (4) - rewrite wordpress internal rules (3) - wordpress permalink error (3) - mod rewrite fixing 404 (3) - wordpress permalink error 403 (3) - rewrite wordpress 404 (3) - wordpress permalinks modrewrite (3) - wordpress leopard permalinks (3) - mod_rewrite permalink (3) - mod rewrite apache leopard (3) - wordpress permalinks and 404 (3) - apache2 wordpress permalink (3) - rewrite redirect 404 (3) - wordpress permalink rewrite problem (3) - apache2 mod rewrite wordpress (3) - mod_rewrite wordpress Permalink (3) - wordpress template_redirect 404 (3) - mod_rewrite 404 error (3) - wordpress permalink The requested URL (3) - wordpress avoid 404 on custom rewrite (3) - mod rewrite blog (3) - permalink mod rewrite (3) - wordpress internal rewrite (3) - wordpress permalink subdirectory (3) - apache wordpress permalinks (3) - ErrorDocument and mod rewrite (3) - mod_rewrite wordpress 404 (3) - permalink wordpress apache (3) - permalinks 404 wordpress (3) - htaccess wordpress 403 (3) - wordpress permalink rss (3) - wordpress rewrite urls (3) - redirect 404 wordpress (3) - wordpress 404 hook (3) - htaccess permalinks (3) - leopard modrewrite (3) - mac leopard mod rewrite (3) - wordpress permalink mod rewrite 403 (3) - wordpress and modrewrite (3) - mod rewrite error The requested URL home gert public ht (3) - rewrite subdirectory (3) - permalinks wordpress apache (3) - wordpress rewrite apache2 (3) - wordpress permalinks error (3) - WordPress 2 permalinks (3) - apache rewrite 403 (2) - permalinks wordpress mod_rewrite (2) - mod_rewrite subdirectory (2) - mod rewrite leopard 404 (2) - permalinks error (2) - wordpress permalink 301 (2) - apache document error redirect permalink (2) - .htaccess wordpress leopard (2) - apache2 rewrite wordpress (2) - wordpress 404 redirect related post (2) - mod rewrite how to redirect 404 (2) - mod rewrite 404 301 (2) - apache mod rewrite 404 redirect (2) - wordpress permalink mac (2) - wordpress permalinks 404 leopard (2) - wordpress template redirect (2) - rewrite wordpress urls (2) - Mod rewrite technology (2) -