ОК, поэтому, если вы хотите, чтобы Сайт был доступен через DNS-имя, но не через IP-адрес, единственный способ определить это - проверить запрошенное имя хоста в заголовке. Есть два способа сделать это, о которых я знаю:
1) Диалоговое окно «Настройка привязок» в диспетчере IIS. Это самая простая настройка, но она не работает для HTTPS. Просто введите www.domain.com в поле имени хоста, и запросы на IP будут отклонены. Для HTTPS, если ваш сертификат безопасности предназначен для определенного имени хоста, пользователь получит предупреждение безопасности, если он попытается подключиться через IP, но обычно он может переопределить предупреждение (в зависимости от настроек браузера).
Редактировать: Крис Лайвли (Chris Lively) связал способ заставить этот метод работать и для привязок HTTPS, см. Его ответ для получения дополнительной информации.
2) Вы также можете просмотреть заголовок в коде. Вот пример IHttpModule
, который выполняет то, что вы хотите. Это также встроенное решение, настроенное в web.config.
Код:
Public Class HostNameCheck
Implements IHttpModule
Public Sub Dispose() Implements System.Web.IHttpModule.Dispose
End Sub
Public Sub Init(context As System.Web.HttpApplication) Implements System.Web.IHttpModule.Init
AddHandler context.BeginRequest, AddressOf context_BeginRequest
End Sub
Private Sub context_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
Dim objApp As HttpApplication = DirectCast(sender, HttpApplication)
If objApp.Request.Url.Host <> ConfigurationManager.AppSettings("AcceptedHostName") Then
objApp.Response.Clear()
objApp.Response.StatusCode = 403
objApp.Response.SubStatusCode = 6
objApp.Response.Flush()
End If
End Sub
End Class
Web.config:
<configuration>
<appSettings>
<add key="AcceptedHostName" value="www.domain.com"/>
</appSettings>
<system.webServer>
<modules>
<add name="HostNameCheck" type="HostNameCheck"/>
</modules>
</system.webServer>
</configuration>