Первоначально я разместил это как ответ на этот вопрос ранее относительно Empty CGI.REDIRECT_URL на ColdFusion 2016. Подумав об этом, я передумал, поскольку технически не ответил на вопрос ОП. Вместо этого я решил выделить его в отдельный вопрос, хотя это скорее комментарий, чем вопрос. Хотя технически это может не соответствовать всем требованиям минимального, полного и проверяемого примера, и люди могут дать мне отрицательные голоса, я решил в любом случае оно того стоило в надежде, что его станет легче найти для будущих CF-специалистов, которые могут столкнуться с этим. Таким образом, они не могут биться головой о стену об этом своеобразном поведении структуры/области CGI.
При этом структура/область CGI имеет некоторое недокументированное непоследовательное поведение по сравнению с другими структурами/областями. Обратите внимание, что я лично не беру на себя ответственность за это открытие, поскольку я столкнулся с этим некоторое время назад, прочитав запись в блоге Бена Наделя по этому поводу. Итак, вся информация, которую я публикую здесь, уже подробно описана там, но я хотел написать хорошее резюме здесь, на SO.
Недокументированное поведение 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
, она не появилась бы в дампе. В в случае с Беном Наделем, у него также была пользовательская переменная cgi
с именем cgi.document_root
, которая была передана из балансировщика нагрузки и могла ссылаться на нее напрямую, но он также не мог видеть key при сбросе содержимого cgi
.
Так что же делать CFer? Поймите это и сохраните это в глубине души, чтобы вас не укусили, когда вы сбрасываете содержимое cgi
, а пары ключ/значение там нет. Кроме этого, не более того.
HTTP_X_FORWARDED
серверу CF. Но когда я сбрасываю это, я могу найти строку в областиCGI
. НоCGI.HTTP_X_FORWARDED
дает мне значение. Это действительно ужасно. - person rrk   schedule 15.02.2018CGI
работает следующим образом: сначала она сканирует саму область, а затем, если не найдена, сканирует заголовки запроса (getHttpRequestData()
). Но в заголовках запроса ключи будут другими, что означает, что символы подчеркивания (_
) в области запроса будут дефисами (-
). Это означает, чтоcgi.THIS_IS_A_FAKE_KEY
фактически извлекает данные изgetHttpRequestData().headers['THIS-IS-A-FAKE-KEY']
. Теперь вопрос: Почему?; Понятия не имею. - person rrk   schedule 15.02.2018