按照这里描述的内容---https://httpd.apache.org/docs/2.4/howto/cgi.html--- 我创建了一个小型 Perl 文档:
#!/usr/bin/perl
print "Content-Type: text/html; charset=utf-8\n\n";
print "Hello, World.";
并将其命名为first.pl
。我还对其进行了修改,使其看起来像
#!/usr/bin/perl
print "Content-Type: text/html; charset=utf-8\r\n\r\n";
print "Hello, World.";
因为有朋友指出“\n”的含义是系统相关的,需要的是CR-LF CR-LF,但结果是一样的。)
当我从 Chrome 浏览器查看时,localhost/~mylogin/first.pl
我得到以下输出:
Content-Type: text/html; charset=utf-8
Hello, World.
(该; charset=...
内容是对 Apache 文档建议内容的轻微修改,因为删除它也会产生一条 Content-Type 输出行,并且一些搜索表明字符集可能很重要。事实上,它并没有什么区别。)
Apache 文档中提到,“无论你将文件放在哪里,你都会看到一条线 Hello, World.
出现在您的浏览器窗口中。”
显然,我看到了二其中第一行应该仅仅被视为剩余内容的描述,我认为这是个问题。
我希望这只是一些非常基本的错误,并希望得到任何建议。
语境
我在运行 Monterey 12.6.6 的 Mac 上
我开始按照以下指示这里。
从原始httpd.conf
文件开始,我只做了一些编辑,取消了以下内容的注释:
LoadModule perl_module libexec/apache2/mod_perl.so
LoadModule userdir_module libexec/apache2/mod_userdir.so
Include /private/etc/apache2/extra/httpd-userdir.conf
并且/etc/apache2/extra/httpd-userdir.conf
,我取消了注释
Include /private/etc/apache2/users/*.conf
我已经创建/etc/apache2/users/mylogin.conf
,并赋予它以下内容:
<Directory "/Users/mylogin/Sites/">
AddLanguage en .en
AddHandler perl-script .pl
PerlHandler ModPerl::Registry
Options Indexes MultiViews FollowSymLinks ExecCGI
AllowOverride None
Require host localhost
</Directory>
我已经跑了
chmod +a "_www allow execute" ~
[当然,在上述所有情况下,我都用我的实际登录名替换了“mylogin”]
然后,按照 Apache 的说明,我将其添加到文件中httpd.conf
:
<Directory "/Users/mylogin/Sites">
Options +ExecCGI
AddHandler cgi-script .cgi
</Directory>
答案1
使用AddHandler perl-script .pl
,您不需要使用mod_cgid
(或者mod_cgi
),其中“Apache 教程:使用 CGI 的动态内容“是关于,但与mod_perl
。虽然两者都可以运行 Perl 脚本,但是 CGI 期望脚本首先发送与\n\n
正文分隔的标头。
您可以通过切换这些配置来看到差异:
mod_perl
LoadModule perl_module /usr/lib/apache2/modules/mod_perl.so
<Directory "/Users/mylogin/Sites/">
Options +ExecCGI
AddHandler perl-script .pl
PerlHandler ModPerl::Registry
</Directory>
生成:
< HTTP/1.1 200 OK
< Server: Apache/2.4.41
< Transfer-Encoding: chunked
< Content-Type: text/x-perl
<
Content-Type: text/html; charset=utf-8
Hello, World.
mod_cgid
LoadModule cgid_module /usr/lib/apache2/modules/mod_cgid.so
<Directory "/Users/mylogin/Sites/">
Options +ExecCGI
AddHandler cgi-script .pl
</Directory>
生成:
< HTTP/1.1 200 OK
< Server: Apache/2.4.41
< Content-Length: 13
< Content-Type: text/html; charset=utf-8
<
Hello, World.
答案2
按照@Esa Jokinen 的回答,我让事情开始运转,从某种意义上说,加载http://localhost/~jfh/first.pl
产生了预期的一行结果,但我认为值得记录最终的配置状态,因为它需要一些轻微的摆弄。
回顾:我开始遵循以下说明这里。
从原始httpd.conf
文件开始,我只做了一些编辑,取消了以下内容的注释:
LoadModule perl_module libexec/apache2/mod_perl.so
LoadModule userdir_module libexec/apache2/mod_userdir.so
Include /private/etc/apache2/extra/httpd-userdir.conf
并且/etc/apache2/extra/httpd-userdir.conf
,我取消了注释
Include /private/etc/apache2/users/*.conf
我已经创建/etc/apache2/users/jfh.conf
,并赋予它以下内容:
LoadModule cgid_module libexec/apache2/mod_cgid.so
<Directory "/Users/jfh/Sites/">
AddLanguage en .en
Options Indexes MultiViews FollowSymLinks ExecCGI
Options +ExecCGI
AllowOverride None
Require host localhost
AddHandler cgi-script .pl
</Directory>
我已经跑了
chmod +a "_www allow execute" ~
[在上述所有情况下,我的登录名都是jfh
,如果您想复制此信息,则需要将其更改为您自己的登录名]
我做到了不是httpd.conf
按照我最初的问题所述对文件进行进一步的编辑,但却进行了上面显示的编辑/etc/apache2/users/jfh.conf
。
我希望这能帮助其他在类似系统上遇到类似问题的人。
\r\n
最后,我之前对不同 perl 版本之间的差异的担心\n
似乎被误解了,因为我的first.pl
文件如下所示
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello, World.";
\n\n
并且运行良好(但我还确认,当被 替换时,运行良好\r\n\r\n
)。