我最初发布这个作为早期关于ColdFusion 2016上的空CGI.REDIRECT_URL的问题的答案.在考虑之后,我认为它更好,因为技术上没有回答OP的问题.相反,我决定把它变成一个单独的问题,尽管它更像是一个评论而不是一个问题.虽然这在技术上可能无法满足最小,完整和可验证的例子的全部要求,而且人们可能会给我带来帮助,但我认为它还是值得的,希望能够更容易找到未来可能遇到此问题的CFers .因此,关于CGI结构/范围的这种特殊行为,防止它们撞到墙上.
话虽如此,CGI结构/范围与其他结构/范围有一些未记录的不一致行为.请注意,我个人对这一发现不予理睬,因为我在阅读Ben Nadel的博客文章时发生过这段时间.所以我在这里发布的所有信息都已在那里详细说明,但我想在这里写一篇很好的总结.
未记录的行为1 - 与其他结构不同,如果CGI结构键不存在,则在引用它时不会引发错误.
在OP的原始问题中,他想知道为什么cgi.REDIRECT_URL存在但是空洞.正如他最终发现的那样,它从未真正存在过.作为一个单独的示例,您可以执行此行代码而不会抛出错误.不是你期望的,是吧?
<cfoutout>#cgi.THIS_IS_A_FAKE_KEY#</cfoutout>
Run Code Online (Sandbox Code Playgroud)
那么什么是CFer呢?测试密钥存在.
<cfif structKeyExists( CGI, 'THIS_IS_A_FAKE_KEY' )>
THIS_IS_A_FAKE_KEY exists
<cfelse>
THIS_IS_A_FAKE_KEY doesn't exist
</cfif>
Run Code Online (Sandbox Code Playgroud)
未记录的行为2 - 与其他结构不同,如果转储CGI结构,它将不会显示所有键/值对,它只显示一组已定义的键.
在OP的情况下,他有一个自定义的Apache CGI变量cgi.REDIRECT_URL,在升级到CF2016之前在他的代码中使用,并且能够直接引用它.但是,我假设他是否抛弃了cgi结构,它不会出现在转储中.在Ben Nadel的案例中,他还有一个自定义cgi变量,称为cgi.document_root从负载均衡器传递并且能够直接引用它,但是在转储cgi内容时他也无法看到密钥.
那么什么是CFer呢?理解这一点并将其存储在您的脑海中,这样当您转储cgi内容并且键/值对不存在时,您将不会被咬.除此之外,其他并不多.
coldfusion coldfusion-9 coldfusion-10 coldfusion-11 coldfusion-2016