Я пишу инструмент для офиса, позволяющий людям отправлять сопоставления для использования в rewriteMap
в файле web.config, и я пытаюсь проверить оба пути на соответствие правилам с помощью RegEx, но яКажется, я не могу охватить все основы, поэтому я ищу некоторую помощь в том, чтобы сделать 2 выражения максимально пуленепробиваемыми.
Общие требования к обоим выражениям
- Должно быть чувствительно к регистру, так как они будут использоваться (среди других мест) в атрибуте
input
HTML *1007*. - Должно быть таким же базовым, как возможно (ключевое слово,там) поскольку люди, которые могут их редактировать в будущем, будут иметь разную степень знаний RegEx - например, использование
[a-zA-Z0-9_]
вместо \w
. - Соответствие не должно включать протокол (
http
или https
) или домен (www.domain.tld
или domain.tld
). *
Выражение для key
(пути для перенаправления из)
Что у меня сейчас есть:
^[a-zA-Z0-9\-_].+?[a-zA-Z0-9\-_]$
Требования
- Не может начинаться или заканчиваться
/
. - Может быть каталогом или файлом.
- Может содержать пробелы.
- Может или не может бытьнесколько уровней глубоко в структуре каталогов.
- Невозможно начать с определенных (внутренне) зарезервированных имен каталогов - в настоящее время этот список включает только
administration
, но будет добавлена еще пара. **
В следующем (неисчерпывающем списке) приведено несколько примеров значений, которые мне нужно отклонить:
VALUE | SHOULD BE
---------------------------|--------------
/old | old
/old/dir_name/ | old/dir_name
https://www.domain.tld/old | old
domain.tld/file name.ext | file name.ext
administration | (reject completely)
administration/dir-name | (reject completely)
Выражение для value
(пути для перенаправления в)
То, что у меня сейчас есть:
^/(.+?/(.+?[a-zA-Z0-9])?)?$
- Должен начинаться с
/
. - Может быть каталогом или файлом (номы будем в первую очередь перенаправлять в каталоги.)
- Если каталог должен заканчиваться
/
. - Имена файлов всегда будут иметь расширение.
- Имена каталоговникогда не будет содержать
.
. - Может содержать пробелы.
- Может содержать несколько уровней в каталоге.cture или может быть корневым каталогом.
В следующем (неисчерпывающем списке) приведено несколько примеров значений, которые мне нужно отклонить:
VALUE | SHOULD BE
----------------------------|----------------
/new | /new/
new/dir_name | /new/dir_name/
https://www.domain.tld/new/ | /new/
domain.tld/file name.ext | /file name.ext
/new/dir.name/file_name.ext | (reject completely)
Соответствующийrule
из файла web.config (где Redirects
- это name
из rewriteMap
), если это уместно:
<rule name="rewriteMap">
<match url="^(.+?)/?$" />
<conditions>
<add input="{Redirects:{R:1}}" pattern="(.+)" />
</conditions>
<action type="Redirect" url="{C:1}" appendQueryString="false" />
</rule>
* I 'в настоящее время я работаю над этой частью RegEx;мне показалось, что лучше не включать его в мои примеры, поскольку он очень неполный.
** Это требование было добавлено только после того, как я начал писать этот вопрос, поэтому оно не рассматривается в примере RegEx.