Bill_VA
Bill_VA

Reputation: 973

URL Rewrite with IIS using ColdFusion

I've done a bit of searching but just can't put it all together. Here's what I need:

I'd like someone to surf to:

www.mysite.com/thisPlace

and have it redirect them to

www.mysite.com/template.cfm?pm=ms&loc_id=4

To do so, I somehow need to capture that they didn't request an existing file in their http request and run a .cfm page that queried the database for a record where locationName = 'thisPlace' and then redirect them to a page like template.cfm?pm=ms&loc_id=4, where 4 is the record id of the row that matched 'thisPlace'

Upvotes: 1

Views: 515

Answers (3)

jfrobishow
jfrobishow

Reputation: 2895

This is how most popular MVC Framework work today, by parsing out the URL segments.

Do you have access to any kind of URL rewrite software?

Since you are using IIS it has a built in rewrite engine where you could simply rewrite these kind of requests to a known file saving you the overhead of sending a 404 reply and parsing that out and having more request created as a result of that.

See http://wiki.coldbox.org/wiki/URLMappings.cfm for details. We use the Isapi rewrite version version to do just what you are asking for

  • Receive request for www.mysite.com/thisPlace
  • thisPlace isn't a directory
  • thisPlace isn't a file
  • Resend to index.cfm or a location of your chosing for additional parsing
  • Helicon Rewrite sends an HTTP header named HTTP_X_REWRITE_URL with the original requested URL so parsing it out is then very easy.

This all happens inline withing the one request so the client is never redirected.

Upvotes: 0

Bill_VA
Bill_VA

Reputation: 973

Thanks guys! Huge help! Using your inputs, here's what I did: (had to use QUERY_STRING instead of CF_Template_Path, as CF_Template_Path did not pass along anything after the url of the custom error page.

I set up a custom 404 error Execute URL in IIS to a file named check404error.cfm.

When someone looks for www.example.com/thisPlace, IIS sends them to http://www.example.com/check404error.cfm. I use the CGI.QUERY_STRING (404;http://www.example.com:443/thisPlace) to ultimately get the "thisPlace" string to search with.

<!---Up to a certain point (the directory in which you store your code) this will always be the same so you can hard-code your number --->
<cfset QueryConstant = #LEFT(CGI.QUERY_STRING, 31)#>
<!---Find the overall length of the template path. --->
<!---31 is the length of '404;http://www.example.com:443/' --->
<cfset QueryVariable = #Len(CGI.QUERY_STRING)#>
<!---Take whatever is past your QueryConstant (AKA the string that produces a 404 error.) --->
<cfset theRightNumber = QueryVariable - 31>
<cfset QuerySearchString = #RIGHT(CGI.QUERY_STRING, theRightNumber)#>

<cfquery name="ListOfLocations"  datasource="#request.dsn#">
 	SELECT location.id
	FROM location WHERE url_name = <cfqueryparam value="#QuerySearchString#" cfsqltype="CF_SQL_VARCHAR" maxlength="255"> LIMIT 1   
</cfquery> 

<cfif ListOfLocations.recordcount>
	<cflocation url="https://example.com/template.cfm?pm=ms&loc_id=#ListOfLocations.id#" addtoken="no" statusCode="301">
<cfelse>
	<cflocation url="/404error.cfm" addtoken="no">
</cfif>

Upvotes: 1

TRose
TRose

Reputation: 1738

If your default document in IIS is set to index.cfm you could create a folder (directory) called "thisPlace" and place an index.cfm file that contains nothing but a <cflocation> tag and the accompanying query/logic to figure the URL.

Website.com/thisPlace would then function as you describe.

Edit:

You could add a custom 404 page...

enter image description here

Make it a .cfm file instead of html. Scan the template path to see what the user is looking for. If you find it in your database, redirect them there, else redirect them to a general 404 page.

<!---Up to a certain point (the directory in which you store your code) this will always be the same so you can hard-code your number --->
<cfset QueryConstant = #LEFT(CGI.CF_Template_Path, 22)#>
<!---Find the overall length of the template path. --->
<cfset QueryVariable = #Len(CGI.CF_Template_Path)#>
<!---Take whatever is past your QueryConstant (AKA the string that produces a 404 error.) --->
<cfset theRightNumber = QueryVariable - 22>
<cfset QuerySearchString = #RIGHT(CGI.CF_Template_Path, theRightNumber)#>



<cfquery name="ListOfLocations" datasource="CRM">
    SELECT TOP 1 LocationID
    FROM LocationTable
    WHERE LocationName LIKE '%#QuerySearchString#%'
</cfquery> 

<cfif ListOfLocations.recordcount>
<cflocation url="/SomePage.cfm?LocationID=#ListOfLocations.LocationID#">
<cfelse>
<cflocation url="/Regular404page.html">
</cfif>

Upvotes: 2

Related Questions