The Butterthlies salespeople seem to be taking their jobs more seriously. Our range has increased so much that the old catalog based around a single HTML document is no longer workable because there are too many cards. We have built a database of cards and a utility called cardinfo that accesses it using the arguments:
cardinfo cardid query
where cardid
is the number of the card and
query
is one of the following words:
“price,”
“artist,” or
“size.” The problem is that the
salespeople are too busy to remember the syntax, so we want to let
them log on to the card database as if it were a web site. For
instance, going to
http://sales.butterthlies.com/info/2949/price
would return the price of card number 2949. The Config file is in
... /site.rewrite
:
User webuser Group webgroup # Apache requires this server name, although in this case it will # never be used. # This is used as the default for any server that does not match a # VirtualHost section. ServerName www.butterthlies.com NameVirtualHost 192.168.123.2 <VirtualHost www.butterthlies.com> ServerAdmin sales@butterthlies.com DocumentRoot /usr/www/APACHE3/site.rewrite/htdocs/customers ServerName www.butterthlies.com ErrorLog /usr/www/APACHE3/site.rewrite/logs/customers/error_log TransferLog /usr/www/APACHE3/site.rewrite/logs/customers/access_log </VirtualHost> <VirtualHost sales.butterthlies.com> ServerAdmin sales_mgr@butterthlies.com DocumentRoot /usr/www/APACHE3/site.rewrite/htdocs/salesmen Options ExecCGI indexes ServerName sales.butterthlies.com ErrorLog /usr/www/APACHE3/site.rewrite/logs/salesmen/error_log TransferLog /usr/www/APACHE3/site.rewrite/logs/salesmen/access_log RewriteEngine on RewriteLog logs/rewrite RewriteLogLevel 9 RewriteRule ^/info/([^/]+)/([^/]+)$ /cgi-bin/cardinfo?$2+$1 [PT] ScriptAlias /cgi-bin /usr/www/APACHE3/cgi-bin </VirtualHost>
In real life cardinfo
would be an elaborate
program. However, here we just have to show that it could work, so it
is extremely simple:
#!/bin/sh # echo "content-type: text/html" echo sales.butterthlies.com echo "You made the query $1 on the card $2"
To make sure everything is in order before we do it for real, we turn
RewriteEngine
off
and access
http://sales.butterthlies.com/cgi-bin/cardinfo.
We get back the following message:
The requested URL /info/2949/price was not found on this server.
This is not surprising. We now stop Apache, turn
RewriteEngine
on
and restart
with ./go.
Look at the crucial line in the Config
file:
RewriteRule ^/info/([^/]+)/([^/]+)$ /cgi-bin/cardinfo?$2+$1 [PT]
Translated into English, this means the following: at the start of
the string, match /info/
, followed by one or more
characters that aren’t /
, and put
those characters into the variable $1
(the
parentheses do this; $1
because they are the first
set). Then match a /
, then one or more characters
aren’t /
, and put those
characters into $2
. Then match the end of the
string, and pass the result through [PT]
to the
next rule, which is ScriptAlias
. We end up as if
we had accessed
http://sales.butterthlies.com/cgi-bin/cardinfo?<card
ID>+<query>.
If the CGI script is on a different web server for some reason, we could write:
RewriteRule ^/info/([^/]+)/([^/]+)$ http://somewhere.else.com/cgi-bin/ cardinfo?$2+$1 [PT]
Note that this pattern won’t match /info/123/price/fred because it has too many slashes in it.
If we run all this with ./go
and access
http://sales.butterthlies.com/info/2949/price
from the client, we see the following message:
You made the query price on card 2949