The error that I get is from PHP because APACHE is tryng to pass the .zip file through the PHP interpreter.
But this post is not regarding any PHP script, or setting up headers from PHP to make the file download. It is about preventing APACHE from passing the file through PHP and generate a download instead.
I have found a few answers that involve adding File Exceptions on the .htaccess but still without success and I get the follwing Parse error message:
Parse error: in /home/user/public_html/downloads/files/1/test-file-132110.zip on line 431
These are the .htaccess instructions that I found that work:
<Location "/downloads/files/">
<Files *.*>
ForceType application/octet-stream
Header set Content-Disposition attachment
</Files>
</Location>
The previous example is not so great because I want to chose specific extensions, lile doc, zip, etc. So I tried these instead:
<Location "/downloads/files/">
<FilesMatch ".(?i:doc|docx|xls|xlsx|ppt|pptx|zip|rar)$">
ForceType application/octet-stream
Header set Content-Disposition attachment
</FilesMatch>
</Location>
or this, without specifying a location:
<FilesMatch "\.(doc|docx|xls|xlsx|ppt|pptx|zip|rar)$">
ForceType application/octet-stream
Header set Content-Disposition attachment
</FilesMatch>
A short explanation of what I'm doing is: I need to automatically create virtualhosts for each ip address on my machine, make it point to the vsftpd user directory (/home/xxx) and deny any kind of scripts from being executed.
I want to stop any kind of webpages and especially PHP scripts from being executed, because it would post a huge security risk(apache is sudo). The purpose of this virtualhost is purely to serve game resource files, extentions like .wav , .mdl , .tga , .spr and so on.
I searched around and found this
deny from all
<filesmatch "\.(avi¦wmv¦mpg¦mov)$">
Allow from all
</filesmatch>
But this is .htaccess content. How can I implement this functionality of only allowing certain extentions inside my httpd.conf file? It would be a pain to make it use .htaccess, and a risk because users might edit them.
Please refrain from any comments unrelated to my question, such as "sudo apache? you're a dumbass" and so on.
There is no such thing as .htaccess only content. The is a huge misconception. Most of time you do NOT want to use .htaccess and Apache recommends that you not use it unless necessary. Apache rules can always be put in the server config.
When not to use .htaccess
Now you can put that in your VirtualHost directive. The same location where your document root is defined.
The FilesMatch directive can be used in these context.
Context: server config, virtual host, directory, .htaccess
http://httpd.apache.org/docs/current/mod/core.html#filesmatch
So in your vhost file you can add a Directory directive like this example.
<Directory /path/to/documentroot/>
Deny from all
<FilesMatch "\.(avi|wmv|mpg|mov)$">
Allow from all
</FilesMatch>
</Directory>
If you are using Apache 2.4 then you need to use Require.
<Directory /path/to/documentroot/>
Require all denied
<FilesMatch "\.(avi|wmv|mpg|mov)$">
Require all granted
</FilesMatch>
</Directory>
I am having troubles with the if statement of SSI. I have reinstalled OSes on two computers (one with win7, the other with win8) and installed WAMP on them. Then I have put my old projects in the folder. After I have opened the project where I'm using SSI if I get the following error message:
[an error occurred while processing this directive]
The problem is that when I open those files at work and my laptop I do not get this error missing.
After that I have switched to XAMPP, but get the same error again.
I am using the following statement:
<!--#if expr="$DOCUMENT_NAME = home.html"-->
<body class="home">
<!--#else-->
<body>
<!--#endif-->
And it seems to enter the if statement, because it puts the body class ".home", and after that comes the message.
Everything else, but the if statement works. I have separated my header.shtml and footer.shtml and the ssi loads them in the site. But when I use if - it breakes.
I don't think it is related, but in case - this how my .htaccess file looks like:
Options +Includes
AddHandler server-parsed .shtml .html .htm
Add SSILegacyExprParser on to your .htaccess
Refer this link.
You also need to change the httpd.conf file as SSI is not turned on in Apache by default.
Find this section of the httpd.conf file
#
# Filters allow you to process content before it is sent to the client.
#
# To parse .shtml files for server-side includes (SSI):
# (You will also need to add "Includes" to the "Options" directive.)
#
#AddType text/html .shtml
#AddOutputFilter INCLUDES .shtml
And change it to
#
# Filters allow you to process content before it is sent to the client.
#
# To parse .shtml files for server-side includes (SSI):
# (You will also need to add "Includes" to the "Options" directive.)
#
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
My server side includes work fine when accessing the website through http, but when trying to access the site securely (which is all set up sweet) they just don't get included.
I'm using the following code in the one file inside my apache2/sites-enabled directory:
<Directory /var/www/html>
Options +Includes
AddType text/html .htm
AddOutputFilter INCLUDES .htm
</Directory>
Any ideas about where to look?
Got it. I had only put the above code into the virtualhost section for the ordinary port, not the ssl port.
I am serving all content through apache with Content-Encoding: zip but that compresses on the fly. A good amount of my content is static files on the disk. I want to gzip the files beforehand rather than compressing them every time they are requested.
This is something that, I believe, mod_gzip did in Apache 1.x automatically, but just having the file with .gz next to it. That's no longer the case with mod_deflate.
This functionality was misplaced in mod_gzip anyway. In Apache 2.x, you do that with content negotiation. Specifically, you need to enable MultiViews with the Options directive and you need to specify your encoding types with the AddEncoding directive.
To answer my own question with the really simple line I was missing in my confiuration:
Options FollowSymLinks MultiViews
I was missing the MultiViews option. It's there in the Ubuntu default web server configuration, so don't be like me and drop it off.
Also I wrote a quick Rake task to compress all the files.
namespace :static do
desc "Gzip compress the static content so Apache doesn't need to do it on-the-fly."
task :compress do
puts "Gzipping js, html and css files."
Dir.glob("#{RAILS_ROOT}/public/**/*.{js,html,css}") do |file|
system "gzip -c -9 #{file} > #{file}.gz"
end
end
end
I am afraid MultiViews will not work as expected: the doc says Multiviews works "if the server receives a request for /some/dir/foo, if /some/dir has MultiViews enabled, and /some/dir/foo does not exist...", in other words: if you have a file foo.js and foo.js.gz in the same directory, just activating MultiViews will not cause the .gz file to be sent even if the AcceptEncoding gzip header is transmitted by the browser (you can verify this behavior by temporarily disabling mod_deflate and monitoring the response with e.g. HTTPFox).
I am not sure if there is a way around this with MultiViews (maybe you can rename the original file and then add a special AddEncoding directive), but I believe you can construct a mod_rewrite rule to handle this.
It is possible to serve pre-compressed files using mod_negotiation although it is a bit finicky. The primary difficulty is that only requests for files which do not exist are negotiated. So if foo.js and foo.js.gz both exist, responses for /foo.js will always be uncompressed (although responses for /foo would work correctly).
The easiest solution I've found (from François Marier) is to rename uncompressed files with a double file extension, so foo.js is deployed as foo.js.js so requests for /foo.js negotiate between foo.js.js (no encoding) and foo.js.gz (gzip encoding).
I combine that trick with the following configuration:
Options +MultiViews
RemoveType .gz
AddEncoding gzip .gz
# Send .tar.gz without Content-Encoding: gzip
<FilesMatch ".+\.tar\.gz$">
RemoveEncoding .gz
# Note: Can use application/x-gzip for backwards-compatibility
AddType application/gzip .gz
</FilesMatch>
I wrote a post which discusses the reasoning for this configuration and some alternatives in detail.
I have an Apache 2 built from source, and I found I had to modify the following in my httpd.conf file:
Add MultiViews to Options:
Options Indexes FollowSymLinks MultiViews
Uncomment AddEncoding:
AddEncoding x-compress .Z
AddEncoding x-gzip .gz .tgz
Comment AddType:
#AddType application/x-compress .Z
#AddType application/x-gzip .gz .tgz
mod_gzip compressed content on the fly as well. You can pre-compress the files by actually logging into your server, and doing it from shell.
cd /var/www/.../data/
for file in *; do
gzip -c $file > $file.gz;
done;
You can use mod_cache to proxy local content in memory or on disk. I don't know if this will work as expected with mod_deflate.
I have a lot of big .json files. Most readers are in this situation. The preview answers didn't talk about the returned "Content-type".
I you want the following request return a pre-compressed file with "Content-Type: application/json" transparently, use Multiview with ForceType
http://www.domain.com/(...)/bigfile.json
-> Content-Encoding:gzip, Content-Type: Content-Encoding:gzip
1) files must be rename: "file.ext.ext"
2) Multiview works great with ForceType
In the file system:
// Note there is no bigfile.json
(...)/bigfile.json.gz
(...)/bigfile.json.json
In your apache config:
<Directory (...)>
AddEncoding gzip .gz
Options +Multiviews
<Files *.json.gz>
ForceType application/json
</Files>
</Directory>
Short and simple :)