3

(更新:我将此问题转换为社区 wiki,因为答案似乎比我想象的更主观。根据自己的需要,有多个答案。)

如果我有一个仅包含 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 中内置这种类型的功能。也许我只是想念它。

4

5 回答 5

4

在 Web 服务器级别重写 url 没有错。我会投票赞成。

于 2009-12-16T20:09:07.203 回答
2

因为 CF 默认只处理 cfm/cfc 请求,所以您可以在 Application.cfc 的开头执行以下操作:

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

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

<!--- 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
于 2009-12-16T20:10:11.590 回答
1

如果您为 SES URL 执行此操作,我会提供两条建议。

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

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

于 2009-12-16T18:48:47.677 回答
0

如果您可以允许,我会尝试转换 URL,例如:

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

到:

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

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

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

于 2009-12-20T16:21:18.310 回答
0

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

顺便说一句,我个人总是发现像 /index.cfm/foo/bar/ 这样的 URL 看起来不专业而且很老套。此外,不以文件扩展名或斜杠结尾的 URL(如 /foo/bar)在技术上是不正确的(至少按照老式静态站点约定),也应该避免使用。我也很好奇 Ben Doom 从哪里得到他的断言“首先是它们随着时间的推移越来越不重要。例如,谷歌认识到 URL 需要包含查询数据。” 根据我的经验,我发现事实恰恰相反。

于 2009-12-22T21:19:52.757 回答