Web Server Information

NAME

ActivePerl-faq6 - Web server information

DESCRIPTION

ActivePerl Web Server Configuration and Troubleshooting

General Web Server Configuration Issues

What web servers support ActivePerl?

Most Windows web servers that use the CGI standard or ISAPI will run ActivePerl scripts. The following servers are known to work with ActivePerl (known protocols in brackets):

Apache for Win32 [CGI, mod_perl]
http://www.apache.org
mod_perl home page: http://perl.apache.org
 
Microsoft Internet Information Server [CGI, ISAPI]
http://www.microsoft.com/WindowsServer2003/iis/default.mspx
 

Why does my ActivePerl script run from the command line, but not as a CGI script?

Usually, this means one of two things: either your system is misconfigured, or your script does not send the correct output for a CGI script.

Before you do anything else, check this list:

Check the information above with a script that you know produces the right output for the CGI protocol (scripts in this FAQ are a good first choice). Try it with your own script after you're sure the test script will work.

If you are sure the server is running the script, but it only generates error messages in your browser, there are some tools that may help you out. CGI::Carp is used to send debugging information to the browser or log file. Even if your script has a compilation error, it can usually intercept and report errors. To use CGI::Carp, include the following lines in your program:

    # The code in the BEGIN block will be executed very early
    # on, even before the rest of this script is parsed.
    #
    BEGIN {

        # Use the CGI::Carp module and import the carpout() function.
        #
        use CGI::Carp qw(carpout);

        # Send warnings and die messages to the browser.
        #
        carpout(STDOUT);

    }

If your script has an error, you may see something like this in the browser:

    [Wed Jun 3 09:32:28 1998] C:\inetpub\scripts\test.pl: Error message! at
    C:\inetpub\scripts\test.pl line 38.

Sometimes, it can be helpful to put yourself in somebody else's position. The libwww-perl bundle (LWP) is available from CPAN, but you can install it using the Perl Package Manager (PPM). LWP may be included with future releases of ActivePerl.

LWP includes the powerful lwp-request script, which lets you see things from the browser's perspective. Invoke lwp-request with the name of a URL to see the content of the response, as in lwp-request http://localhost. To inspect the headers of an HTTP response, invoke lwp-request with the -de switch:

    C:\>lwp-request -de http://localhost
    Date: Wed, 03 Jun 1998 13:37:31 GMT
    Accept-Ranges: bytes
    Server: Microsoft-IIS/4.0
    Content-Length: 4325
    Content-Location: http://localhost/Default.htm
    Content-Type: text/html
    ETag: "0c1e58b063bd1:1237"
    Last-Modified: Thu, 09 Apr 1998 12:09:28 GMT
    Client-Date: Wed, 03 Jun 1998 13:37:31 GMT
    Client-Peer: 127.0.0.1:0

This tool can be very helpful in figuring out exactly what your scripts are doing. Whatever you do, don't give up hope. It is, in fact, possible to get a Perl script running on your web server. Really.

Can't I put perl.exe in my CGI directory and call it in the URL? No!

First, the warning: do not do this. Really. Even if you don't understand why not, don't.

Now the explanation: the idea here is to put perl.exe in your CGI directory (however you configure that on your server), and use URL syntax like the following:

    http://soon.to.be.a.victim.net/cgi-bin/perl.exe?myscript.pl

to run myscript.pl. This keeps you from having to figure out how to configure your server to associate extensions like .pl with an interpreter like perl.exe.

In fact, on some early Win32-based web servers (iPlanet 1.x servers in particular), it was impossible to associate a script file with an interpreter. This method was recommended by vendors as a viable approach to running Perl scripts on your web server.

With this configuration, anyone with a devious mind and a little knowledge of Perl could start doing all kinds of destructive things on the server. All they'd have to do is send made-up URLs, using the -e command line switch in perl.exe, in order to do things like delete all files on a drive:

    http://aaaugh.that.hurts.net/cgi-bin/perl.exe?-e?'del%20c:\*.*%20/S%20/Q'

Of course, a true computer criminal would never do something this crude and obvious, but would instead use this as a launching point to cause irreparable harm to your organization.

The following URL covers this issue in more depth:

    http://www.cert.org/advisories/CA-1996-11.html

Note that one suggested solution to this problem is wrapping your Perl script in a batch file using pl2bat or your own custom batch code. This is also not a good idea. Most servers that won't allow file associations are also susceptible to a bug that allows a user to enter any DOS command after the bat file.

Using the Apache Web Server

How do I configure Apache 2.0.x to support ActivePerl?

These instructions assume that you have installed the Apache web server according to the instructions for the 2.0.x Windows version.

  1. Open the httpd.conf file for editing by selecting Start > Programs > Apache HTTP Server > Configure Apache Server > Edit the Apache httpd.conf Configuration File.
     
    This will open your httpd.conf file in the notepad editor.
  2. Make the following changes to the httpd.conf file:
  3. Save your changes to the httpd.conf file, and restart the Apache Service using the Apache Service Monitor.
  4. Test your configuration as described in the Testing Your Web Server Configuration section below.

