web-dev-qa-db-fra.com

Perl Apache: script Perl affiché en texte brut

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/"
16
msinfo

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

  • La ligne d'alias doit pointer vers le répertoire cgi-bin où vos scripts cgi sont présents.

ScriptAlias ​​/ cgi-bin/"D:\webserver\cgi-bin"

  • Pour le même répertoire cgi-bin, la configuration suivante doit être dans 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>
  • Essayez d'exécuter votre script cgi à partir de la ligne de commande comme ci-dessous. Il doit d'abord être imprimé ou exécuté à partir de la ligne de commande.

Perl test.cgi

  • Assurez-vous que vous disposez d'autorisations récursives en lecture-écriture sur le répertoire 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.
  • Consultez le journal des erreurs Apache pour un message d'erreur exact à chaque fois que vous rencontrez des problèmes de configuration Apache. Cela vous donnera un bon aperçu du problème.

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

30
user966588

changer la nouvelle version d'Apache: Options + FollowSymLinks + ExecCGI

2
no7dw

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 .

2
ikegami

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
1
joshua paul

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 .

1
7stud
 # 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>
1
Yordan Georgiev