У меня есть сайт asp.net. Это имеет бланк заявки, который доступен в https://secure.example.com/order.aspx. Ссылки на сайт не включают доменное имя. Таким образом, например, домашняя страница является 'default.aspx'.
Проблема - то, что, если я нажимаю на ссылку как домашняя страница от защищенной страницы, URL становится https://secure.example.com/default.aspx вместо http://www.example.com/default.aspx.
Что хороший путь состоит в том, чтобы обработать это? Схема должна автоматически работать с помощью любого доменного имени на основе того, откуда это запускается. Таким образом, если сайт запускается от 'localhost', переезжающего от защищенной страницы, URL должен быть http://localhost/...
Навигационные ссылки находятся на основной странице.
Думаю, лучшим решением для этого будет http-модуль.
Самая простая реализация приведена ниже. Переменная useUnsecureConnection
содержит значение, указывающее, требуется ли отойти (должно быть рассчитано самостоятельно).
public class SecurityModule : IHttpModule
{
#region IHttpModule Members
public void Dispose()
{
}
public void Init(HttpApplication application)
{
application.BeginRequest += new EventHandler(application_BeginRequest);
}
#endregion
#region Events Handling
protected void application_BeginRequest(object sender, EventArgs e)
{
HttpApplication application = ((HttpApplication)(sender));
HttpRequest request = application.Request;
HttpResponse response = application.Response;
// here should be you condition to determine
// whether to move away from secure page or not
bool useUnsecureConnection = true;
if (useUnsecureConnection && request.IsSecureConnection)
{
string absoluteUri = request.Url.AbsoluteUri;
response.Redirect(absoluteUri.Replace("https://", "http://"), true);
}
}
#endregion
}
И, конечно же, не забудьте зарегистрировать модуль в своем web.config:
<httpModules>
<!--Used to redirect secure connections to the unsecure ones
if necessary-->
<add name="Security"
type="{YourNamespace}.Handlers.SecurityModule,
{YourAssembly}" />
...
</httpModules>
</system.web>
Кстати, для localhost
условие может выглядеть так:
useUnsecureConnection = request.IsLocal;
который будет истинным
, если IP-адрес отправителя запроса 127.0.0.1
или если IP-адрес запроса совпадает с IP-адресом сервера.