Страницы с ошибками Coldfusion и IIS7.5
Для того, чтобы ColdFusion мог показывать свои ошибки, а не просто ошибку сервера (код 500), я добавил в web.config некоторые выводы на этом сайте.
Проблема выглядит решенной, но...
Когда я посещаю несуществующий каталог в IIS, он возвращает "пустую" страницу без кода состояния. Если я переключаю его обратно с автоматического перехода на автоматический, IIS снова переходит на страницу ошибок, и больше ошибок ColdFusion не появляется.
У кого-нибудь есть решение? Я провел некоторое исследование и "подозреваю", что, возможно, проблема в JWildcardhandler, но я не смог найти решение этой проблемы.
Очень признателен!
2 ответа
Если кому-то интересно, веб-конфигурация этого человека выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<httpErrors existingResponse="PassThrough" />
...
</system.webServer>
</configuration>
В более ранней версии IIS, если ваш пользовательский сценарий возвратил код ошибки, IIS проигнорировал его и пропустил. Но вы также можете настроить его на обработку статуса ошибки с помощью пользовательских сценариев.
На моем старом сервере, если заданный URL-адрес был 404, IIS был настроен на execut /404.cfm, который отображал страницу ошибки и возвращал код состояния 404, используя <cfheader>
,
Однако теперь, если этот сценарий возвращает код состояния 404, конечным результатом является то, что IIS возвращает ошибку сервера, а не возвращает ответ с кодом состояния 404.
Единственный способ избежать этого - использовать existingResponse="PassThrough"
а затем с использованием общеизвестного шаблона "Шаблон не найден", установленного в CFAdmin.
Вот интересная часть. У меня есть index.cfm, настроенный как индекс по умолчанию, и единственный индекс по умолчанию для моего сайта.
Если я пойду к /about/
, а также /about/index.cfm
существует, то она отображает страницу, как если бы я попросил /about/index.cfm
, И если я пойду в /about/index.cfm
а также /about/index.cfm
не существует, он выполняет шаблон 404 для всего сайта.
Но если я пойду к /about/
а также /about/
не существует как URL, он не пытается загрузить /about/index.cfm
и, таким образом, запускать шаблон 404 для всего сайта. Вместо этого он отображает пустую страницу!
Насколько я могу судить, не существует подходящего решения этой проблемы. Похоже, что только люди, пишущие в.Net, могут решить эту проблему, поскольку они могут поставить флаг в генерируемом ответе, который буквально говорит IIS "Игнорировать код состояния". Я думаю, что Microsoft просто не заинтересована в поддержке альтернативного веб-приложения.
По сути, это решение: избавиться от existingResponse="PassThrough"
и вернуть неправильные коды состояния.
Все остальное будет слишком сложно реализовать. Обратите внимание, что это не работает, если вы создаете приложение или API RESTful. В этом случае вы должны создать виртуальный каталог только для этого, для которого вы можете назначить пользовательский файл web.config, который использует existingResponse="PassThrough"
, Но если вам нужно разрешить настраиваемую обработку ошибок и настраиваемую обработку 404, вы фактически облажались.
Хорошей новостью является то, что кроме API и Ajax, единственный раз, когда кто-то позаботится о том, что на самом деле представляет собой код состояния, будет, когда они все равно будут смотреть на ваши заголовки, и в этом случае они увидят, что вы используете IIS и просто жаль тебя
Сохраняя проход, вы можете использовать перезапись для обработки пустой страницы:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /404.cfm [NC,L,NS]
Переписывание в основном означает - если файл и каталог не существуют, перенаправьте на "404.cfm. Также добавьте 404 cfheader на страницу 404.cfm.