I recently needed to force a PDF to download using Apache. The default behaviour for most browsers is to try to open the PDF inside the browser itself. This is fine for a small PDF or for powerful machines - but a large PDF on even a modest machine can often lock the browser up. This needed fixing!
Little R&D of the Apache documents, you can get FilesMatch option which takes Regular Expressions. Initially I used something like this...
This worked PERFECTLY - except some files had upper-case extensions and some had lower and I could see situations in the future where combinations of upper and lower case would be used too - just to piss me off! Because of this, not even this would work...
That would match perfectly - as long as it was an EXACT match on upper OR lower case.
I was reaching the end of my patience - that is until I read the Using Character Classes on PerlDoc.
This showed me that I could force the RegEx (short for Regular Expressions) to match in a case-insensitive manner. This lead me to the following...
However this only worked in proper browsers - and the bulk of the world are sadistic enough to use Internet Explorer based ones. For some reason, if Internet Explorer see's the content type "Application/PDF" it will simply open it up in the reader. The solution? Why not pretend its a bog standard Octet Stream, just like a Zip file? After all, that's basically all it is; a binary file... A steam of bytes.
And there you have it… A perfectly working modification to force all PDF files to download - this will work for any file extensions you chose to put into the FilesMatch argument!
Impotant Note :
Little R&D of the Apache documents, you can get FilesMatch option which takes Regular Expressions. Initially I used something like this...
<files *.pdf=""></files><br />
<files *.pdf=""> ForceType application/pdf</files><br />
<files *.pdf=""> Header set Content-Disposition attachment</files><br />
<filesmatch \.(pdf|pdf)=""></filesmatch>
<filesmatch \.(pdf|pdf)=""> ForceType application/pdf</filesmatch><filesmatch \.(pdf|pdf)=""> Header set Content-Disposition attachment</filesmatch>
I was reaching the end of my patience - that is until I read the Using Character Classes on PerlDoc.
This showed me that I could force the RegEx (short for Regular Expressions) to match in a case-insensitive manner. This lead me to the following...
<filesmatch \.(?i:pdf)$=""></filesmatch>
<filesmatch \.(?i:pdf)$=""> ForceType application/pdf</filesmatch><filesmatch \.(?i:pdf)$=""> Header set Content-Disposition attachment</filesmatch>
<FilesMatch "\.(?i:pdf)$">
ForceType application/octet-stream
Header set Content-Disposition attachment
FilesMatch>
Impotant Note :
You can put this code in either the htaccess or the vhost configuration for your server.
You can read more about FilesMatch at the Apache Document page.
You can read more about FilesMatch at the Apache Document page.
No comments:
Post a Comment