How do I configure Apache 1.3.x to support ActivePerl?

There are two ways to configure Apache to support CGI scripts: by setting the directory in which the ActivePerl scripts reside, or by setting the file extension that Apache will associate with CGI scripts.

To add a directory in which all of your CGI scripts will reside, do the following:

  1. Open the httpd.conf file for editing by selecting Start > Programs > Apache HTTP Server > Configure Apache Server > Edit the Apache httpd.conf Configuration File.
     
    This will open your httpd.conf file in the notepad editor.
  2. Make the following changes to the httpd.conf file:
  3.     ScriptAlias /cgi-bin/ "C:/Program Files/Apache Group/Apache/cgi-bin/"
    You can choose any directory that you like, but you must ensure that it exists.
  4. After you have made this change, stop and restart the Apache service.
    Note: Apache provides an emulation of the UNIX ``shebang'' syntax, where the first two characters on the first line of a script begin with the hash mark ("#") and bang ("!") characters, which is then followed by the path to the script interpreter. This will ensure that the proper interpreter will always be used to run your script. You should begin each ActivePerl script that you place in your cgi-bin directory with a valid path to the ActivePerl interpreter. For example:
        #!C:\PERL\5.00464\bin\MSWin32-x86\perl.exe
    
        use CGI qw(:standard) ;
        print header();
        print "Hello, world";
  5. Test your configuration as described in the Testing Your Web Server Configuration section, below.

To enable CGI scripts based on an extension, such as .pl or .cgi, do the following:

  1. Add the following line to the httpd.conf file:
        AddHandler cgi-script .pl
    Note: By default, CGI scripts are not allowed to be in your DocumentRoot directory, but they are allowed in other document directories. Document directories are created with the Alias command in httpd.conf. For example:
        Alias /ResourceKit/ "E:/utilsamp/"
    You can then include files that end in .pl (or .cgi, if you set that as the extension in the AddHandler line) within a document directory. You will still need to include the #! line with the full valid path to the perl.exe interpreter, as shown in the previous procedure.
  2. If you want to allow CGI scripts in the DocumentRoot directory, add the ExecCGI option to the Options directive in the <Directory> section for your DocumentRoot in the httpd.conf file; this section appears directly after the comment titled:
  3.     # This should be changed to whatever you set DocumentRoot to.
    After you have updated it, your Options directive should look similar to this:
        Options Indexes FollowSymLinks ExecCGI
  4. After you have made these changes, stop and restart the Apache service.
  5. Test your configuration as described in the Testing Your Web Server Configuration section, below.

Using IIS

The ActivePerl MSI installer can configure script mappings for IIS during installation, and options for doing so are made available if IIS is detected on the system. To configure or re-configure IIS to use ActivePerl after installation, use the ap-iis-config utility.

  ap-iis-config add all
  ap-iis-config delete all
  ap-iis-config list sites
  ap-iis-config add map --ext .cgi --type isapi
  ap-iis-config delete map --ext .plex
  ap-iis-config add vdir --site 1 --name Sample --path C:\www\samples
  ap-iis-config delete vdir --site 2 --name "My Site"

See the ap-iis-config documentation for complete descriptions of all the options.

Using Other Web Servers

How do I configure other web servers to support ActivePerl?

If your web server isn't listed, check the server's documentation on how to set up a CGI interpreter. In general, the process is as follows:

Because most web servers run as services (see How do I configure IIS 3.0 or lower to support ActivePerl?), you need to take special steps to ensure that files and environment variables are available to them.

Testing Your Web Server Configuration

Regardless of which of the above configurations you performed, you should test your configuration to ensure that your web server properly handles ActivePerl CGI scripts. The following script provides a simple test of your configuration:

  1. Save the following test script in your DocumentRoot directory as test.pl or test.cgi (depending on your configuration of the AddHandler line) and modify the first line as required to point to your ActivePerl interpreter:
        #!c:\perl\bin\perl.exe
        # ^^^ this must be the first line of the script! ^^^
        # start code
    
        use strict;
        use CGI;
        my $q = new CGI;
    
        # print header and start the markup output
    
        print $q->header( "text/html" ),$q->start_html( "hello from perl cgi!" );
        print $q->h2("hello dave...");
        print $q->end_html;
        # end code
  2. Open the script in your browser to test your configuration. You should see a page that displays a level two heading with the following text:

    hello dave...

AUTHOR AND COPYRIGHT

This FAQ was originally assembled and maintained by Evangelo Prodromou. It has been revised and updated by Brian Jepson of O'Reilly and Associates, and David Grove and David Dmytryshyn of ActiveState.

This FAQ is in the public domain. If you use it, however, please ensure that you give credit to the original authors.

 ActivePerl FAQ - Web Server Information