F5 Networks iRule/Tcl - выход из Юникода 6-символьных escape-последовательностей, поэтому они обрабатываются как и повторно вставляются как 6-символьные последовательности?

Мы пытаемся заставить F5 BIG-IP LTM iRule правильно работать с SharePoint 2007 в роли завершения SSL. Эта архитектура выгружает всю обработку SSL на F5, а F5 перенаправляет интерактивные запросы / ответы на интерфейсные серверы SharePoint только через HTTP (через защищенную сеть).

Для целей этого обсуждения iRules анализируются механизмом интерпретации Tcl на устройстве BIG-IP F5 Networks.

Таким образом, F5 делает две вещи для трафика, проходящего через него:

  1. Перенаправляет любой запрос на порт 80 (HTTP) на порт 443 (HTTPS) через HTTP 302 перенаправляет и перезаписывает URL.
  2. Переписывает любой ответ в браузер, чтобы выборочно переписать URL-адреса, встроенные в HTML, чтобы они перешли на порт 443 (HTTPS). Это предотвращает разрыв перенаправления 302 DHTML, созданный SharePoint.

У нас часть 1 работает нормально.

Основная проблема, связанная с частью 2, заключается в том, что при перезаписи ответа из-за пространств имен XML и других подобных проблем не ВСЕ совпадения для "http:" можно изменить на "https:". Некоторые должны остаться "http:". Кроме того, некоторые URL-адреса "http:" сложны тем, что они живут в сгенерированном SharePoint JavaScript, а их косые черты (например, "/") фактически представлены в HTML 6-символьной строкой UNICODE, "\u002f".

Например, в случае с этими хитрыми литеральная строка в исходящем HTML:

http:\u002f\u002fservername.company.com\u002f

И должен быть изменен на:

https:\u002f\u002fservername.company.com\u002f

В настоящее время мы даже не можем понять, как получить совпадение в выражении поиска / замены для этих строковых литералов последовательности UNICODE. Кажется, что независимо от того, как мы его нарезаем, интерпретатор Tcl интерпретирует строку "\ u002f" в перевод "/", прежде чем он сделает что-либо еще.

Мы пробовали различные комбинации методов экранирования Tcl, о которых мы знаем (в основном двойные кавычки и использование дополнительного символа "\" для экранирования "\" в строке UNICODE), но ищем больше методов, предпочтительно тех, которые работают.

У кого-нибудь есть идеи или указания, где мы можем эффективно самообучаться по этому поводу?

Большое спасибо заранее.

5 ответов

То, что вы пытаетесь сделать, не рекомендуется с SharePoint.

Рекомендуемый подход заключается в использовании карт альтернативного доступа внутри SharePoint. Вы создадите публичный URL-адрес https:// и получите внутреннее имя http://.

Это приведет к тому, что все URL на вашей странице будут созданы с использованием https://

Вы можете спросить об этом на ServerFault http://faultserver.ru, если вам не нравится ответ.

@JD, я, наверное, должен был добавить это:

Соответствующее веб-приложение SharePoint в настоящее время размещается на физическом сервере и ферме SharePoint, которая интегрирована (в другие веб-приложения) со службами отчетов SQL Server 2005 (SSRS) и PerformancePoint 2007 (PPS). Оба продукта НЕ поддерживают сопоставления альтернативного доступа (AAM).

Хотя это правда, что веб-приложение, с которым мы хотим выполнить вышеизложенное, не интегрировано с SSRS или PPS, наш архитектор и наши технические специалисты предпочли бы вообще избегать использования AAM в этой среде, если это вообще возможно.

Так что, в принципе, я согласен с вашим ответом, в этом случае я прошу об особом исключении и прошу о том, чтобы Tcl и UNICODE избежали, в частности, потому что я и наши другие технические стратеги считаем, что это правильный ответ в данной конкретной ситуации.

Для дальнейшего использования, так как это появилось недавно...

Sharepoint Access Mappings является наиболее чистым решением.

Для iRule BIG-IP вы можете попробовать что-то вроде этого. Обратите внимание, что TCL должен интерпретировать символы Юникода, прежде чем он сможет соответствовать им.

when HTTP_REQUEST {
    # Disable the stream filter by default
    STREAM::disable
}
when HTTP_RESPONSE {
    if {[HTTP::header value Content-Type] contains "text"}{
        set find_str "http:\u002f\u002fservername.company.com\u002f"
        set replace_str "https:\u002f\u002fservername.company.com\u002f"

        STREAM::expression "@$find_str@$replace_str@"
        STREAM::enable
    }
}

Аарон

Я ничего не знаю о sharepoint, но, по крайней мере, с точки зрения чистого tcl, ниже показано, как соответствовать вашей литеральной строке:

tclsh> set string {http:\u002f\u002fservername.company.com\u002f}
http:\u002f\u002fservername.company.com\u002f
tclsh> regexp {http:\\u002f} $string
1

Важно убедиться, что обратный слеш в \u002f не интерпретируется синтаксическим анализатором tcl (путем включения шаблона в {}), а также убедиться, что обратный слеш не интерпретируется синтаксическим анализатором регулярных выражений (путем его экранирования). с обратной косой чертой).

Заменить \123\abc на \456\def

STREAM:: выражение {@\\123@\456@ @\\abc@\def@}

Другие вопросы по тегам