Я установил обратный прокси-сервер в облачной службе Azure, используя правила перезаписи IIS и модуль маршрутизации запросов приложений (согласно инструкциям Вот. Все работает хорошо, за исключением вызовов конечных точек, которые я создал для загрузки файлов mp4. Эти конечные точки могут обслуживать частичное содержимое, если запрос содержит заголовок Range. Проблема, с которой я сталкиваюсь, заключается в том, что когда я напрямую попадаю на сервер, он правильно отвечает 206 (частичное содержимое) и правильным диапазоном байтов, но иногда, когда я попадаю в конечные точки через прокси-сервер, он отвечает 200 и полное содержимое файла, что вызывает ошибки при воспроизведении видео в Chrome.
Пример: При прямом обращении к серверу с таким запросом:
GET server.domain.com/api/adFile/fileName С заголовком: Диапазон: байты = 168-3922822
Я правильно получаю ответ 206. Вот некоторые из соответствующих заголовков в ответе:
При обращении к серверу через обратный прокси с таким запросом:
GET proxy.domain.com/api/adFile/fileName С заголовком: Диапазон: байты = 168-3922822
Я неправильно получаю код состояния 200 и полное содержимое файла. вот соответствующие заголовки из этого ответа:
Есть ли способ изменить поведение прокси в соответствии с поведением основного сервера (т.е. вернуть только запрошенное частичное содержимое)? Похоже, что он может кэшировать содержимое файла и обслуживать его все, когда запрошенный диапазон байтов близок к полному размеру файла.
Оказывается, решение этой проблемы не связано с изменением обратного прокси-сервера. В моей целевой службе отсутствовал заголовок ответа, который необходим, когда конечная точка способна обслуживать частичное содержимое: заголовок Accept-Ranges. Я изменил свою конечную точку, чтобы включить Accept-Ranges: байты в качестве заголовка ответа, который позволяет клиентам узнать, что конечная точка способна обслуживать частичное содержимое. Этот заголовок ответа включается независимо от того, запрашивается ли частичное содержимое или полное содержимое. Тот факт, что этот заголовок отсутствовал, должен был сбивать прокси-сервер, заставляя его думать, что ему нужно вернуть весь файл. В любом случае исправить это было просто, и теперь мой прокси-сервер успешно обрабатывает запросы на частичное содержимое!