Apache mod_rewrite problems with ColdFusion

November 11, 2003

I have been trying to find the answer to an Apache mod_rewrite problem when using CFMX 6.1. I asked both the cf-linux list, and the cfguru list with no avail (Sean Corfield did suggest using mod_proxy to marshal requests to CF's builtin web server, but that was not ideal for my configuration).

Here's the issue, lets say you want to create search engine safe URLs that don't use file extensions - such as site.com/item/30/ which would redirect to something like: site.com/item.cfm?id=30. So I created a rewrite rule:

RewriteEngine On
RewriteRule ^/item/([0-9]).*$ /item.cfm?id=$1

After creating that rule, and visiting site.com/item/30/ It outputs the CFML source code to item.cfm! When I try something like site.com/item/30.cfm it works! So clearly CFMX is not able to process the file unless I add .cfm to the url. It is interesting to point out that If I use a php file instead of a cfm file, it works fine.

Next I mapped the * url patteren to CfmServlet in the web.xml file. This did nothing but stop php from working.

This entry was:


I see some things in your rewrite rule that looks different then mine, and since mine works fine (although on Windoze), I thought I'd share. Here is one of my rules: RewriteRule /stores/store/id/([0-9]+)(.*) /stores/store.cfm\?id=$1 [PT] Notice the escape of the ? on the right hand side? And notice the use of [PT], which I forget what it means. Anyway, give it a try.
Thanks Ray I'll give it a try, BTW it looks like [PT] stands for pass through: from the docs "This flag forces the rewriting engine to set the uri field of the internal request_rec structure to the value of the filename field. This flag is just a hack to be able to post-process the output of RewriteRule directives by Alias, ScriptAlias, Redirect, etc. directives from other URI-to-filename translators."
I think adding [R,L] to the RewriteRule might also solve your problem - that forces a redirect to the browser (a 302) so that the request comes back as if the user had typed it in directly (so it should be processed correctly by CF).
This post is somewhat old, but in case others find it like I did...I got it to work using Ray Camden's suggestion of [PT]. I also added [L] to end up with [PT,L], and this is working for me using Linux and Bluedragon 6.2.
To echo Chris Bestall, this worked for me (thank God) by adding [PT,L] to the RewriteRule line, but for Apache2/Windows.
Doing a 302 redirect will slightly slow down your site since it forces browsers to make two requests for each page. Is L really required or will PT do?
SpliFF - The L is not required, it simply means stop processing rules after this one (if it matches), so in many cases you want it, but in some you don't.
Thanks Pete, The following works beautifully for me (Apache2/Linux)... # Only if request has no extension do we pass to /index.cfm. This means static content like .js,.gif,.html etc.. are handled normally by Apache. RewriteEngine On RewriteCond %{REQUEST_FILENAME} !^.*?\.[^/]{2,5}$ RewriteRule (.*) /index.cfm$1 [PT] My code retrieves values from both cgi.path_info and cgi.query_string which means it also captures the old non-seo requests without problems. Note to Pete: Your blog doesn't work with referer turned off in browser.
Oops, linefeeds went awol, should be... RewriteEngine On RewriteCond %{REQUEST_FILENAME} !^.*?\.[^/]{2,5}$ RewriteRule (.*) /index.cfm$1 [PT]
Hmmm. again... well you all get the idea. If not you're boned away. ;)
Hey guys - I'm joining this party *well* after it's ended, I know, but I'm hitting the same mod_rewrite issue. The problem is, my situation includes a twist: I can't use the [PT] flag because I need the CGI variables - specifically SCRIPT_NAME to retain the value from the original request. If I use the PT flag then the SCRIPT_NAME value becomes that of the landing page. Is there a way to configure mod_rewrite to redirect requests for ^/(.*) to /foo.cfm such that the redirected request doesn't *have* to end in .cfm? Thanks.
I have a problem that is slightly different from what you all have here but I'm hoping someone can assist. I'm attempting to use mod_rewrite to redirect all incoming .cfm requests (index.cfm, default.cfm, login.cfm, etc) to an actual CF server using it's own HTTP server on port 8080. Anyone willing to offer up a shot? Respond here or by e-mail....I'd appreciate whatever I can get. PFiero
Try RewriteCond %{SERVER_PORT} !8080 RewriteRule /(.*) %{SERVER_PROTOCOL}://%{REQUEST_URI}:8080/$1 I should note that I haven't tested this at all. It may not be right, but it just might be close enough to get you moving in the right direction.
Good thought but this server also hosts a ton of other regular web page stuff. Here is what I have so far: RewriteEngine on RewriteLog "/var/log/httpd/rewrite.log" RewriteLogLevel 9 RewriteRule (/.*\.cfm.*) http\://\:8080$1 [P] # Fix final slash for /dir RewriteCond Host: (.*) RewriteRule ([^.?]+[^.?/]) http\://$1$2/ [R] # Append default.cfm to any dir RewriteRule ((?!.+\.cfm).*/) $1default.cfm [P] And by the way if I type the URL with the .cfm page on it.... http://www.example.com/default.cfm for instance, the page comes up now. But if I put just http://www.example.com/ it gives me an error.
You may need to modify web.xml or default-web.xml under the coldfusion wwwroot directory and put in something like this: <servlet-mapping> <servlet-name>CfmServlet</servlet-name> <url-pattern>*.cfm/*</url-pattern> </servlet-mapping> Its been a long time since I did this but I believe it was required for redirected URLs that don't end in .cfm. It seems jrun doesn't realise its supposed to be handling it because it looks at the original URL, not the [PT] one.
But after a day or so it is noticed that the pure water, owing to its higher vapour pressure, slowly evaporates and condenses on the solution. ,
The forum is a brighter place tnhaks to your posts. Thanks!

Recent Entries


did you hack my cf?