8

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

  • 购买.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">

是否有任何理由使用一种方法而不是另一种方法?

4

3 回答 3

13

我认为他们做同样的事情,<cflocation>更具可读性

于 2013-01-23T05:32:27.237 回答
8

我在 ColdFusion 9 上对此进行了测试。

有一个主要区别,那就是 cflocation 停止执行页面,然后重定向到指定的资源。

来自Adob​​e ColdFusion 文档

停止执行当前页面并打开 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 标记之后运行,您可能会遇到问题。我在修复一些将重定向插入到 application.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">
于 2017-03-22T15:42:34.160 回答
0

为了详细说明 Andy Tyrone 的答案,虽然他们在某些情况下可能会做同样的事情,但 CFHEADER 方法让您可以更好地控制请求中传递的标头。这变得很有用,例如,如果您想将缓存控制标头发送到浏览器或内容交付网络,以便它们不会继续使用相同的旧重定向请求访问您的服务器。没有办法(据我所知)告诉 CFLocation 缓存重定向。

于 2019-03-13T21:22:12.300 回答