Назад | Перейти на главную страницу

IIS 7.5 возвращает 404 для неизвестных имен хостов

Мне это кажется неправильным, поэтому я ищу кого-нибудь, кто расскажет, как я неправильно настроил IIS ... Конфигурация - IIS7.5 (2008R2), без SP1.

У меня настроен IIS 7.5 с несколькими сайтами. ВСЕ сайты имеют имена хостов, определенные в привязках, НЕТ сайтов без имени хоста. Однако, если я запрашиваю неизвестное имя хоста с сервера, IIS (технически Microsoft-HTTPAPI / 2.0) возвращает ошибку 404, а не ошибку 400. Я ожидал бы 400 (или другой серьезной ошибки), а не скромного 404.

Это вызывает проблему, когда у меня есть nginx перед несколькими IIS, и я хочу остановить сайт, чтобы nginx отключил его от вращения. Поскольку IIS по-прежнему возвращает 404 для запроса, даже если для этого имени нет активного сайта, nginx не знает, что сервер мертв.

NB: IIS возвращает 404 независимо от того, есть ли сервер, но он остановлен, или нет сервера.

Мысли? Решения?

- Дополнительная информация: ОК, я добавил сайт на порт, отличный от 80 (5000), а затем при подключении к этому порту запросил сайт, который не существует, и я получил ожидаемую ошибку 400 (недопустимое имя хоста). Итак, хотя IIS не прослушивает общие (без имени хоста) подключения на порту 80, может показаться, что что-то есть. Есть идеи, как заставить HTTPSys сбросить список того, что он слушает?

Это сделано намеренно. Резервирование URL-адреса - это не то же самое, что регистрация URL-адреса, которая происходит динамически, когда приложение регистрируется в HTTP.SYS для прослушивания. В случае резервирования URL-адреса HTTP.SYS не знает, является ли URL-адрес в данном резервировании просто временно или не существует вообще. Все, что он может знать в этом случае, - это то, что существует допустимое совпадение имени хоста (из-за вашего сильного / слабого подстановочного знака), но путь URL-адреса не соответствует ни одному из зарегистрированных в настоящее время слушателей.

Если вы хотите получить ответ 400 или 503, то либо не используйте резервирование URL-адресов, либо используйте явное резервирование URL-адресов, не содержащее подстановочных знаков. Короче говоря, если вы настроите HTTP.SYS так, чтобы он мог сопоставить префикс URL-адреса с любым Бронирование (включая динамические, созданные с помощью регистрации), тогда он либо доставит запрос в прослушивающее приложение (если остальные совпадают), либо вернет 404, если не сможет найти активного зарегистрированного слушателя.

Другое решение, которое может быть проще, - использовать саму службу IIS для управления отправкой 503. Для этого не останавливайте сайт, а вместо этого остановите связанные с ним пулы приложений. Это вызовет полное совпадение в HTTP.SYS (даже с резервированием URL-адресов wlidcard), но приведет к 503, потому что нет AppPool для доставки запроса.

Хорошо, после "приятных" нескольких часов с техподдержкой MS мы не пришли к единому мнению, является ли это ошибкой или нет, но мы согласны, что проблема связана с наличием "http: // + 5000 / Temporary_Listen_Address /"который добавлен WCF.

В качестве «обходного пути», если вы добавите более конкретный urlacl для своего сайта в формате: netsh http add urlacl url =http: // имя хоста: 80 / пользователь = сетевой сервис прослушивание = да делегат = да

тогда вы получите 503, а не 404. Я считаю, что это «ошибка», MS «проверяет» (не задерживая дыхание).

Для тех, кто столкнулся с этим, проблема №: REG: 112060473529066.

Есть ли активный Модуль HTTP установлен на экземпляре IIS, вы не знаете, какой захватывает все запросы?

Или вы забыли это, чтобы остановить Веб-сайт по умолчанию (который поставляется со стандартной установкой IIS) активен / запущен, то есть является пустая привязка.

Стандартная привязка веб-сайта по умолчанию пуста, что означает, что она принимает все заголовки узлов HTTP.

Хорошо, разобрался (но я думаю, что это ошибка, нужно сообщить в MS позже). Если я посмотрю на URLACL, перечисленные для HTTPSys, используя "netsh http show urlacl", я вижу регистрацию для "http: // +: 80 / Temporary_Listen_Address /". Это НЕ ДОЛЖНО совпадать с отправляемым мной запросом, но похоже, что оно совпадает. Согласно документации по UrlPrefix, он не будет совпадать, но согласно моим тестам, он соответствует.

Когда я создал новый сайт на порте 5000, не было регистрации для временного_слушивающего_адреса, все работало, как я ожидал. Если два сайта (разные заголовки хоста) работают на порте 5000, запрос остановленного сайта возвращает ошибку 400. Однако, если я затем зарегистрирую urlacl (netsh http add urlacl) "http: // +: 5000 / тест /"и запрашиваю что-то, что не соответствует этому префиксу URL, я получаю 404. Удалите регистрацию, и я снова получу 400.

Мне в целом нравится HTTPSys, но если вникнуть в него, это чертовски сложно. Обновим ответ с ответом MS позже. Я не вижу места на connect.microsoft.com, чтобы сообщить об этом, поэтому мне нужно позвонить.