Rewrite underscores to hyphens for SEO URL

FREE THOUGHT · FREE SOFTWARE · FREE WORLD

Rewrite underscores to hyphens for SEO URL

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

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.


Example Usage

When http://d.com/the_top_apache_htaccess_article.html 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 http://d.com/the-top-apache-htaccess-article.html

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 (.*) http://www.askapache.com/$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

«
»

Skip to Comments

Add Your Opinion

Reader Comments

  1. Andriy ~

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

  2. Chris Phoenix ~

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

  3. Jake ~

    how can you use this rewrite but exclude directories

  4. stefan ~

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

    Thanks in advance, sorry for my bad english.

  5. 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]

  6. 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.

  7. 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?

  8. 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


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

HTML | DCMI | GRDDL | XOXO | XDMP | XFN | DOM | XML | XHTML 1.1 Strict | CSS 2.1 | W3C | TLDP | WAI | DISA | ICSI | GIAC | SANS RR | GHOST | DEFCON | NIST | DHS CYBER | NIST

↑ TOPExcept 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. HTTPD based on NCSA HTTPd

Site Map | Contact Webmaster | Email AskApache | Glossary | License and Disclaimer | Terms of Service