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 делает две вещи для трафика, проходящего через него:
- Перенаправляет любой запрос на порт 80 (HTTP) на порт 443 (HTTPS) через HTTP 302 перенаправляет и перезаписывает URL.
- Переписывает любой ответ в браузер, чтобы выборочно переписать 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@}