Blog

Brad Wood

December 24, 2016

Spread the word


Share your thoughts

Christmas baking has probably began in your house, filling the air with the sweet aroma of sugar, carbs, cholesterol, and partially hydrogenated oil.  Mmm, just like Grandma used to make!  What better time to cook up a new development environment that runs on CommandBox.  

URL rewriting is common on many server setups and while everyone does the same basic things, the config files they use vary greatly based on the web server they have in play.  CommandBox allows for URL rewriting, but a common question I get is how to convert the rewrites people already have on their existing web servers so CommandBox can use them.

Converting Apache and IIS URL Rewrites

This post is long on examples so I'll try and be short on commentary.  CommandBox uses a Java URL Rewriting engine called Tuckey whose default config is an XML format.  Let's look at the main scenarios you're probably dealing with.  

No special rewrites

If you don't have any custom rewrites, but you want to use a framework like ColdBox MVC that allows SES urls that need the index.cfm added back in, this is the easiest scenario.  Simply start your server with the --rewritesEnable flag (which will save to your server.json after the first time).  

CommandBox> start --rewritesEnable

This will enable our basic out-of-the-box rewrite rule that turns URLs like site.com/foo/bar into site.com/index.cfm/foo/bar

If you want to take a look at what the configuration for the default rewrites looks like, check out this file: ~/.CommandBox/cfml/system/config/urlrewrite.xml

Apache mod_rewrite

You may be using Apache's mod_rewrite for all your rewriting needs.  Well guess what-- Tuckey has built in support for the mod_rewrite syntax!  All you need to do is put your rewrite rules in an .htaccess file (which you may already be doing) and specify that file as the custom rewrite config file.  Note the filename must be .htaccess.

CommandBox> start --rewritesEnable rewritesConfig=.htaccess

Tuckey will pick up your file and use it.  If it doesn't seem to be working, run the server log command and see if there's any errors being thrown from Tuckey.There are a few documented differences between the original mod_rewrite library which you can read about here: 
http://cdn.rawgit.com/paultuckey/urlrewritefilter/master/src/doc/manual/4.0/index.html#mod_rewrite_conf

IIS Rewrites

IIS has its own rewrite engine that uses an XML format that is actually pretty similar to Tuckey's XML format.  Some CF devs from Slack gave me the following IIS rewrite rules to use an example to convert for CommandBox use.  A quick read through the Tuckey docs and you'll be familiar with its syntax and options.  I'm only going to show the full Tuckey XML file in the first example.  The rest will just be the rule fragment to save space.  Save the rewrite rules in an XML file and specify them just like the .htaccess rules above, but with the correct filename.  Please note, Tuckey expects the leading slash in your request URI regex unlike IIS. 

IIS Rule

<rule name="Rewrite Library Genre Name " enabled="true" stopProcessing="true">
    <match url="^Library/Genre/([^/]+)$" />
    <action type="Rewrite" url="Library/Genre/index.cfm?name={R:1}" />
</rule>

CommandBox Rule (Full XML file)

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.2//EN" "http://tuckey.org/res/dtds/urlrewrite3.2.dtd">
<urlrewrite>	
	<rule enabled="true">
		<name>Rewrite Library Genre Name</name>		
		<from>^/Library/Genre/([^/]+)$</from>
		<to type="passthrough" last="true">/Library/Genre/index.cfm?name=$1</to>
	</rule>
</urlrewrite>

IIS Rule

<rule name="Rewrite siteMap" enabled="true">
    <match url="^sitemap.xml" />
    <action type="Rewrite" url="sitemap.cfm" />
</rule>

CommandBox Rule

<rule enabled="true">
    <name>Rewrite siteMap</name>
    <from>^/sitemap.xml</from>
    <to type="passthrough">/sitemap.cfm</to>
</rule>

IIS Rule

<rule name="Canonicalize Home Page">
    <match url="^index\.(?:htm|html|cfm)" ignoreCase="true" />
    <action type="Redirect" url="http://www.domain.com/" redirectType="Permanent" />
</rule>

