<cflocation> 重定向导致 HTTP 错误 414 - 请求 URL 太长

<cflocation> redirect is causing HTTP Error 414 - The request URL is too long

我正在使用 JQuery Ajax 到 post 一个表格到 cfc。

当发生错误时,例如生成了重复的 post,然后 cfc 会检查它并进行简单的重定向。是这样的:

<cfif rsDuplicate.RecordCount GT 0>
  <cflocation url="/items/new" addtoken="no">
</cfif>

发生此错误时,重定向变得疯狂,似乎向我的浏览器发送了一个 URL,其中包含整个网页的 HTML,即它像这样 http://mysite/items/<!doctype html><html lang="en"><meta charset="utf-8">...

我不明白为什么要这样做。我很确定这与我最初通过 Ajax 调用 CFC 有关,但是如果我要求服务器将我重定向到一个新页面,那么它肯定不涉及客户端全部?

我还在我的表单标签中加入了 data-ajax="false",因为我在某处读到这可能有帮助,但它没有。有什么想法吗?

AJAX'd CFC(以及任何语言的服务器端对象)的处理方式与标准浏览器请求非常相似。仅仅因为你没有直接看到输出,并不会改变浏览器发送一个正常的请求,并取回数据。

例如,您可能已经知道,您的 cfc 会遵守 application.cfc 的规则,并且会像正常的浏览器页面请求一样包含页眉和页脚。

当您的重复检查触发并评估为真时,cfc 被cflocation编辑到新的 url,那个 cflocation 不会传回 ajax 调用从那里触发它。 Cold Fusion 无法帮助您做到这一点。

我在我的一些应用程序中做了类似的事情,我所做的是 return 一个在顶层包含 status 变量的结构。它可能看起来像

<cfreturn {STATUS = 2, KEYCODE = "Duplicate entries found", DESTURL = "/err_dupes.cfm"}>

现在,在 jquery ajax 处理程序中,在成功部分(因为调用仍然成功),你可以做这样的事情..

....
if (ajaxObj.STATUS == 2) {
  alert(ajaxObj.keycode); // If you want to notify the user.
  window.location.replace(ajaxObj.DESTURL);
}