使用Coldfusion,您如何处理动态生成的URL?

时间:2009-12-16 18:10:55

标签: coldfusion isapi-rewrite application.cfc

(更新:我将此问题转换为社区维基,因为答案看起来比我想象的更为主观。根据个人的需要,有多个答案。)

如果我有一个只包含application.cfc和index.cfm的文件夹,那么处理动态生成的URL的快速,可靠的方法是什么?即没有相应物理.cfm文件的URL。

此示例url生成404,但它应该在db中查找页面并通过index.cfm返回它:

http://www.myserver.com/cfdemo/mynewpage.cfm

我应该在application.cfc中使用onMissingTemplate()来处理丢失的文件吗?由于此方法不处理onRequestStart(),onRequest()和onRequestEnd(),我想知道是否应该避免它。

或者,我可以设置一个ISAPIRewrite规则,因为我正在使用IIS(或Apache上的mod_rewrite)

# IF the request is not /index.cfm, doesn't exist and ends in cfm or html,
# rewrite it. Pass the requested filename $1.$2 as the 1st param: cgi.page
# append the remaining url params $4 ($3 is the ?)
RewriteCond %{SCRIPT_NAME} ^(?!/index.cfm)(.*)$
RewriteCond %{REQUEST_FILENAME}     !-f
RewriteCond %{REQUEST_FILENAME}     !-d 
RewriteRule ^\/(.*)\.(cfm|html)(\??)(.*)$   /index.cfm?page=$1.$2&$4 [I,L]

这些方法是否合适,还是我错过了实现这一目标的更好方法?似乎Coldfusion应该在application.cfc中内置这种类型的功能。也许我只是错过了它。

5 个答案:

答案 0 :(得分:4)

在Web服务器级别上重写url没有错。我会为此投票。

答案 1 :(得分:2)

因为CF默认只处理cfm / cfc请求,所以你可以在Application.cfc的开头做这样的事情:

<cfif Right(cgi.SCRIPT_NAME, 9) NEQ "index.cfm">
    <!--- analyze the SCRIPT_NAME and start processing --->
</cfif>

对于使用Web服务器配置的其他文件类型是我能看到的唯一方式。但是,您可以尝试使用自定义404处理程序,而不是创建重写规则。至少在使用IIS时,您将能够在cgi.QUERY_STRING中获取上下文,如果设置了虚拟页面,请说 404.cfm (它不需要存在)并进行以下检查< em>之前上一个例子:

<!--- trap 404 requests triggered by IIS --->
<cfif right(cgi.SCRIPT_NAME, 7) EQ "404.cfm">
    <cflog file="mylogfile" text="404 error triggered by IIS. Context: #cgi.QUERY_STRING#">
</cfif>

对于Apache,可以使用以下处理程序,但我不确定在这种情况下是否可以提取上下文:

ErrorDocument 404 /404.cfm

答案 2 :(得分:1)

如果你是为SES URL做这个,我会提供两条建议。

首先,随着时间的推移,它们越来越重要。例如,Google认识到网址需要包含查询数据。

第二:CF可以以hostname / file.cfm / param1 / param2的形式本地处理SES URL。例如,Ray Camden的BlogCFC就是这样的。它默认在CF8中打开,但需要在CF7中启用。我没有太多关于此的信息,但它应该很容易谷歌(或Bing,或其他)。

答案 3 :(得分:0)

如果您允许,我会尝试转换以下网址:

http://www.myserver.com/cfdemo/mynewpage.cfm

为:

http://www.myserver.com/cfdemo/mynewpage OR
http://www.myserver.com/index.cfm/cfdemo/mynewpage

这样您就不会丢失onRequest方法。第一个只能在Web服务器级别完成,因此在Apache或IIS中。第二个可以在ColdFusion中完成。请参阅:http://www.cfcdeveloper.com/index.cfm/2007/4/7/Coldfusion-SES-URL

否则,如果你最后必须有.cfm,你可以在Apache或IIS中使用URL重写包去除它,然后将请求转发到cfm页面或做你正在做的事情与onMissingTemplate。我会尝试选择一种不涉及丢失onRequest方法的解决方案,但取决于您。

答案 4 :(得分:0)

我肯定会去重写URL。它不仅是一种更可预测,更通用的方法,而且还减少了来自CF服务器的大量字符串解析负载。此外,它导致CF处理对真实文件的请求,从而使您获得onapplicationstart,onrequeststart和其他事件的好处。

顺便说一句,我个人总是发现像/index.cfm/foo/bar/这样的网址看起来不合时宜和黑客。此外,不以文件扩展名或尾部斜杠结尾的URL(如/ foo / bar)在技术上是不正确的(至少是旧学校静态站点约定),也应该避免。我也很好奇Ben Doom得到的断言:“首先,随着时间的推移,它们越来越重要。例如,谷歌认识到URL需要包含查询数据。”根据我的经验,我实际上发现了完全相反的事实。