我在 Ubuntu 12.04 上安装了 Apache 2.2.22。但是在浏览器中输入 localhost 时,它会提供 index.pl 文件供下载,而不是执行它。我尝试了以下方法:
1. chmod 755 index.pl
2. 将行 DirectoryIndex index.pl index.html 添加到 etc/apache2/site-available/example.com,最终如下所示。
我以前在 Windows 机器上做过这些事情。但 Windows 和 Ubuntu 中的目录结构不同。Ubuntu 中的 Httpd.conf 文件是空白的。在搜索目录时,我发现没有与配置文件类似的文件。所以我很困惑我到底需要在哪里进行配置更改。
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName example.com
DocumentRoot /var/www/example.com/public_html
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/example.com/public_html>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
# This line was added by me
DirectoryIndex index.html index.pl
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>
</VirtualHost>
答案1
您没有解释您的 index.pl 文件在文件层次结构中的位置,但我猜测它位于您的 DocumentRoot 中。
问题在于,DocumentRoot 目录传统上用于提供静态文档。出于安全原因,DocumentRoot 层次结构中的文件永远不会被处理(即执行) - 并且 ScriptAlias 目录中的文件永远不会被静态提供。
您需要将可执行内容(perl、php、sh)与静态提供的内容(html 文件、图像、css、js)分开,以便 Web 服务器知道“此”目录及以下目录中的文件不需要处理(例如图像),而该目录中的文件则需要处理。
为此:
- 创建一个带有重定向到 /cgi-bin/index.pl 的元标头的 index.html 文件,并将 index.html 放在 DocumentRoot 中
- 将 index.pl 移动到 ScriptAlias 指向的目录(具有相应的 Directory 部分 - 具有 +ExecCGI 标志)。确保 index.pl 是可执行的,并确保其 shebang 行指向可解析的 perl。
index.pl 的 html 输出仍然可以从根目录引用图像等(例如,将图像文件夹放在文档根文件夹中,并从 html 中引用图像作为 /images/logo.png),并且可以从脚本文件夹的 html 内容中链接到脚本(通过表单提交或 href)(例如 /cgi-bin/processform.pl)