Si echas un vistazo al archivo de configuración principal de Apache2, /etc/apache2/httpd.conf
verás que hay dos cosas que hay que hacer para permitir que /Library/WebServer/CGI-Executables contenga los archivos cgi.
En primer lugar, como no está cubierto por los permisos del directorio de documentos que tiene al lado, necesitará un bloque "Directorio" para definir los permisos de todos los archivos y directorios que están bajo él. En el caso de este directorio no permite absolutamente nada. Por eso, al apuntar el navegador al directorio, dice permisos denegados. No te preocupes, lo segundo permite los archivos cgi en el directorio a ejecutar.
En segundo lugar, necesita un comando "ScriptAlias" que indique al servidor qué URL se utilizará para apuntar a él, de modo que el servidor encuentre los archivos y permita su ejecución.
ScriptAliasMatch ^/cgi-bin/((?!(?i:webobjects)).*$) \
"/Library/WebServer/CGI-Executables/$1"
Esto dice básicamente que "después de eliminar el nombre de host, cualquier URL que comience con "/cgi-bin/" y continúe con un trozo de texto seguido de un punto seguido de otro trozo de texto apunta a un archivo con un nombre que coincide con el último trozo en el directorio ""/Library/WebServer/CGI-Executables/$1"
Si quiere colocar los archivos CGI en uno de sus directorios de usuario, tendrá que hacer algunos cambios en un archivo de configuración diferente. Encontrará el archivo de configuración para las acciones de los usuarios en /etc/apache2/users con un archivo de configuración para cada usuario. Aquí tiene un ejemplo:
<Directory "/Users/jessica/Sites/">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
Para ello tendrá que añadir o bien "ExecCGI" a la línea de "Opciones" para que pueda tener archivos CGI en cualquier lugar de su directorio de Sitios o bajo o añadir un nuevo bloque de Directorio para su carpeta CGI. Se vería así :-
<Directory "/Users/jessica/Sites/CGI">
Options ExecCGI
AllowOverride None
Order allow,deny
Allow from all
</Directory>
Dado que esto es en nuestro DocumentRoot no necesitamos usar el ScriptAliasMatch.
(La segunda opción es la más segura).