Lors de la configuration avec Apache
et Perl cgi scripts
, je ne sais pas pourquoi index.cgi
/index.pl
sont affichés en texte brut au lieu de les exécuter. Quand je mets http://localhost
dans le navigateur, il affiche le code ci-dessous, au lieu de l'exécuter.
List item
#!C:/Dwimperl/Perl/bin/Perl.exe -w
print "Content-type: text/html\n\n";
print <<HTML;
<html>
<head>
<title>A Perl web page</title>
</head>
<body>
<h3>A hello world form Perl</h3>
</body>
HTML
exit;
Ce sont des parties de httpd.conf
fichier que j'ai édité la plupart du temps (après avoir lu diverses références en ligne, tutoriels)
# This should be changed to whatever you set DocumentRoot to.
<Directory "D:\webserver">
Listen 80
ServerName localhost:80
LoadModule cgi_module modules/mod_cgi.so
# First, we configure the "default" to be a very restrictive set of
# features.
<Directory />
Options FollowSymLinks +ExecCGI
AllowOverride None
</Directory>
DirectoryIndex index.html index.html.var index.cgi index.pl
AccessFileName .htaccess
# To use CGI scripts outside of ScriptAliased directories:
# (You will also need to add "ExecCGI" to the "Options" directive.)
#
#AddHandler cgi-script .cgi .pl
ScriptAlias /cgi-bin/ "C:/Apache/Apache2/cgi-bin/"
Lorsque le navigateur imprime le code du script, cela signifie qu'il est incapable de trouver l'application pour exécuter le script. Ci-dessous deux lignes devraient être vos premières étapes pour résoudre ce problème. AddHandler s'assurera que les fichiers se terminant par .cgi
Et .pl
Seront traités comme des scripts cgi. Et l'option +ExecCGI
Permettra d'exécuter le script. Assurez-vous également que votre script pointe vers l'emplacement binaire Perl correct.
AddHandler cgi-script .cgi .pl Options FollowSymLinks +ExecCGI
Il y a aussi des erreurs/points de mauvaise configuration dans votre httpd.conf
ScriptAlias / cgi-bin/"D:\webserver\cgi-bin"
httpd.conf
. Vous devez remplacer votre pièce <Directory "D:\webserver">
Par ci-dessous.<Directory "D:\webserver\cgi-bin" /> AddHandler cgi-script .cgi .pl Options FollowSymLinks +ExecCGI AllowOverride None </Directory>
Perl test.cgi
cgi-bin
Et votre script cgi. Et vous pouvez également créer un répertoire ou un fichier avec des autorisations d'écriture. Sinon, créez un répertoire cgi-bin
À un autre endroit où vous pouvez avoir des autorisations d'écriture et fournir plutôt son chemin dans les attributs alias
et directory
dans httpd.conf
À la place.ce lien devrait également vous aider.
( Commentaire supplémentaire, pas du répondeur d'origine: Vous devrez peut-être également activer le module cgi
. Pour moi, la dernière étape pour faire fonctionner cgi sur une nouvelle installation d'Apache 2 était Sudo a2enmod cgi
. Avant cela, le site Web m'a simplement montré le contenu du script.)
Sudo a2enmod cgi
changer la nouvelle version d'Apache: Options + FollowSymLinks + ExecCGI
Le répertoire/emplacement/fichier n'est pas associé au gestionnaire de droite ou l'option ExecCGI
n'est pas activée. Voir Tutoriel Apache: contenu dynamique avec CGI .
sur mac os x 10.8
je devais faire ça
<Directory />
Options FollowSymLinks +ExecCGI
AllowOverride None
</Directory>
et
décommenter cela
#AddHandler cgi-script .cgi .pl
Lorsque le navigateur imprime le code du script, cela signifie qu'il est incapable de trouver l'application pour exécuter le script.
Avec Apache 2.4
(sur OSX Yosemite, 10.10.5), si j'utilise une ligne Shebang avec le mauvais chemin, mon navigateur affiche:
Erreur de serveur interne
Mais même avec une ligne Shebang valide, je n'ai pas pu exécuter mon programme cgi en suivant les conseils de la réponse acceptée - Apache vient de servir le texte du programme à mon navigateur. Après quelques essais, j'ai constaté que le seul changement que je devais apporter à mon /usr/local/Apache2/conf/httpd.conf
le fichier décommentait la ligne:
LoadModule cgid_module modules/mod_cgid.so
Mes programmes cgi ont les extensions .pl, .py et .rb selon la langue dans laquelle je programme (et le répertoire Apache cgi-bin contient un script cgi de test sans extension), et ils s'exécutent tous sans avoir à spécifier extensions valides n'importe où dans le fichier httpd.conf. Ma valeur par défaut httpd.conf
le fichier n'a que les lignes pertinentes suivantes:
<IfModule alias_module>
#Lots of comments here
ScriptAlias /cgi-bin/ "/usr/local/Apache2/cgi-bin/"
</IfModule>
...
...
<Directory "/usr/local/Apache2/cgi-bin">
AllowOverride None
Options None
Require all granted
</Directory>
La ligne Shebang que j'utilise est, selon la langue dans laquelle mon programme cgi est écrit:
#!/usr/bin/env Perl
ou:
#!/usr/bin/env python
ou:
#!/usr/bin/env Ruby
Un programme cgi doit également être un fichier exécutable, sinon vous obtiendrez une erreur de serveur interne :
$ chmod a+x myprog.pl
a+x
=> tout + exécutable. En d'autres termes, ajoutez l'autorisation exécutable à chacun des propriétaires, groupes et autres.
Et, au minimum, le programme cgi doit générer un Content-Type header
avant de sortir le corps de la réponse:
print "Content-Type: text/html\n\n";
print "<h1>Hello, World.</h1>";
(Soit dit en passant, ce code exact fonctionnera en Perl, python ou Ruby.) Sinon, une fois de plus, vous obtiendrez une erreur de serveur interne .
L'URL pour exécuter le script cgi:
http://localhost:8080/cgi-bin/myprog.pl
Voici comment j'ai installé Apache:
~/Downloads$ tar xvfz httpd-2.4.18.tar.bz2
...
...
~/Downloads$ cd httpd-2.4.18
...
...
~/Downloads/httpd-2.4.18$ ./configure --help
...
...
--enable-so DSO capability. This module will be automatically
enabled unless you build all modules statically.
...
...
Je n'avais aucune idée de ce que cela signifiait, mais les php docs disent d'installer Apache avec cette option, alors j'ai continué et j'ai fait ceci:
~/Downloads/httpd-2.4.18$ ./configure --enable-so
...
...
~/Downloads/httpd-2.4.18$ make
...
...
~/Downloads/httpd-2.4.18$ Sudo make install
Documents Apache DSO ici .
# use types www.site.com/visible-in-url
# Apache serves /var/path/to/dir
ScriptAlias /visible-in-url/ /var/path/to/dir/
# Note the order of the aliases matters - first cgi than static content
# Note this dir is a symlink pointing to the desirable directory
<Directory "/var/path/to/dir">
AddHandler cgi-script .cgi .pl
AllowOverride Indexes
Options +ExecCGI +MultiViews +SymLinksIfOwnerMatch
Require all granted
</Directory>
<Files ~ "\.(pl|cgi)$">
SetHandler Perl-script
PerlResponseHandler ModPerl::PerlRun
Options +ExecCGI +SymLinksIfOwnerMatch
PerlSendHeader On
</Files>