---
name: "cgi_to_mod_perl"
section: "3pm"
platform: "linux"
package: "libapache-mod-perl"
version: "1.29.0.4-4.1+etch1"
release: "Debian 4.0 (Etch)"
platforms: ["linux"]
url: "https://new.carta.tech/cgi_to_mod_perl"
---

# cgi\_to\_mod\_perl(3pm)

First steps needed to use mod\_perl as a CGI replacement

## NAME

cgi\_to\_mod\_perl - First steps needed to use mod\_perl as a CGI replacement

## DESCRIPTION

As the README and other mod\_perl documents explain, mod\_perl as a CGI replacement is only a small piece of what the package offers. However, it is the most popular use of mod\_perl, this document is here so you can cut to the chase.

## INSTALLATION

Read the INSTALL document, in most cases, nothing more is required than:

```
 perl Makefile.PL && make && make install
```

## CONFIGURATION

For using mod\_perl as a CGI replacement, the recommended configuration is as follows:

```
 Alias /perl/  /real/path/to/perl-scripts/
```

```
 <Location /perl>
 SetHandler  perl-script
 PerlHandler Apache::Registry
 Options +ExecCGI
 </Location>
```

\`Location' refers to the uri, not a directory, think of the above as

```
 <Location http://www.yourname.com/perl>
```

Any files under that location (which live on your filesystem under /real/path/to/perl-scripts/), will be handled by the Apache::Registry module, which emulates the CGI environment.  The file must exist and be executable, in addition,  'Options ExecCGI' must be turned on.

If you wish to have mod\_perl execute scripts in any location based on file extension, use a configuration like so:

```
 <Files ~ "\.pl$">
 SetHandler perl-script
 PerlHandler Apache::Registry
 Options ExecCGI
 </Files>
```

Note that \`ScriptAlias' does \_not\_ work for mod\_perl.

## PORTING CGI SCRIPTS

- I/O

  If you are using Perl 5.004 most CGI scripts can run under mod\_perl untouched.  If you're using 5.003, Perl's built-in `"read()"` and `"print()"` functions do not work as they do under CGI.  If you're using CGI.pm, use `"$query->print"` instead of plain 'ol `"print()"`.

- HEADERS

  By default, mod\_perl does not send any headers by itself, however, you may wish to change this:

  ```
      PerlSendHeader On
  ```

  Now the response line and common headers will be sent as they are by mod\_cgi.  And, just as with mod\_cgi, PerlSendHeader will not send a terminating newline, your script must send that itself, e.g.:

  ```
   print "Content-type: text/html\n\n";
  ```

  If you're using CGI.pm and 'print `$q`-\>header' you do \_not\_ need `"PerlSendHeader On"`.

- NPH SCRIPTS

  To run a CGI \`nph' script under mod\_perl, simply add to your code:

  ```
   local $| = 1;
  ```

  If you normally set **PerlSendHeader On**, add this to your httpd.conf:

  ```
   <Files */nph-*>
   PerlSendHeader Off
   </Files>
  ```

- PROGRAMMING PRACTICE

  CGI lets you get away with sloppy programming, mod\_perl does not. Why?  CGI scripts have the lifetime of a single HTTP request as a separate process.  When the request is over, the process goes away and everything is cleaned up for you, e.g. globals variables, open files, etc.  Scripts running under mod\_perl have a longer lifetime, over several request, different scripts may be in the same process.  This means you must clean up after yourself.  You've heard:

  ```
   always 'use strict' and C<-w>!!!
  ```

  It's more important under mod\_perl Perl than anywhere else, while it's not required, it **strongly** recommended, it will save you more time in the long run.  And, of course, clean scripts will still run under CGI!

- TRAPS

  See mod\_perl\_traps.

## REPORTING PROBLEMS

Read the SUPPORT file.

## SEE ALSO

*Apache::PerlRun*(3)
