Home  »  Htaccess  »  Rewrite underscores to hyphens for SEO URL

by 11 comments

This Apache .htaccess code 301 redirects requests for URLs with underscores (_) to the URL with hyphens.

Please see this article for the working updated code.

SEO benefits of using hyphens/dashes over underscores

According to Matt Cutts the choice is clearly to use dashes or hyphens instead of underscores.

So instead of article_this_is_awesome_page.html you want article-this-is-awesome-page.html.

I often get asked whether I'd recommend dashes or underscores for words in urls. For urls in Google, I would recommend using dashes.

Updated Htaccess

Thanks to lucus for supplying this improved version:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !\.(html|php)($|?) [NC]
RewriteRule ^([^_]*)_+(.*)$ $1-$2 [E=underscores:Yes,N]
RewriteCond %{ENV:underscores} ^Yes$
RewriteRule (.*) http://%{HTTP_HOST}/$1 [R=301,L]

Example Usage

When is requested by a browser or search engine, a Search-Engine Friendly 301 Redirect is sent telling the client that the correct location for the resource is at

The Apache .htaccess underscore to hyphen conversion code

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule !\.(html|php)$ - [S=6]
RewriteRule ^([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_(.*)$ $1-$2-$3-$4-$5-$6-$7 [E=underscores:Yes]
RewriteRule ^([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_(.*)$ $1-$2-$3-$4-$5-$6 [E=underscores:Yes]
RewriteRule ^([^_]*)_([^_]*)_([^_]*)_([^_]*)_(.*)$ $1-$2-$3-$4-$5 [E=underscores:Yes]
RewriteRule ^([^_]*)_([^_]*)_([^_]*)_(.*)$ $1-$2-$3-$4 [E=underscores:Yes]
RewriteRule ^([^_]*)_([^_]*)_(.*)$ $1-$2-$3 [E=underscores:Yes]
RewriteRule ^([^_]*)_(.*)$ $1-$2 [E=underscores:Yes]
RewriteCond %{ENV:underscores} ^Yes$
RewriteRule (.*)$1 [R=301,L]

Further Reading

  1. The Worlds Greatest Apache .htaccess Guide
  2. Article in htaccessElite forum:Rewrite urls separated by _ underscores to - dashes


February 22nd, 2007

Comments Welcome

  • Joe

    Hi - Great resource. At the risk of sounding ignorant, could you please tell me where abouts (i.e. in which directory/folder/subdirectory I would place this code to ensure the rewrite to dashes works? Thanks

  • Faruk

    Hello can anyone tell me how can i edit a htaccess multicommand file?i m currently using user friendly code and i added codes for broken links and code for fclearing query_strings
    but at the and it did not work:

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /friendly_url.php

    ErrorDocument 400 http://www.sicaktakip/error_404.html
    ErrorDocument 401 http://www.sicaktakip/error_404.html
    ErrorDocument 403 http://www.sicaktakip/error_404.html
    ErrorDocument 404 http://www.sicaktakip/error_404.html
    ErrorDocument 500/http://www.sicaktakip/index.php
    RewriteCond %{QUERY_STRING} ^source= RewriteRule (.*) /$1? [R=301,L]
    Anyone any idea for that?

  • mark

    Haven't be able to get this to work, and I've tried all of the variations in the two further reading links.

    I have the file extensions removed on the old site and on the new, so all I really need to do is rewrite the underscores to dashes.

    Love to know where I'm going wrong but not being a tech, I don't really know where toe start.

    PS At the moment I'm testing on a local wamp setup before I go messing around with a live environment.

  • lucas

    it would be better to have html and php extensions skipped using a condition yet still allow querystrings. but more importantly to use one rule to replace underscores and loop it with the N flag instead of trying to anticipate how many there'll be. this version addresses those issues and trims consecutive underscores to a single hyphen.

    Options +FollowSymLinks
    RewriteEngine On
    RewriteBase /

    RewriteCond %{REQUEST_URI} !.(html|php)($|?) [NC]
    RewriteRule ^([^_]*)_+(.*)$ $1-$2 [E=underscores:Yes,N]
    RewriteCond %{ENV:underscores} ^Yes$
    RewriteRule (.*) http://%{HTTP_HOST}/$1 [R=301,L]

  • stefan

    Hello i just wondering if there is anyway to rewrite underscores to slashes.

    Thanks in advance, sorry for my bad english.

  • Jake

    how can you use this rewrite but exclude directories

  • Chris Phoenix

    The article's example code has S=5 option (skip next five rules) followed by six underscore-elimination rules.

  • Andriy

    And what's your suggestion if the URL can include up to 16 underscores that should be rewritten to hyphens?

  • saurabh

    How i redirect url to error page when we find & or = in url
    Please give me the solution

  • Daniel Harris

    I get a server error 500 when I try this code.

  • prabhu

    how to remove file extension here?

My Online Tools
WordPress Sites

My Picks

Related Articles
Newest Posts

  • The Hacker Playbook - very nice high level overview of attacks 
  • Clean Code - A Handbook of Agile Software Craftsmanship 
  • Secrets of the JavaScript Ninja - By my absolute favorite JS hacker John Resig! 
  • Hacking Exposed 7: Network Security Secrets & SolutionsMy all time favorite, basic but thorough and accurate. 
  • Empty words will be no surrogate for cold resolve. Pain is nothing. 
  • REVERSING: Secrets of Reverse Engineering 
  • "The Shockwave Rider", by John Brunner (1975 hacker sci-fi) 
  • The Rootkit ARSENAL - Escape and Evasion in the Dark Corners of the System 
  • "We Are Anonymous - Inside the Hacker World of LulzSec, Anonymous, and the Global Cyber Insurgency" better be good! 
  • The Datacenter as a Computer -- Urs Holzle 
  • Now by Steven Levy, "IN THE PLEX" 
  • Dreaming in code.... So far, a little boring, but worth the read 

Friends and Recommends
Hacking and Hackers

The use of "hacker" to mean "security breaker" is a confusion on the part of the mass media. We hackers refuse to recognize that meaning, and continue using the word to mean someone who loves to program, someone who enjoys playful cleverness, or the combination of the two. See my article, On Hacking.
-- Richard M. Stallman


It's very simple - you read the protocol and write the code. -Bill Joy

Except where otherwise noted, content on this site is licensed under a Creative Commons Attribution 3.0 License, just credit with a link.
This site is not supported or endorsed by The Apache Software Foundation (ASF). All software and documentation produced by The ASF is licensed. "Apache" is a trademark of The ASF. NCSA HTTPd.
UNIX ® is a registered Trademark of The Open Group. POSIX ® is a registered Trademark of The IEEE.

| Google+ | askapache

Site Map | Contact Webmaster | License and Disclaimer | Terms of Service

↑ TOPMain