Вам, вероятно, следует заменить .*?
на [^#?]*?
, чтобы избежать совпадения частей запроса или фрагмента URL-адреса, или использовать urllib.parse
для выделения части пути.
Кроме того, помните о ..
последовательностях в URL.
r'^mid/(?P<mid_id>\d+)/file/(?P<file_name>.*?)/$'
соответствует
mid/1/file/../../../../etc/
, что находится вне дерева подкаталогов mid/1/file
.
Вы можете сделать
os.path.normpath(path)
перед запуском регулярного выражения, которое должно отклонить вышеизложенное, поскольку
os.path.normpath('mid/1/file/../../../../etc/')
равно
../etc
, но вам придется удалить /
до $
и normpath
могут вести себя по-другому на компьютерах с Windows, чем на * nix.Я не знаю ни одного эквивалента normpath
в модуле urllib
.