Intro
This is a really basic issue, but the documentation out there often doesn’t speak directly to this single issue – other things get thrown into the mix. This document is to show how to enable the running of CGI scripts from any directory under htdocs with the Apache2 web server.
The Details
Let’s get into it. CGI – common gateway interface – is a great environment for simple web server programs. But if you’ve got a fairly generic apache2 configuration file and are trying CGI you might encounter a few different errors before getting it right. Here’s the contents of my test.cgi file:
#!/bin/sh echo "Content-type: text/html" echo "Location: http://drjohnstechtalk.com" echo "" |
Not tuning my dflt.conf apache2 configuration file in any way, I find to my horror that the cgi file contents gets returned as is initially, just as if it were no more special than a random test file:
> curl -i localhost/test/test.cgi
HTTP/1.1 200 OK Date: Fri, 24 Feb 2012 14:07:37 GMT Server: Apache/2 Last-Modified: Fri, 24 Feb 2012 14:05:29 GMT ETag: "56d8-5c-4b9b640c9dc40" Content-Length: 92 Content-Type: text/plain #!/bin/sh echo "Content-type: text/html" echo "Location: http://drjohnstechtalk.com" echo "" |
That’s no good.
Now I do some research and realize the following line should be added. Here I show it in its context:
<Directory "/usr/local/apache2/htdocs"> # make .cgi and .pl extensions valid CGI types AddHandler cgi-script .cgi .pl ... |
and we get…
> curl -i localhost/test/test.cgi
HTTP/1.1 403 Forbidden Date: Fri, 24 Feb 2012 14:11:55 GMT Server: Apache/2 Content-Length: 215 Content-Type: text/html; charset=iso-8859-1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>403 Forbidden</title> </head><body> <h1>Forbidden</h1> <p>You don't have permission to access /test/test.cgi on this server.</p> </body></html> |
Hmmm. Better, perhaps, but definitely not working. What did we miss? Chances are we had something like this in our dflt.conf:
<Directory "/usr/local/apache2/htdocs"> # make .cgi and .pl extensions valid CGI types AddHandler cgi-script .cgi .pl Options Indexes FollowSymLinks ... |
but what we need is this:
<Directory "/usr/local/apache2/htdocs"> # make .cgi and .pl extensions valid CGI types AddHandler cgi-script .cgi .pl Options Indexes FollowSymLinks ExecCGI ... |
Note the addition of the ExecCGI to the Options statement.
With that tweak to our apache2 configuration we get the desired result after restarting:
> curl -i localhost/test/test.cgi
HTTP/1.1 302 Found Date: Fri, 24 Feb 2012 14:15:47 GMT Server: Apache/2 Location: http://drjohnstechtalk.com Content-Length: 209 Content-Type: text/html; charset=iso-8859-1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>302 Found</title> </head><body> <h1>Found</h1> <p>The document has moved <a href="http://drjohnstechtalk.com">here</a>.</p> </body></html> |
But what if we want our CGI script to be our default page? What I did for that is to add this statement:
DirectoryIndex index.html index.cgi
so now we have:
<Directory "/usr/local/apache2/htdocs"> # make .cgi and .pl extensions valid CGI types AddHandler cgi-script .cgi .pl Options Indexes FollowSymLinks ExecCGI DirectoryIndex index.html index.cgi ... |
I create an index.cgi and delete the index.html and index.cgi is run from the top-level URL:
> curl -i johnstechtalk.com
HTTP/1.1 302 Found Date: Fri, 29 Apr 2013 14:15:47 GMT Server: Apache/2 Location: http://drjohnstechtalk.com/blog/ Content-Length: 209 Content-Type: text/html; charset=iso-8859-1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>302 Found</title> </head><body> <h1>Found</h1> <p>The document has moved <a href="http://drjohnstechtalk.com/blog/">here</a>.</p> </body></html> |
Conclusion
We have shown the two most common problems that occur when trying to enable CGI execution with the apache2 web server. We have shown how to fix the configuration.