为什么我的浏览器会显示 Content-Type 行?

为什么我的浏览器会显示 Content-Type 行?

按照这里描述的内容---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)。

相关内容