cflocation与cfheader在进行301重定向时的区别

8

我正在对一个项目中的现有文件进行“重命名”。为了保持向后兼容性,我将保留一个cfm文件,以将用户重定向到新文件。

  • buy.cfm:旧
  • shop.cfm:新

为了使一切尽可能简洁,如果用户尝试进入buy.cfm页面,我想发送301状态码响应。

我知道我可以使用cflocationstatuscode属性。

<cflocation url="shop.cfm" statuscode="301" addtoken="false">

我可以使用cfheader标签。
<cfheader statuscode="301" statustext="Moved permanently">
<cfheader name="Location" value="http://www.mysite.com/shop.cfm">

有没有理由使用其中一种方法而不是另一种?
3个回答

13

我认为它们做的事情是一样的,只是<cflocation>更易读。


1
同意Henry的观点。cfheader版本只是手动实现了cflocation为您完成的操作。 - Adam Cameron
3
经过进一步阅读,看起来 statuscode 属性直到 CF8 才被添加,因此在此之前,cfheader 是返回特定状态码的唯一方式。 - Joe C
1
FYI - cflocation 状态码只接受 300 到 307 之间的值。因此,例如,如果您需要返回一个新创建资源的位置以及 201 状态码,您将需要使用 cfheader。 - Eric Fuller

8
我在ColdFusion 9上进行了测试。
有一个主要的区别,就是cflocation停止页面的执行,然后重定向到指定的资源。
Adobe ColdFusion documentation中可以看到:

停止当前页面的执行并打开ColdFusion页面或HTML文件。

所以你需要这样做:
<cfheader statuscode="301" statustext="Moved permanently">
<cfheader name="Location" value="http://www.example.com/shop.cfm">
<cfabort>

获得以下内容的等效物:

<cflocation url="shop.cfm" statuscode="301" addtoken="false">

否则,如果其他代码在cfheader标记之后运行,您可能会遇到问题。我修复一些代码时遇到了这个问题,在应用程序.cfm文件中插入重定向(使用cfheader)而没有中止页面处理的其余部分。
我还注意到,在响应标头中,cflocation也相应地设置以下标头:
Cache-Control: no-cache
Pragma: no-cache

如果需要使用cfheader标签和Location,可能需要添加以下头文件:
<cfheader name="Cache-Control" value="no-cache"> 
<cfheader name="Pragma" value="no-cache">

0
进一步解释Andy Tyrone的答案,虽然在某些情况下它们可能会做相同的事情,但CFHEADER方法可以更好地控制请求中传递的标头。例如,如果您想向浏览器或内容交付网络发送缓存控制标头,以便它们不会继续使用旧的重定向请求访问您的服务器,则这变得非常有用。据我所知,没有办法告诉CFLocation缓存重定向。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接