我最初将其发布为早先关于ColdFusion 2016 上的 Empty CGI.REDIRECT_URL 的这个问题的答案。在考虑之后,我想得更好,因为技术上没有回答 OP 的问题。相反,我决定把它变成一个单独的问题,尽管它更像是一个评论而不是一个问题。虽然这在技术上可能无法满足最小、完整和可验证示例的全部要求,并且人们可能会对我投反对票,但我认为无论如何它都是值得的,希望将来可能遇到此问题的 CFers更容易找到它. 从而防止他们对 CGI 结构/作用域的这种特殊行为一头雾水。
话虽如此,CGI 结构/范围与其他结构/范围有一些未记录的不一致行为。请注意,我个人并不认为这一发现归功于我,因为前段时间我在阅读Ben Nadel 的博客文章时偶然发现了这一点。所以我在这里发布的所有信息都已经很详细了,但我想在这里写一个很好的总结。
未记录的行为 1 - 与其他结构不同,如果 CGI 结构键不存在,则在引用它时不会引发错误。
在OP 的原始问题中,他想知道为什么cgi.REDIRECT_URL
存在但是是空的。正如他最终发现的那样,它从未真正存在过。作为一个单独的示例,您可以执行这行代码而不会引发错误。不是你所期望的,对吧?
<cfoutout>#cgi.THIS_IS_A_FAKE_KEY#</cfoutout>
那么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>
未记录的行为 2 - 与其他结构不同,如果您转储 CGI 结构,它不会显示所有键/值对,它只会显示一组定义的键。
在OP 的案例中,他有一个自定义 Apache CGI 变量cgi.REDIRECT_URL
,在升级到 CF2016 之前在他的代码中使用,并且能够直接引用它。但是,我假设如果他倾倒了cgi
结构,它就不会出现在转储中。在Ben Nadel 的案例中,他还有一个cgi
名为的自定义变量,该变量cgi.document_root
是从负载均衡器传递过来的,可以直接引用它,但在转储cgi
内容时他也看不到密钥。
那么CFer要做什么呢?cgi
理解这一点并将其存储在您的脑海中,这样当您转储内容并且键/值对不存在时您就不会被咬。除此之外,其他不多。