NAME
rc–httpd – HTTP server

SYNOPSIS
rc–httpd/rc–httpd

DESCRIPTION
Rc–httpd serves the requested file or an index of files found under a website's root directory, or, in the case of CGI, executes a specified CGI program.

CONFIGURATION

As all pieces of rc–httpd are shell scripts, configuration is achieved by setting variables and adding, removing or modifying commands in various files.

rc–httpd

rc_httpd_dir must be set to the root of the rc–httpd installation, the directory containing the rc–httpd script.

path must include rc_httpd_dir/handlers ahead of the base system's path elements.

cgi_path is substituted for path when cgi scripts are run. (Be sure to set path back in rc–based cgi scripts.)

extra_headers is an optional list of strings to emit when sending http headers.

SERVER_PORT is the port HTTP is to be served on.

select–handler

PATH_INFO is the location relative to the website's root directory of the file to be displayed. Typically, the location from the incoming request is honored.

FS_ROOT sets the root directory of the website.

NOINDEXFILE instructs the dir–index module not to look for index.html files, otherwise if an index.html file is found dir–index will exec serve–static to serve the file. At present there is no module to serve an index file but not a directory.

If you do not want directory indexing at all, replace static–or–index with serve–static, which will report 503 forbidden for directories.

Multiple virtual hosts may be configured by creating conditional statements that act upon the SERVER_NAME variable. Fine–grained control of specific request strings may be configured via a similar method acting upon the location and/or other variables.

The REMOTE_USER variable provides a user identification string supplied by the client as part of user authentication.

EXAMPLES
The following examples demonstrate possible ways to configure select–handler.

Serve static files:
if(~ $SERVER_NAME 9front.org){
PATH_INFO=$location
FS_ROOT=/usr/sl/www/$SERVER_NAME
exec static–or–index
}

HTTP basic authentication:
if(~ $SERVER_NAME *restricted.org){
PATH_INFO=$location
FS_ROOT=/usr/kgb/www/$SERVER_NAME
authorize
if(~ $REMOTE_USER (glenda kgb))
exec static–or–index
error 401
}

CGI:
if(~ $SERVER_NAME *cat–v.org){
PATH_INFO=$location
FS_ROOT=/usr/sl/www/werc/sites/$SERVER_NAME
exec static–or–cgi /usr/sl/www/werc/bin/werc.rc
}

Custom error message for a denied URL:
fn do_error{
do_log $1
echo 'HTTP/1.1 '^$1^$cr
emit_extra_headers
echo 'Content–type: text/html'^$cr
echo $cr
echo '<html>
<
head>
<title>'^$1^'</title>
</head>
<body>
<h1>'^$1^'</h1>'
echo $2
echo '<p><i>rc–httpd at' $SERVER_NAME '</i>'
echo '
</body>
</html>
'
}
if(~ $location /v8.tar.bz2){
do_error '27b/6'
exit
}

STARTUP
Rc–httpd is run from a file in the directory scanned by listen(8), or called as an argument to aux/listen1. The program's standard error may be captured to a log file:
exec /rc/bin/rc–httpd/rc–httpd >>[2]/sys/log/www

FILES
/rc/bin/rc–httpd/rc–httpd
/rc/bin/rc–httpd/select–handler
/rc/bin/rc–httpd/handlers/authorize
/rc/bin/rc–httpd/handlers/cgi
/rc/bin/rc–httpd/handlers/dir–index
/rc/bin/rc–httpd/handlers/error
/rc/bin/rc–httpd/handlers/redirect
/rc/bin/rc–httpd/handlers/serve–static
/rc/bin/rc–httpd/handlers/static–or–cgi
/rc/bin/rc–httpd/handlers/static–or–index
/rc/bin/service/tcp80
/sys/log/www

SOURCE
/rc/bin/rc–httpd

SEE ALSO
rc(1), listen(8)

HISTORY
Rc–httpd first appeared in 9front (February, 2013).