I've blogged before about short, SES style URLs and what I use. (To summarize - I'd either recommend URL Rewriting in Apache or IIRF for IIS.) What if you can't use a web server side solution? You're left with using a solution I used for BlogCFC, namely appending values after the file name and using CGI.PATH_INFO to parse it. Here is a simple example.

CGI.PATH_INFO is a CGI variable that will represent any information found after the filename in the URL. Look at the URL in the browser. Notice the index.cfm is followed by a / and then various bit of information. What I did for BlogCFC was create a specific pattern, and then wrote some code to parse that pattern and load various groups of blog entries (or A blog entry) based on the value. I could have also done something a bit more generic of the form:

/name1/var1/name2/var2

In this pattern, I've changed name1=var1&name2=var2 to a simpler list of name/value pairs. We can use the same pattern with Model-Glue, but since Model-Glue uses an event value, we need to preface it with the event to run. So the pattern I will use is:

/event/name1/var1/name2/var2

I opened up my Application.cfm file and added the following code:

<!--- get the info ---> <cfif len(trim(cgi.path_info))> <!--- From Michael Dinowitz ---> <cfset urlVars=reReplaceNoCase(trim(cgi.path_info), '.+\.cfm/? *', '')> <cfif urlVars is not "" and urlVars is not "/"> <!--- remove first / ---> <cfif left(urlVars, 1) is "/"> <cfset urlVars = right(urlVars, len(urlVars)-1)> </cfif> <!--- Event is first item ---> <cfset url.event = listFirst(urlVars, "/")> <!--- strip it off ---> <cfset urlVars = listRest(urlVars, "/")> <!--- now build name/val pairs ---> <cfloop index="x" from="1" to="#listlen(urlVars,"/")#" step="2"> <cfset name = listGetAt(urlVars, x, "/")> <cfif listLen(urlVars, "/") gte x+1> <cfset value = listGetAt(urlVars, x+1, "/")> <cfelse> <cfset value = ""> </cfif> <cfset url[name] = value> </cfloop> </cfif> </cfif>

I'm not going to pick over this too much as you can see it is just string parsing. Basically I get the information after the /, grab the event as the first item, and if anything else is left than it is treated as name/value pairs. Also note that I support a name without a value. This would be useful for passing a "flag" type setting.

As a practical example, instead of using this URL:

/index.cfm?event=loadArticle&id=5

I can use this:

/index.cfm/loadArticle/id/5

For print format, I could use this:

/index.cfm/loadArticle/id/5/print

And to make it even nicer, I could include the title of the article in the URL. This would be used to help search engines, but have zero uses in the controllers:

/index.cfm/loadArticle/id/5/Dharma-Controls-All-Feed-The-Swan

Again - let me be clear - your best solution would be to use URL Rewriting, but this is an alternative you can use if that is not an option.