Documentation
Handler: CGI
The cgi handler executes CGI programs.
Parameters
This module accepts three parameters:
Parameters | Type | Description |
---|---|---|
Script Alias |
String |
It defines a kind of execution interpreter. The CGI will be run as a parameter of this script. |
Change to UID |
String |
Executes each CGI under its owner’s user ID. |
Error handler |
Boolean |
Use CGI output as error message. |
Check file |
Boolean |
Check file existence to build PATH_INFO and SCRIPT_NAME. |
Pass request |
Boolean |
Pass request headers. |
Allow X-Sendfile |
Boolean |
Use the non-standard X-Sendfile header. |
Pass Request Headers |
Boolean |
Forward all the headers to the CGI as HTTP_* |
Note that the X-Sendfile feature also supports X-Accel-Redirect headers transparently. This is to allow the migration of applications supporting it whithout having to make major code rewrites.
Warning:
The Check file flag affects how PATH_INFO and SCRIPT_NAME are generated. You should disable this when you have an application that is running the whole virtual server tree, as it is a common source of problems. You can look at a practical example about PATH_INFO in the List & Send handler documentation.
Check file must be disabled for cases such as Rails, Django, etc, where everything that arrives to Cherokee must be re-sent to the framework as request.
Enabling Check file is the way to go if you are using any kind of file-based system, such as PHP.
If you are unsure of the way this is being taken into account, try both settings and see how your application behaves.
Examples
This is a pretty common example. It defines a directory called cgi that points to a path out of the Sever root directory where the CGI programs are located.
Handler |
CGI |
Document Root |
/usr/lib/cgi-bin |
Script Alias |
None |
Change UID |
Disabled |
Error handler |
Disabled |
Check file |
Enabled |
Pass Request Headers |
Enabled |
Allow X-Sendfile |
Disabled |
Another example could be the case where you wanted your default requests to be managed by a specific script.
A real life example could be running Trac as a CGI script. In that case you would want to map an URL to the trac.cgi script.
For this you only need to set up the Script Alias option. Assuming you are using a Directory-type rule for the path /trac managed by the CGI handler, you could set /usr/share/trac/cgi-bin/trac.cgi as Script Alias.
After this, every request that matched the /trac path would be managed by the trac.cgi script.