A fresh mix of code snippets and tutorials

Force file download with .htaccess

Here is a quick .htaccess snippet that will force files to download instead of displaying in the browser. This method works for any site running on an Apache server.

Force downloads

By default, PDF documents, text files, and other types of files are displayed in the browser instead of being downloaded to the user’s local machine. The reason for this is the default MIME type set by Apache, which instructs the browser to display instead of download. Fortunately, the default MIME type can be changed by adding the following line in your site’s root .htaccess file:

AddType application/octet-stream pdf

This will change the behavior of the file so it is downloaded instead of displayed in the browser. You can change the file type from PDF to whatever by editing the pdf to match whichever extension is desired. Multiple file types may be specified like so:

AddType application/octet-stream pdf txt doc

Here we have added three extensions, pdf, txt, and doc. So when this code is added to the root .htaccess, PDF, TXT, and DOC files will be downloaded instead of displayed.

Getting more specific

If you need to force download for a specific file (instead of all files of a type), you can use Apache’s <Files> directive, like so:

<Files magazine.pdf>
	AddType application/octet-stream pdf

This will match only files named magazine.pdf in any directory and force them to download. To match only files contained in a specific directory, simply move the code to the .htaccess file located in that directory. If the desired directory does not contain an .htaccess file, you can create one.

Multiple file types

Here is another similar example that shows how to force download for multiple file types, plus sends an additional header to make it all good.

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

Here we are matching any file that has an extension of .mov, .mp3, .jpg, or .pdf. You can add or remove extensions by editing the regular expression used in FilesMatch. If the current file matches one of the extensions in the list, it will be sent as an application/octet-stream via the ForceType directive. Additionally, we send along a header that sets the Content-Disposition as an attachment.

Learn more

.htaccess made easy