Переписать URL-адреса на странице HTTPS в HTTP - PullRequest
2 голосов
/ 06 февраля 2012

Используя функцию «привязок» IIS7, я добавил сертификат SSL в корне моего сайта в «https» (порт 443). Затем мне потребовалось соединение SSL для определенного каталога, '/ secure-directory /'. Теперь я могу перенаправить в этот каталог, явно указав ссылку на адрес https: https://www.mysite.com/secure-directory/. Проблема в том, что / secure-directory / - это единственный каталог, который я хочу использовать SSL, и он содержит навигационные ссылки, которые сейчас поддерживают Префикс https, поэтому моя ссылка «Домой» теперь указывает на https://www.mysite.com вместо http://www.mysite.com.

Каков идеальный способ сохранить префикс http для ссылок в / secure-directory /? У меня есть модуль перезаписи URL IIS7, поэтому, если кто-то может поделиться исходящим правилом, это будет очень цениться. В противном случае я хотел бы знать, поступаю ли я по этому поводу совершенно неправильно, или есть ли лучшее решение, чем правило переписывания. Спасибо.

Ответы [ 4 ]

2 голосов
/ 07 февраля 2012

Я использую этот модуль .Вы можете настроить / secure-directory / как доступ только через https

<secureWebPages>
    <directories>
        <add path="secure-directory" />
    </directories>
</secureWebPages>
2 голосов
/ 07 февраля 2012

Я обычно использую что-то подобное, и это всегда работало для меня. (Не совсем уверен, что это лучший способ).

Вы можете иметь такую ​​функцию в global.asax и вызывать в Application_BeginRequest

private void RedirectToCorrectSSLScheme()
    {
        Uri pageRequest = Request.Url;
        string requestPath = pageRequest.GetLeftPart(UriPartial.Path).ToLower();

        requestPath = Server.UrlDecode(requestPath);
        // PageIsSecure returns if the given page should be secure or not. I 
       //maintain a list of secure pages or 
       //secure directory in an XML config.  
        bool securePage = GetSecurePages().PageIsSecure(requestPath);
        if (pageRequest.Scheme == "https" && !securePage && requestPath.Contains(".aspx"))
        {
            Response.Redirect("http://" + pageRequest.Host + pageRequest.PathAndQuery, true);
        }
        else if (pageRequest.Scheme == "http" && securePage && requestPath.Contains(".aspx"))
        {
            Response.Redirect("https://" + pageRequest.Host + pageRequest.PathAndQuery, true);
        }
    }
0 голосов
/ 08 февраля 2012

Спасибо за ответы.Я подумал о внедрении global.asax и модульных решений, но в итоге мне лучше всего подошло правило перезаписи исходящего трафика.Я могу вернуться к этому позже и пересмотреть мою ситуацию, но сейчас это то, что я использую (с удаленным портом 1860 для производства):

<rule name="ForceHttpsToHttp" preCondition="ResponseIsHtml1">
    <match filterByTags="A, Img" pattern="^(?!.*javascript).*$" />
        <conditions>
            <add input="{HTTPS}" pattern="ON" />
            <add input="{SERVER_PORT}" pattern="443" />
        </conditions>
    <action type="Rewrite" value="http://{HTTP_HOST}:1860{R:0}" />
</rule>

(шаблон предотвращает перезаписьна событиях щелчка на стороне сервера, тогда как (. *) переписывает и прерывает их)

0 голосов
/ 06 февраля 2012

Это не проблема перезаписи URL, IMO. Но вы можете, по крайней мере теоретически (время POC?), Написать другое правило перезаписи, которое переходит обратно на не-SSL. Однако сценарий перезаписи не так масштабируем, поскольку он вызывает два попадания каждый раз, когда человек переворачивается. Это может или не может быть проблемой, в зависимости от нормального использования приложения.

Простой способ справиться с этим - переопределить элементы управления меню, чтобы вы могли соблюдать конфигурацию. Это будет означать, что в меню используются абсолютные ссылки для другой реализации (абсолютные для SSL, если не SSL, и наоборот).

Если вам нужно что-то более «промышленное», рассмотрите возможность добавления обработчика HTTP в «конвейер» и управления там SSL или не-SSL. Я бы прошел через это тщательно, чтобы вы не закончили заново изобретать колесо (не придуманный здесь синдром) и попытались бы сделать это абстракцией многократного использования. Это немного сложнее, но может оказаться проще повторить при переходе к другому решению. Сначала я посмотрю и посмотрел, есть ли кто-нибудь из таких обработчиков с открытым исходным кодом, поскольку это не редкая проблема.

Я уверен, что есть и другие способы взглянуть на это.

...