WordPress’ .htaccess File Is Genius

Written by David Walsh on Friday, October 5, 2007


Choosing to use WordPress was a more difficult decision that you may think. Sure, WordPress is the most used blogging software on the internet, but I’m a programmer, right? I should want to code everything myself, right? I thought that at first but I decided to try WordPress first and I’ve been impressed with every part of WordPress so far. One of the interesting parts of WordPress is the URL rewriting and “slug” that gets created for each post. How did they do that?

Well, I know enough about SEF (search engine friendly) links to know that an .htaccess file had to be involved so I downloaded the .htaccess file from my hosting server and saw:


RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

That’s it? Yep. Basically, the flow goes as follows:

  1. We must first establish that mod_rewrite is available on the server
  2. If so, turn on mod_rewrite
  3. Set the base of all rewriting to the web root folder
  4. If the requested filename isn’t a file….
  5. ….and it isn’t a folder…
  6. Send the person to index.php

Once inside the index.php file, the index.php file processes the request and presents you with the page based upon the slug in the URL. Very simple .htaccess code runs a reliable WordPress blog.


Follow via RSS Epic Discussion

Commenter Avatar October 05 / #

I have been playing around with this in Wordpress, and the only problem I am still having is that the “Next Page” link at the bottom of some pages does not work correctly. The link goes to http://domain.com/page/2/ and is supposed to use mod_rewrite to go to ./index.php?page=2 but all attempts I make to resolve this have not helped.

I am currently trying something like:
“RewriteRule ^/page/(\d+)/? /index.php?page=$1″

What say you? Thanks for your help.

Commenter Avatar October 05 / #

Eric, do you use WordPress 2.3 + the “Permanent Redirect”-Plugin?
I did and came upon the exact same problem. Deactivating the plugin solved this, WP2.3 will do for you with their canonical URLs now.

David Walsh October 05 / #
david says:

@Eric:

Odd, my “next page” functionality has always worked so I can’t image what the issue is. Is your regular expression working correctly?

@Marco:

Thanks for contributing!

Commenter Avatar October 06 / #

Yes, actually turning off permalinks solves the problem. I was really hoping to figure this out so I don’t have ?p=4 stuff.

I don’t think my regex is working. Maybe I will try to make it more general (like \w+/page/(\d+)/?). Do I need the ^ and $ in my regex or will it be more flexible (albeit less secure)?

Commenter Avatar October 08 / #

Setting up RewriteRules like this to push everything through one file, and processing it according to the structure of the url is a pretty common practice in most mvc frameworks. Its great for seo, and great for developing a clean mvc based site.

David Walsh October 08 / #
david says:

Thanks for commenting Brad.

I’m aware that setting up RewriteRules is the way to do things, but WordPress’ .htaccess file is so simple.

I’d post RewriteRules I’ve written to do the same function (MVC) but I’m too embarrassed!

Commenter Avatar October 16 / #
AskApache says:

Heres a couple .htaccess code snippets I use to tweak wordpress..

RewriteCond %{REQUEST_URI} ^[^\.]+\.html/$
RewriteRule ^(.*)\.html.*$ http://www.askapache.com/$1.html [R=301,L]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(feed|wp-atom|wp-feed|wp-rss|wp-rdf|wp-commentsrss)(.*)\ HTTP/ [NC,OR]
RewriteCond %{QUERY_STRING} ^feed [NC]
RewriteCond %{HTTP_USER_AGENT} !^(FeedBurner|FeedValidator|talkr) [NC]
RewriteRule .* http://feeds.askapache.com/apache/htaccess? [R=307,L]

And I use a ton of RedirectMatch’s

Commenter Avatar October 16 / #
AskApache says:

I use a ton of RedirectMatch’s and a few other .htaccess tweaks like:

RewriteCond %{REQUEST_URI} ^[^\.]+\.html/$
RewriteRule ^(.*)\.html.*$ http://www.askapache.com/$1.html [R=301,L]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(feed|wp-atom|wp-feed|wp-rss|wp-rdf|wp-commentsrss)(.*)\ HTTP/ [NC,OR]
RewriteCond %{QUERY_STRING} ^feed [NC]
RewriteCond %{HTTP_USER_AGENT} !^(FeedBurner|FeedValidator|talkr) [NC]
RewriteRule .* http://feeds.askapache.com/apache/htaccess? [R=307,L]

Commenter Avatar September 26 / #
chirag says:

Hai David

Can you help? how to .httaccess in Local pc ??

i am using wamp server

Commenter Avatar November 15 / #
Josh says:

As Brad said, this is a pretty stock-standard .htaccess file. I know that CakePHP uses exactly the same (possibly minus the RewriteBase directive) and a number of other CMSs and frameworks do also. This set of rules is all most sites need to be able to support pretty URLs and a sensible code structure.

So yes, WP’s .htaccess is elegant in its simplicity, but it’s hardly alone!

Commenter Avatar November 15 / #
AntonioCS says:

chirag: If you have AllowOverride All in you httpd.conf file then you can place the .htaccess file in the same folder you have your index.php.
If not you either set the AllowOverride to All (Note: There might be another option to just allow the .htaccess file to work but I normally have it set to All) or add the changes in the httpd.conf

Nice article david. I too use those lines to redirect everything to index.php in my php mvc framework :)
Never really knew exactly what “RewriteCond %{REQUEST_FILENAME} !-f” and
“RewriteCond %{REQUEST_FILENAME} !-d” really meant.
Thanks for clearing that up!

Commenter Avatar February 18 / #

Do you know what it passes back to the server?

Commenter Avatar September 26 / #

@Brandon Hansen: take a look at $_SERVER['REQUEST_URI'] and the query.php file near all is_home etc…

Commenter Avatar October 24 / #
ghprod says:

yes, no doubtful…mens behind WP are genius!!!

anyway, any tutorial how to proccesing request url in wordpress, i mean in index.php?

regards

Be Heard!

I want to hear what you have to say! Share your comments and questions below.

Name*:
Email*:
Website:  


© David Walsh 2007-2010. Contact David Walsh. Powered by the remarkable MooTools javascript framework.