Принудительная загрузка с использованием <filesMatch> в htaccess в корне WWW

Я пытаюсь принудительно загрузить все файлы из одной папки.

Ссылка на страницу выглядит следующим образом:

<a href="#" onclick="location.href='http://example.com/uploads/documents/file.pdf'; return false;">Click to download</a>

И у меня есть этот фрагмент в моем .htaccess

<filesMatch ".*uploads/documents.*">
    ForceType application/octet-stream
    Header set Content-Disposition attachment
</filesMatch>

Я уже знаю, что 2 строки внутри тега работают, потому что он работает, когда я помещаю .htaccess прямо в папку, где я хочу принудительно загрузить следующий код:

<Files *.*>
    ForceType application/octet-stream
    Header set Content-Disposition attachment
</Files>

Кажется, что-то, что я не понимаю в теге filesMatch.

Ответ 1

Пожалуйста, ознакомьтесь с документацией для FilesMatch и Files, соответственно. В нем четко указано

Директивы, приведенные в этом разделе, будут применены к любому объекту с базовым именем (последний компонент имени файла), соответствующим указанному имя файла.

Это означает, что в вашем примере оно соответствует file.pdf. Второй пример *.* соответствует file.pdf, однако в вашем первом примере .*uploads/documents.* нет. Это на самом деле никогда не может совпадать, поскольку в нем содержится косая черта, которая используется как разделитель каталогов.

Если вы можете отредактировать конфигурацию apache

В директиве Location вы должны заключить <Files *.*> или <Files *.pdf> (в зависимости от того, что вы хотите обеспечить загрузку):

<Location "/uploads/documents/">
    <Files *.*>
        ForceType application/octet-stream
        Header set Content-Disposition attachment
    </Files>
</Location>

Если вы не можете отредактировать конфигурацию apache

К сожалению, директива Location не разрешена внутри файлов .htaccess. Просто создайте .htaccess внутри своего каталога /uploads/documents/.

Ответ 2

Поиск более узнал этот код:

<FilesMatch "\.(mov|mp3|jpg|pdf|mp4|avi|wmv)$">
   ForceType application/octet-stream
   Header set Content-Disposition attachment
</FilesMatch>

Работал для меня.

Ответ 3

Этот код идеален, если вы не используете - в имени файла!

Например, для имени-1.mp3 измените на name1.mp3

<FilesMatch "\.(mp3|avi)$" >
    ForceType application/octet-stream
    Header add Content-Disposition "attachment"
</FilesMatch>

Очистите браузер и проверьте его.