CommandBox Rule

<rule>	
    <name>Canonicalize Home Page</name>
    <from casesensitive="true" >^/index\.(htm|html|cfm)</from>
    <to type="permanent-redirect">/</to>
</rule>

IIS Rule

<rule name="Canonicalize Domain" stopProcessing="true">
    <match url="(.*)" />
    <conditions>
        <add input="{HTTP_HOST}" negate="true" pattern="www\.domain\.com" />
        <add input="{HTTP_HOST}" negate="true" pattern="localhost" />
        <add input="{HTTP_HOST}" negate="true" pattern="127.0.0.1" />
    </conditions>
    <action type="Redirect" url="http://www.domain.com/{R:1}" redirectType="Permanent" appendQueryString="false" />
</rule>

CommandBox Rule (Added port)

<rule>
    <name>Canonicalize Domain</name>
    <condition name="host" operator="notequal">^www\.domain\.com</condition>
    <condition name="host" operator="notequal">^localhost</condition>
    <condition name="host" operator="notequal">^127\.0\.0\.1</condition>
    <from>^(.*)</from>
    <to type="permanent-redirect" qsappend="true" last="true">http://www.domain.com:%{port}$1?</to>
</rule>

IIS Rule

<rewriteMaps>
    <rewriteMap name="301Redirects">
        <add key="/oldPage.cfm" value="/newpage.cfm" />
        <add key="/something.cfm" value="/somethingElse.cfm" />
        <add key="/faq.cfm" value="/support.cfm" />
    </rewriteMap>
</rewriteMaps>
<rules>
    <rule name="301 Redirects">
        <match url=".*" />
        <conditions>
            <add input="{301Redirects:{REQUEST_URI}}" pattern="(.+)" />
        </conditions>
        <action type="Redirect" url="{C:1}" redirectType="Permanent" />
    </rule>
</rules>

CommandBox Rules

<rule>
    <from>^/oldPage.cfm</from>
    <to type="permanent-redirect">/newpage.cfm</to>
</rule>
<rule>
    <from>^/something.cfm</from>
    <to type="permanent-redirect">/somethingElse.cfm</to>
</rule>
<rule>
    <from>^/faq.cfm</from>
    <to type="permanent-redirect">/support.cfm</to>
</rule>

 

Add Your Comment

Recent Entries

Your ColdFusion Upgrade Passed. Did Your Business Workflows?

Your ColdFusion Upgrade Passed. Did Your Business Workflows?

The server restarted. The administrator shows the expected version. Your homepage loads, and a few familiar screens look fine.

Would you tell the business the upgrade is complete?

Consider an illustrative scenario: a customer submits an order after an upgrade. The application saves it and displays a confirmation page. But the confirmation email never arrives, and the scheduled process that sends the order to fulfillment has not completed.

From the browser, the transaction...

Maria Jose Herrera
Maria Jose Herrera
October 22, 2026
Updating Adobe ColdFusion isn't always just installing the latest patch

Updating Adobe ColdFusion isn't always just installing the latest patch

Keeping Adobe ColdFusion updated is an important part of maintaining a secure and reliable application environment.

But applying a ColdFusion update is not always as simple as installing the latest patch and restarting the server.

Updates can include security fixes, library upgrades, JVM-related changes, changes to the ColdFusion Administrator, updated packages, bug fixes, and changes in runtime behavior. Most updates will not cause problems for most applications. But when you'r...

Cristobal Escobar
Cristobal Escobar
October 21, 2026
BoxLang AI 3.6: Your Agent Now Has Eyes, Ears, and a Voice

BoxLang AI 3.6: Your Agent Now Has Eyes, Ears, and a Voice

Ortus Solutions today announces BoxLang AI 3.6, the release that connects the AI framework to the rest of the BoxLang productivity platform. Your agents can now drive a real browser via bx-playwright, speak and master audio via bx-audio, stream text-to-speech token by token, talk to any MCP server over stdio — and do all of it with the same fluent BoxLang syntax they always have.

Luis Majano
Luis Majano
October 20, 2026