【问题标题】:Perl Apache : Perl script displayed as plain textPerl Apache:Perl 脚本显示为纯文本
【发布时间】:2013-01-25 10:09:56
【问题描述】:

在使用apacheperl cgi scripts 进行配置时,不知道为什么index.cgi/index.pl 显示为纯文本而不是执行它们。 当我将http://localhost 放入浏览器时,它会显示在代码下方,而不是执行它。

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;

这是我大部分时间编辑的httpd.conf文件的一部分(在阅读了各种在线参考、教程之后)

# 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/"

【问题讨论】:

  • 投反对票没关系,但如果你知道答案,请告诉我。我很难配置 httpd.conf 文件。
  • 您的 Perl 是否安装正确。如果没有找到您的脚本指定的 perl,Apache 通常会打印文件内容。 http配置很头疼。我同意。

标签: perl apache windows-7 configuration cgi


【解决方案1】:

当浏览器正在打印脚本代码时,这意味着它无法找到运行脚本的应用程序。下面两行应该是您解决此问题的第一步。 AddHandler 将确保以.cgi.pl 结尾的文件被视为cgi 脚本。 +ExecCGI 选项将允许执行脚本。还要确保您的脚本指向正确的 perl 二进制位置。

    AddHandler cgi-script .cgi .pl
    Options FollowSymLinks +ExecCGI

您的 httpd.conf 中也有一些错误/错误配置点

  • 别名行应指向您的 cgi 脚本所在的 cgi-bin 目录。

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

  • 对于相同的 cgi-bin 目录,以下配置应位于 httpd.conf。您应该将 &lt;Directory "D:\webserver"&gt; 部分替换为以下内容。
<Directory "D:\webserver\cgi-bin" />
    AddHandler cgi-script .cgi .pl
    Options FollowSymLinks +ExecCGI
    AllowOverride None  
</Directory>
  • 尝试从命令行运行您的 cgi 脚本,如下所示。它应该首先从命令行打印或运行。

perl test.cgi

  • 确保您对cgi-bin 目录和您的cgi 脚本具有读写递归权限。您还可以创建具有写入权限的目录或文件。如果不在您可以拥有写入权限的其他位置创建cgi-bin 目录,而是在aliasdirectory 属性中提供其路径httpd.conf
  • 每次遇到 apache conf 问题时,请检查 apache 错误日志以获取准确的错误消息。它将让您深入了解问题。

另外this link 应该可以帮助你。

(额外评论,不是原始回答者:您可能还需要启用 cgi 模块。对我来说,让 cgi 在全新安装的 Apache 2 上工作的最后一步是sudo a2enmod cgi。在我这样做之前,网站只是向我展示了脚本的内容。)

sudo a2enmod cgi

【讨论】:

  • 非常感谢。您给定的链接使 httpd.conf 文件配置变得简单易懂。我删除了旧的 httpd.conf(经过大量编辑),从 httpd-default 文件创建了新的 httpd.conf 文件。按照homepages.paradise.net.nz/milhous/cgi.htm 的指导编辑了新制作的httpd.conf 文件并更改了CGI 脚本,并且成功了。再次感谢您的帮助,因为上面的链接不仅解决了这个问题,还提供了关于发布、获取、数据库等的信息。
  • sudo a2enmod cgi 为我解决了问题,如果重要的话,使用 Raspberry Pi。
  • 感谢您的额外评论...对我来说,a2enmod cgi 是必需的。
【解决方案2】:

目录/位置/文件没有与之关联的正确处理程序,或者没有启用ExecCGI 选项。见Apache Tutorial: Dynamic Content with CGI

【讨论】:

    【解决方案3】:

    更改新版本的 apache: 选项 +FollowSymLinks +ExecCGI

    【讨论】:

      【解决方案4】:

      在 mac os x 10.8 上

      我必须这样做

      <Directory />
          Options FollowSymLinks +ExecCGI
          AllowOverride None
      </Directory>
      

      取消注释

      #AddHandler cgi-script .cgi .pl
      

      【讨论】:

      • 在 10.10 优胜美地,我还需要做 LoadModule cgi_module modules/mod_cgi.so 然后 sudo apachectl restart。对于我的选项声明,我必须这样做:Options +FollowSymLinks +ExecCGI,因为有人抱怨只使用一个 + 号...
      【解决方案5】:
       # 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>
      

      【讨论】:

      • 部分修复了新 Apache 2.4 中的问题。我觉得他们走的是老派的微软路线,并通过该更新打破了几乎所有内容。当然,它更好,更安全,好的方向。但是哇,真是一场灾难。
      【解决方案6】:

      当浏览器正在打印脚本代码时,意味着它无法找到 运行脚本的应用程序。

      使用Apache 2.4(在 OSX Yosemite,10.10.5 上),如果我使用路径错误的 shebang 行,我的浏览器会显示:

      内部服务器错误

      但即使使用有效的 shebang 行,我也无法按照已接受答案中的建议执行我的 cgi 程序——Apache 只是将程序的文本提供给我的浏览器。经过一些试验,我发现我需要对我的/usr/local/apache2/conf/httpd.conf 文件进行的唯一更改是取消注释该行:

      LoadModule cgid_module modules/mod_cgid.so
      

      我的 cgi 程序具有扩展名 .pl、.py 和 .rb,具体取决于我使用的编程语言(并且 apache cgi-bin 目录包含一个没有扩展名的测试 cgi 脚本),它们都可以在没有扩展名的情况下执行必须在 httpd.conf 文件的任何地方指定有效的扩展名。我的默认httpd.conf 文件只有以下相关行:

      <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>
      

      我使用的 shebang 行是,取决于我的 cgi 程序是用什么语言编写的:

      #!/usr/bin/env perl
      

      或:

      #!/usr/bin/env python 
      

      或:

      #!/usr/bin/env ruby
      

      cgi 程序也必须是可执行文件,否则您将收到 Internal Server 错误:

      $ chmod a+x myprog.pl
      

      a+x => 全部 + 可执行文件。也就是说,给owner、group、other中的每一个添加可执行权限。

      而且,cgi 程序至少必须在输出响应正文之前生成一个Content-Type header

      print "Content-Type: text/html\n\n";
      print "<h1>Hello, World.</h1>";
      

      (顺便说一句,确切的代码可以在 perl、python 或 ruby​​ 中运行。)否则,您将再次收到 Internal Server 错误。

      执行cgi脚本的url:

      http://localhost:8080/cgi-bin/myprog.pl
      

      这就是我安装 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.
      ...
      ...
      

      我不知道这到底是什么意思,但 php docs 说要使用该选项安装 apache,所以我继续这样做:

      ~/Downloads/httpd-2.4.18$ ./configure --enable-so
      ...
      ...
      ~/Downloads/httpd-2.4.18$ make
      ...
      ...
      ~/Downloads/httpd-2.4.18$ sudo make install
      

      Apache DSO 文档here

      【讨论】:

        【解决方案7】:

        如果没有其他工作,请确保您显示的是从本地服务器调用可执行脚本的 HTML 页面,例如http://192.168.0.15/yourPage.html。如果您通过在浏览器中将 HTML 页面作为文件打开来调用它,它将始终将您的可执行脚本显示为文件。

        【讨论】:

          猜你喜欢
          • 2016-03-17
          • 2013-05-31
          • 2014-09-18
          • 1970-01-01
          • 2018-10-15
          • 2022-10-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多