Принудительно загрузить файл в IIS7
Используя IIS7, можно ли заставить клиентский браузер загружать файл, а не пытаться отобразить его в браузере? В моем случае я хочу заставить браузеры загружать все видеофайлы MP4.
2 ответа
Я нашел ответ из этого блога.
Используя модуль IIS7 Url Rewrite, вы можете изменить Content-Disposition
заголовок, который будет предлагать загружать браузер, а не пытаться отобразить файл.
Использование IIS Manager (mp4 в качестве примера)
- Убедитесь, что вы включили модуль перезаписи URL для IIS7
- Откройте диспетчер IIS7
- Перейдите на сайт (или суб-сайт), с которого вы хотите принудительно загрузить файлы.
- В представлении "Функции" выберите "Перезаписать URL".
- В правом столбце выберите "Просмотр предварительных условий"
- Добавьте следующее предварительное условие
- Имя: FileIsMP4
- Использование: регулярные выражения
- Логическая группировка: соответствовать всем
- Входной вклад:
{REQUEST_FILENAME}
- Проверьте, если входная строка: соответствует шаблону
- Шаблон:
\.mp4$
- Вернитесь к списку правил перезаписи URL и добавьте следующее исходящее правило.
- Название: Force Download For MP4s
- Условие: FileIsMP4
- Match - соответствие области: переменная сервера
- Соответствие - имя переменной: RESPONSE_Content-Disposition
- Match - значение переменной: соответствует шаблону
- Match - Использование: Регулярные выражения
- Match - Pattern: .*
- Матч - Игнорировать Кейс - да
- Условия - Логическая группировка: Match All
- Условия - Вход:
{REQUEST_FILENAME}
- Условия - Тип: соответствует шаблону
- Условия - Шаблон:
(.*)\\([^/]+)\.mp4$
- Условия - Отслеживание групп захвата по условиям: да
- Действие - Тип действия: Переписать
- Действие - Свойства действия -
Value: attachment; filename={C:2}.mp4
- Действие - заменить существующее значение серверной переменной: да
- Действие - Остановить обработку последующих правил: нет
Изменить Web.Config
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
...
<rewrite>
<outboundRules>
<rule name="Forcing Download for MP4s" preCondition="FileIsMP4">
<match serverVariable="RESPONSE_Content-Disposition" pattern=".*" />
<conditions>
<add input="{REQUEST_FILENAME}" pattern="(.*)\\([^/]+)\.mp4$" />
</conditions>
<action type="Rewrite" value="attachment; filename={C:2}.mp4" />
</rule>
<preConditions>
<preCondition name="FileIsMP4">
<add input="{REQUEST_FILENAME}" pattern="\.mp4$" />
</preCondition>
</preConditions>
</outboundRules>
</rewrite>
...
</system.webServer>
</configuration>
Спасибо, это именно то, что мне было нужно. Я немного изменил его, чтобы добавить возможность указать, загружать файл или нет, добавив строку запроса "? Download=yes".
<outboundRules>
<rule name="Force download with query string" preCondition="DownloadableFileTypes">
<match serverVariable="RESPONSE_Content-Disposition" pattern=".*" />
<conditions>
<add input="{REQUEST_FILENAME}" pattern="(.*)\\([^/]+)\.(.+)$" />
<add input="{QUERY_STRING}" pattern="^.*download=yes.*$" />
</conditions>
<action type="Rewrite" value="attachment; filename={C:2}.{C:3}" />
</rule>
<preConditions>
<preCondition name="DownloadableFileTypes" logicalGrouping="MatchAny">
<add input="{REQUEST_FILENAME}" pattern="\.mp3$" />
<add input="{REQUEST_FILENAME}" pattern="\.pdf$" />
<add input="{REQUEST_FILENAME}" pattern="\.doc$" />
<add input="{REQUEST_FILENAME}" pattern="\.docx$" />
<add input="{REQUEST_FILENAME}" pattern="\.xls$" />
<add input="{REQUEST_FILENAME}" pattern="\.xlsx$" />
<add input="{REQUEST_FILENAME}" pattern="\.mp4$" />
</preCondition>
</preConditions>
</outboundRules>