IIS Url Rewrite: как обрабатывать srcset источника изображения? - PullRequest
1 голос
/ 04 августа 2020

У меня есть сайт, на котором я выполняю обратное проксирование с помощью IIS UrlRewrite. До сих пор мне это было довольно легко благодаря трем статьям Пола Кочубы о Техническом сообществе Microsoft .

Моя текущая проблема связана с группой URL-адресов в <picture><source srcset, которые являются сильно сокращенными:

<source srcset="/a/b/c/d/e/en/g/h/thumb%20classes%202020_SX_MX.component.crop-3x2-5.ts=1592419103694.jpg/a/c/d/oceania/au/en/g/jcr:a/root/z_1_col/z_4_col/image_1558468008 1400w,
/a/b/c/d/e/en/g/h/thumb%20classes%202020_SX_MX.component.crop-3x2-6.ts=1592419103694.jpg/a/c/d/oceania/au/en/g/jcr:a/root/z_1_col/z_4_col/image_1558468008 2000w,
/a/b/c/d/e/en/g/h/thumb%20classes%202020_SX_MX.component.crop-3x2-7.ts=1592419103694.jpg/a/c/d/oceania/au/en/g/jcr:a/root/z_1_col/z_4_col/image_1558468008 2800w,
/a/b/c/d/e/en/g/h/thumb%20classes%202020_SX_MX.component.crop-3x2-1.ts=1592419103694.jpg/a/c/d/oceania/au/en/g/jcr:a/root/z_1_col/z_4_col/image_1558468008 350w,
/a/b/c/d/e/en/g/h/thumb%20classes%202020_SX_MX.component.crop-3x2-2.ts=1592419103694.jpg/a/c/d/oceania/au/en/g/jcr:a/root/z_1_col/z_4_col/image_1558468008 460w,
/a/b/c/d/e/en/g/h/thumb%20classes%202020_SX_MX.component.crop-3x2-3.ts=1592419103694.jpg/a/c/d/oceania/au/en/g/jcr:a/root/z_1_col/z_4_col/image_1558468008 700w,
/a/b/c/d/e/en/g/h/thumb%20classes%202020_SX_MX.component.crop-3x2-4.ts=1592419103694.jpg/a/c/d/oceania/au/en/g/jcr:a/root/z_1_col/z_4_col/image_1558468008 920w" 
media="(max-width: 768px)" 
sizes="(max-width: 768px) 100vw">

Как преобразовать все пути, начинающиеся с /a/b/c, в https://othersite/a/b/c? В худшем случае я мог бы написать регулярное выражение, которое захватывает фиксированное количество путей (скажем, 7), а затем переписывает их с {R: 1} по {R: 7}, но я не уверен на данный момент, будет ли количество элементов в каждом srcset фиксировано.

Кроме того, мне нужно создать собственный тег, чтобы он соответствовал <source srcset=?

1 Ответ

3 голосов
/ 04 августа 2020

Это сработало, и я весьма удивлен. Я все еще не получаю ожидаемого ответа от страницы (некоторые изображения все еще не рисуются), но по крайней мере HTML кажется правильным.

Прежде всего, я ' Мы объявили собственный тег

<customTags>
    <tags name="sourceSrcset">
        <tag name="source" attribute="srcset" />
    </tags>
</customTags>

Затем я написал правило для исходящего трафика, чтобы использовать его

<rule name="source srcset" preCondition="ResponseIsTextHtml">
    <match filterByTags="CustomTags" customTags="sourceSrcset" pattern=",?\/(a\/b\/\S+\s\d+w)" />
    <action type="Rewrite" value="https://othersite/{R:1}" />
</rule>

Если вам интересно, у ResponseIsTextHtml есть брат по имени ResponseIsTextAnything и они указаны как

<preCondition name="ResponseIsTextHtml">
    <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
</preCondition>
<preCondition name="ResponseIsTextAnything">
    <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/(.+)" />
</preCondition>
...