Перезапись URL-адресов Azure CDN Premium Verizon Rules Engine V4 для подкаталогов статического веб-сайта хранилища
Я пытаюсь провести Angular
проект с Azure Storage Static Website
через Azure CDN Verizon Premium
Допустим, у меня есть контейнеры для каждого Angular
сборки, названные как v0.3.13.3
и в этом контейнере также есть многоязычные сборки проекта angular.
Я пытаюсь достичь правильного index.html
с правильной маршрутизацией для каждой версии и языка.
Вы можете найти примеры маршрутов ниже:
my.domain.com/v0.3.13.3
должен служить /v0.3.13.3/index.html
my.domain.com/v0.3.13.3/dashboard
должен служить /v0.3.13.3/index.html
my.domain.com/v0.3.13.3/fr
должен служить /v0.3.13.3/fr/index.html
my.domain.com/v0.3.13.3/fr/dashboard
должен служить /v0.3.13.3/fr/index.html
Мне удалось сделать это с Azure Standard Rules Engine
как на скриншоте ниже.
Но, насколько я понял из документации, в стандартном движке правил Contains
поле не может быть заполнено регулярным выражением. Я покопался по всему Google, но не нашел подходящего мне решения.
Итак, я переключил свою службу CDN на Verizon Premium и попытался подать заявку (v(?:(\d+)\.)?(?:(\d+)\.)?(?:(\d+)\.\d+))
для пути к регулярному выражению.
Основная проблема, с которой я столкнулся с Verizon Premium, заключается в том, что я могу подавать только URL Rewrite
функция, если я указываю свое поле IF как Always
Как вы видете URL Rewrite
нет в списке.
Также я сделал несколько развертываний, используя Always
заявление, но они не сделали ничего хорошего.
Единственный пример, которым все делятся в своих блогах
Таким образом, приведенный выше пример не охватывает расширения файлов и суб-маршруты.
Есть ли способы достичь моей цели?
Заранее спасибо.
3 ответа
Я хотел бы поделиться своей текущей конфигурацией, которую я использую в Verizon Premium в правиле V4: шаги:
- Новое правило: Общее Всегда
- Функция: URL-адрес -> перезапись URL-адреса
- Источник:
/80XXXXXX/XXXXXX/((?:[^\?]*/)?)($|\?.*)
- Назначения:
- И добавьте второе правило. Источник:
/80XXXXXX/XXXXXX/((?:[^\?]*\/)?[^\?\/.]+)($|\?.*)
- Назначения:
/80XXXXXX/XXXXXX/index.html$2
Также вы можете получить происхождение, как описано здесь /questions/53019080/polzovatelskoe-pravilo-perezapisi-azure-cdn-verizon-nedopustimoe-proishozhdenie/53019085#53019085
Это правило XML было сгенерировано
<policy>
<rules>
<rule>
<match.always>
<feature.url.url-rewrite source="/80XXXXXX/XXXXXX/((?:[^\?]*/)?)($|\?.*)" destination="/80XXXXXX/XXXXXX/index.html$2"/>
<feature.url.url-rewrite source="/80XXXXXX/XXXXXX/((?:[^\?]*\/)?[^\?\/.]+)($|\?.*)" destination="/80XXXXXX/XXXXXX/index.html$2"/>
</match.always>
</rule>
</rules>
</policy>
Я надеюсь, что это поможет кому-то
В марте 2022 года я немного потрудился над этой проблемой, используя V4 механизма правил. Наконец-то я заставил перенаправление работать, продублировав перенаправления для учета обоих хэшей для исходного сервера, начиная с 00 и 08 в моем случае. Такое ощущение, что CDN использует сине-зеленую методологию развертывания, и каждый раз, когда вы развертываете, он переключается на другой сервер.
Поэтому, если вы развертываете с использованием хэша, начинающегося с 00, ваше развертывание переместится на сервер 08.
Затем вы пытаетесь выполнить развертывание с использованием хэша 08, а система жалуется, что вы ничего не изменили. :)
Так что я просто продублировал код и плакал в подушку по ночам.
Для справки, если вы попытаетесь развернуть в разделе «feature.url.url-redirect source» с помощью регулярного выражения, содержащего что-то вроде /[0-9]+, когда вы измените черновик на политику , система будет жаловаться, что источник не соответствует ни одному известному происхождению.
Это то, что сработало для меня. Если у кого-то есть более элегантное решение, я приветствую его!
<policy>
<rules>
<rule>
<description>Redirect HTTP to HTTPS 00 Version</description>
<match.request.request-scheme.literal value="http">
<feature.url.url-redirect source="/00XXXXXX/www-example-com/(.*)" destination="https://%{host}/$1" code="302"/>
</match.request.request-scheme.literal>
</rule>
<rule>
<description>Redirect HTTP to HTTPS 80 Version</description>
<match.request.request-scheme.literal value="http">
<feature.url.url-redirect source="/80XXXXXX/www-example-com/(.*)" destination="https://%{host}/$1" code="302"/>
</match.request.request-scheme.literal>
</rule>
<rule>
<description>Site redirects to 00 Version</description>
<match.request.request-scheme.literal value="https">
<select.first-match>
<match.url.url-path.regex result="match" value="[\/#]*\/dir1\/subdir1.*" ignore-case="true" encoded="false">
<feature.url.url-redirect source="/00XXXXXX/www-example-com/.*" destination="https://www.example.com/#/dir1/subdir1" code="302"/>
</match.url.url-path.regex>
<match.url.url-path.regex result="match" value="[\/#]*\/folder2\/subfolder2.*" ignore-case="true" encoded="false">
<feature.url.url-redirect source="/00XXXXXX/www-example-com/.*" destination="https://www.example.com/#/folder2/subfolder2" code="302"/>
</match.url.url-path.regex>
<match.url.url-path.regex result="match" value=".*" ignore-case="true" encoded="false">
<feature.url.url-redirect source="/00XXXXXX/www-example-com/.*" destination="https://www.example.com/" code="302"/>
</match.url.url-path.regex>
</select.first-match>
</match.request.request-scheme.literal>
</rule>
<rule>
<description>Site redirects to 80 Version</description>
<match.request.request-scheme.literal value="https">
<select.first-match>
<match.url.url-path.regex result="match" value="[\/#]*\/dir1\/subdir1.*" ignore-case="true" encoded="false">
<feature.url.url-redirect source="/80XXXXXX/www-example-com/.*" destination="https://www.example.com/#/dir1/subdir1" code="302"/>
</match.url.url-path.regex>
<match.url.url-path.regex result="match" value="[\/#]*\/folder2\/subfolder2.*" ignore-case="true" encoded="false">
<feature.url.url-redirect source="/80XXXXXX/www-example-com/.*" destination="https://www.example.com/#/folder2/subfolder2" code="302"/>
</match.url.url-path.regex>
<match.url.url-path.regex result="match" value=".*" ignore-case="true" encoded="false">
<feature.url.url-redirect source="/80XXXXXX/www-example-com/.*" destination="https://www.example.com/" code="302"/>
</match.url.url-path.regex>
</select.first-match>
</match.request.request-scheme.literal>
</rule>
</rules>