| 1 |
root |
1.1 |
.TH thttpd 8 "29 February 2000" |
| 2 |
|
|
.SH NAME |
| 3 |
|
|
thttpd - tiny/turbo/throttling HTTP server |
| 4 |
|
|
.SH SYNOPSIS |
| 5 |
|
|
.B thttpd |
| 6 |
|
|
.RB [ -C |
| 7 |
|
|
.IR configfile ] |
| 8 |
|
|
.RB [ -p |
| 9 |
|
|
.IR port ] |
| 10 |
|
|
.RB [ -d |
| 11 |
|
|
.IR dir ] |
| 12 |
|
|
.RB [ -r | -nor ] |
| 13 |
|
|
.RB [ -s | -nos ] |
| 14 |
|
|
.RB [ -v | -nov ] |
| 15 |
|
|
.RB [ -g | -nog ] |
| 16 |
|
|
.RB [ -u |
| 17 |
|
|
.IR user ] |
| 18 |
|
|
.RB [ -c |
| 19 |
|
|
.IR cgipat ] |
| 20 |
|
|
.RB [ -t |
| 21 |
|
|
.IR throttles ] |
| 22 |
root |
1.1.4.1 |
.RB [ -n |
| 23 |
|
|
.lR connections ] |
| 24 |
|
|
.RB [ -o |
| 25 |
|
|
.lR timeout ] |
| 26 |
root |
1.1 |
.RB [ -h |
| 27 |
|
|
.IR host ] |
| 28 |
|
|
.RB [ -l |
| 29 |
|
|
.IR logfile ] |
| 30 |
|
|
.RB [ -i |
| 31 |
|
|
.IR pidfile ] |
| 32 |
|
|
.RB [ -T |
| 33 |
|
|
.IR charset ] |
| 34 |
|
|
.RB [ -V ] |
| 35 |
|
|
.RB [ -D ] |
| 36 |
|
|
.SH DESCRIPTION |
| 37 |
|
|
.PP |
| 38 |
|
|
.I thttpd |
| 39 |
|
|
is a simple, small, fast, and secure HTTP server. |
| 40 |
|
|
It doesn't have a lot of special features, but it suffices for most uses of |
| 41 |
|
|
the web, it's about as fast as the best full-featured servers (Apache, NCSA, |
| 42 |
|
|
Netscape), |
| 43 |
|
|
and it has one extremely useful feature (URL-traffic-based throttling) |
| 44 |
|
|
that no other server currently has. |
| 45 |
|
|
.SH OPTIONS |
| 46 |
|
|
.TP |
| 47 |
|
|
.B -C |
| 48 |
|
|
Specifies a config-file to read. |
| 49 |
|
|
All options can be set either by command-line flags or in the config file. |
| 50 |
|
|
See below for details. |
| 51 |
|
|
.TP |
| 52 |
|
|
.B -p |
| 53 |
|
|
Specifies an alternate port number to listen on. |
| 54 |
|
|
The default is 80. |
| 55 |
|
|
The config-file option name for this flag is "port", |
| 56 |
|
|
and the config.h option is DEFAULT_PORT. |
| 57 |
|
|
.TP |
| 58 |
|
|
.B -d |
| 59 |
|
|
Specifies a directory to chdir() to at startup. |
| 60 |
|
|
This is merely a convenience - you could just as easily |
| 61 |
|
|
do a cd in the shell script that invokes the program. |
| 62 |
|
|
The config-file option name for this flag is "dir", |
| 63 |
|
|
and the config.h options are WEBDIR, USE_USER_DIR. |
| 64 |
|
|
.TP |
| 65 |
|
|
.B -r |
| 66 |
|
|
Do a chroot() at initialization time, restricting file access |
| 67 |
|
|
to the program's current directory. |
| 68 |
|
|
If -r is the compiled-in default, then -nor disables it. |
| 69 |
|
|
See below for details. |
| 70 |
|
|
The config-file option names for this flag are "chroot" and "nochroot", |
| 71 |
|
|
and the config.h option is ALWAYS_CHROOT. |
| 72 |
|
|
.TP |
| 73 |
|
|
.B -nos |
| 74 |
|
|
Don't do explicit symbolic link checking. |
| 75 |
|
|
Normally, thttpd explicitly expands any symbolic links in filenames, |
| 76 |
|
|
to check that the resulting path stays within the original document tree. |
| 77 |
|
|
If you want to turn off this check and save some CPU time, you can use |
| 78 |
|
|
the -nos flag, however this is not recommended. |
| 79 |
|
|
Note, though, that if you are using the chroot option, the symlink |
| 80 |
|
|
checking is unnecessary and is turned off, so the safe way to save |
| 81 |
|
|
those CPU cycles is to use chroot. |
| 82 |
|
|
The config-file option names for this flag are "symlink" and "nosymlink". |
| 83 |
|
|
.TP |
| 84 |
|
|
.B -v |
| 85 |
|
|
Do el-cheapo virtual hosting. |
| 86 |
|
|
If -v is the compiled-in default, then -nov disables it. |
| 87 |
|
|
See below for details. |
| 88 |
|
|
The config-file option names for this flag are "vhost" and "novhost", |
| 89 |
|
|
and the config.h option is ALWAYS_VHOST. |
| 90 |
|
|
.TP |
| 91 |
|
|
.B -g |
| 92 |
|
|
Use a global passwd file. |
| 93 |
|
|
This means that every file in the entire document tree is protected by |
| 94 |
|
|
the single .htpasswd file at the top of the tree. |
| 95 |
|
|
Otherwise the semantics of the .htpasswd file are the same. |
| 96 |
|
|
If this option is set but there is no .htpasswd file in |
| 97 |
|
|
the top-level directory, then thttpd proceeds as if the option was |
| 98 |
|
|
not set - first looking for a local .htpasswd file, and if that doesn't |
| 99 |
|
|
exist either then serving the file without any password. |
| 100 |
|
|
If -g is the compiled-in default, then -nog disables it. |
| 101 |
|
|
The config-file option names for this flag are "globalpasswd" and |
| 102 |
|
|
"noglobalpasswd", |
| 103 |
|
|
and the config.h option is ALWAYS_GLOBAL_PASSWD. |
| 104 |
|
|
.TP |
| 105 |
|
|
.B -u |
| 106 |
|
|
Specifies what user to switch to after initialization when started as root. |
| 107 |
|
|
The default is "nobody". |
| 108 |
|
|
The config-file option name for this flag is "user", |
| 109 |
|
|
and the config.h option is DEFAULT_USER. |
| 110 |
|
|
.TP |
| 111 |
|
|
.B -c |
| 112 |
|
|
Specifies a wildcard pattern for CGI programs, for instance "**.cgi" |
| 113 |
|
|
or "/cgi-bin/*". |
| 114 |
|
|
See below for details. |
| 115 |
|
|
The config-file option name for this flag is "cgipat", |
| 116 |
|
|
and the config.h option is CGI_PATTERN. |
| 117 |
|
|
.TP |
| 118 |
|
|
.B -t |
| 119 |
|
|
Specifies a file of throttle settings. |
| 120 |
|
|
See below for details. |
| 121 |
|
|
The config-file option name for this flag is "throttles". |
| 122 |
root |
1.1.4.1 |
.TP |
| 123 |
|
|
.B -n |
| 124 |
|
|
Specifies the number of connections one IP address may have at one time. |
| 125 |
|
|
A 403 is returned, and the host with the IP address will be blocked for the timeout specified with -o. |
| 126 |
|
|
The config-file option name for this flag is "connections", it defaults to 0, which means no limit. |
| 127 |
|
|
A request which is blocked will receive "err403blocked.html" if it exists. |
| 128 |
|
|
.TP |
| 129 |
|
|
.B -o |
| 130 |
|
|
Specifies the time in minutes that a host who was blocked because of too many connections is totally blocked from the server. |
| 131 |
|
|
The config-file option name for this flag is "blocktime", |
| 132 |
|
|
and the config.h option is DEFAULT_BLOCKTIME. |
| 133 |
root |
1.1 |
.TP |
| 134 |
|
|
.B -h |
| 135 |
|
|
Specifies a hostname to bind to, for multihoming. |
| 136 |
|
|
The default is to bind to all hostnames supported on the local machine. |
| 137 |
|
|
See below for details. |
| 138 |
|
|
The config-file option name for this flag is "host", |
| 139 |
|
|
and the config.h option is SERVER_NAME. |
| 140 |
|
|
.TP |
| 141 |
|
|
.B -l |
| 142 |
|
|
Specifies a file for logging. |
| 143 |
|
|
If no -l argument is specified, thttpd logs via syslog(). |
| 144 |
|
|
If "-l /dev/null" is specified, thttpd doesn't log at all. |
| 145 |
|
|
The config-file option name for this flag is "logfile". |
| 146 |
|
|
.TP |
| 147 |
|
|
.B -i |
| 148 |
|
|
Specifies a file to write the process-id to. |
| 149 |
|
|
If no file is specified, no process-id is written. |
| 150 |
|
|
You can use this file to send signals to thttpd. |
| 151 |
|
|
See below for details. |
| 152 |
|
|
The config-file option name for this flag is "pidfile". |
| 153 |
|
|
.TP |
| 154 |
|
|
.B -T |
| 155 |
|
|
Specifies the character set to use with text MIME types. |
| 156 |
|
|
The default is iso-8859-1. |
| 157 |
|
|
The config-file option name for this flag is "charset", |
| 158 |
|
|
and the config.h option is DEFAULT_CHARSET. |
| 159 |
|
|
.TP |
| 160 |
|
|
.B -V |
| 161 |
|
|
Shows the current version info. |
| 162 |
|
|
.TP |
| 163 |
|
|
.B -D |
| 164 |
|
|
This was originally just a debugging flag, however it's worth mentioning |
| 165 |
|
|
because one of the things it does is prevent thttpd from making itself |
| 166 |
|
|
a background daemon. |
| 167 |
|
|
Instead it runs in the foreground like a regular program. |
| 168 |
|
|
This is necessary when you want to run thttpd wrapped in a little shell |
| 169 |
|
|
script that restarts it if it exits. |
| 170 |
|
|
.SH "CONFIG-FILE" |
| 171 |
|
|
.PP |
| 172 |
|
|
All the command-line options can also be set in a config file. |
| 173 |
|
|
One advantage of using a config file is that the file can be changed, |
| 174 |
|
|
and thttpd will pick up the changes with a restart. |
| 175 |
|
|
.PP |
| 176 |
|
|
The syntax of the config file is simple, a series of "option" or |
| 177 |
|
|
"option=value" separated by whitespace. |
| 178 |
|
|
The option names are listed above with their corresponding command-line flags. |
| 179 |
|
|
.SH "CHROOT" |
| 180 |
|
|
.PP |
| 181 |
|
|
chroot() is a system call that restricts the program's view |
| 182 |
|
|
of the filesystem to the current directory and directories |
| 183 |
|
|
below it. |
| 184 |
|
|
It becomes impossible for remote users to access any file |
| 185 |
|
|
outside of the initial directory. |
| 186 |
|
|
The restriction is inherited by child processes, so CGI programs get it too. |
| 187 |
|
|
This is a very strong security measure, and is recommended. |
| 188 |
|
|
The only downside is that only root can call chroot(), so this means |
| 189 |
|
|
the program must be started as root. |
| 190 |
|
|
However, the last thing it does during initialization is to |
| 191 |
|
|
give up root access by becoming another user, so this is safe. |
| 192 |
|
|
.PP |
| 193 |
|
|
The program can also be compile-time configured to always |
| 194 |
|
|
do a chroot(), without needing the -r flag. |
| 195 |
|
|
.PP |
| 196 |
|
|
Note that with some other web servers, such as NCSA httpd, setting |
| 197 |
|
|
up a directory tree for use with chroot() is complicated, involving |
| 198 |
|
|
creating a bunch of special directories and copying in various files. |
| 199 |
|
|
With thttpd it's a lot easier, all you have to do is make sure |
| 200 |
|
|
any shells, utilities, and config files used by your CGI programs and |
| 201 |
|
|
scripts are available. |
| 202 |
|
|
If you have CGI disabled, or if you make a policy that all CGI programs |
| 203 |
|
|
must be written in a compiled language such as C and statically linked, |
| 204 |
|
|
then you probably don't have to do any setup at all. |
| 205 |
|
|
.PP |
| 206 |
|
|
Relevant config.h option: ALWAYS_CHROOT. |
| 207 |
|
|
.SH "CGI" |
| 208 |
|
|
.PP |
| 209 |
|
|
thttpd supports the CGI 1.1 spec. |
| 210 |
|
|
.PP |
| 211 |
|
|
In order for a CGI program to be run, its name must match the pattern |
| 212 |
|
|
specified either at compile time or on the command line with the -c flag. |
| 213 |
|
|
This is a simple shell-style filename pattern. |
| 214 |
|
|
You can use * to match any string not including a slash, |
| 215 |
|
|
or ** to match any string including slashes, |
| 216 |
|
|
or ? to match any single character. |
| 217 |
|
|
You can also use multiple such patterns separated by |. |
| 218 |
|
|
The patterns get checked against the filename |
| 219 |
|
|
part of the incoming URL. |
| 220 |
|
|
Don't forget to quote any wildcard characters so that the shell doesn't |
| 221 |
|
|
mess with them. |
| 222 |
|
|
.PP |
| 223 |
|
|
Restricting CGI programs to a single directory lets the site administrator |
| 224 |
|
|
review them for security holes, and is strongly recommended. |
| 225 |
|
|
If there are individual users that you trust, you can enable their |
| 226 |
|
|
directories too. |
| 227 |
|
|
.PP |
| 228 |
|
|
If no CGI pattern is specified, neither here nor at compile time, |
| 229 |
|
|
then CGI programs cannot be run at all. |
| 230 |
|
|
If you want to disable CGI as a security measure, that's how you do it, just |
| 231 |
|
|
comment out the patterns in the config file and don't run with the -c flag. |
| 232 |
|
|
.PP |
| 233 |
|
|
Note: the current working directory when a CGI program gets run is |
| 234 |
|
|
the directory that the CGI program lives in. |
| 235 |
|
|
This isn't in the CGI 1.1 spec, but it's what most other HTTP servers do. |
| 236 |
|
|
.PP |
| 237 |
|
|
Relevant config.h options: CGI_PATTERN, CGI_TIMELIMIT, CGI_NICE, CGI_PATH, CGI_LD_LIBRARY_PATH, CGIBINDIR. |
| 238 |
|
|
.SH "BASIC AUTHENTICATION" |
| 239 |
|
|
.PP |
| 240 |
|
|
Basic Authentication is available as an option at compile time. |
| 241 |
|
|
If enabled, it uses a password file in the directory to be protected, |
| 242 |
|
|
called .htpasswd by default. |
| 243 |
|
|
This file is formatted as the familiar colon-separated |
| 244 |
|
|
username/encrypted-password pair, records delimited by newlines. |
| 245 |
|
|
The protection does not carry over to subdirectories. |
| 246 |
|
|
The utility program htpasswd(1) is included to help create and |
| 247 |
|
|
modify .htpasswd files. |
| 248 |
|
|
.PP |
| 249 |
|
|
Relevant config.h option: AUTH_FILE |
| 250 |
|
|
.SH "THROTTLING" |
| 251 |
|
|
.PP |
| 252 |
|
|
The throttle file lets you set maximum byte rates on URLs or URL groups. |
| 253 |
|
|
There is no provision for setting a maximum request rate throttle, |
| 254 |
|
|
because throttling a request uses as much cpu as handling it, so |
| 255 |
|
|
there would be no point. |
| 256 |
|
|
.PP |
| 257 |
|
|
The format of the throttle file is very simple. |
| 258 |
|
|
A # starts a comment, and the rest of the line is ignored. |
| 259 |
|
|
Blank lines are ignored. |
| 260 |
|
|
The rest of the lines should consist of a pattern, whitespace, and a number. |
| 261 |
|
|
The pattern is a simple shell-style filename pattern, using ?/**/*, or |
| 262 |
|
|
multiple such patterns separated by |. |
| 263 |
|
|
.PP |
| 264 |
|
|
The numbers in the file are byte rates, specified in units of bytes per second. |
| 265 |
|
|
For comparison, a v.32b/v.42b modem gives about 1500/2000 B/s |
| 266 |
|
|
depending on compression, a double-B-channel ISDN line about |
| 267 |
|
|
12800 B/s, and a T1 line is about 150000 B/s. |
| 268 |
|
|
.PP |
| 269 |
|
|
Example: |
| 270 |
|
|
.nf |
| 271 |
|
|
# throttle file for www.acme.com |
| 272 |
|
|
|
| 273 |
|
|
** 100000 # limit total web usage to 2/3 of our T1 |
| 274 |
|
|
**.jpg|**.gif 50000 # limit images to 1/3 of our T1 |
| 275 |
|
|
**.mpg 20000 # and movies to even less |
| 276 |
|
|
jef/** 20000 # jef's pages are too popular |
| 277 |
|
|
.fi |
| 278 |
|
|
.PP |
| 279 |
|
|
Throttling is implemented by checking each incoming URL filename against all |
| 280 |
|
|
of the patterns in the throttle file. |
| 281 |
|
|
The server accumulates statistics on how much bandwidth each pattern |
| 282 |
|
|
has accounted for recently (via a rolling average). |
| 283 |
|
|
If a URL matches a pattern that has been exceeding its specified limit, |
| 284 |
|
|
then the data returned is actually slowed down, with |
| 285 |
|
|
pauses between each block. |
| 286 |
|
|
If that's not possible (e.g. for CGI programs), then |
| 287 |
|
|
the server returns a special code saying 'try again later'. |
| 288 |
|
|
.SH "MULTIHOMING" |
| 289 |
|
|
.PP |
| 290 |
|
|
Multihoming means using one machine to serve multiple hostnames. |
| 291 |
|
|
For instance, if you're an internet provider and you want to let |
| 292 |
|
|
all of your customers have customized web addresses, you might |
| 293 |
|
|
have www.joe.acme.com, www.jane.acme.com, and your own www.acme.com, |
| 294 |
|
|
all running on the same physical hardware. |
| 295 |
|
|
This feature is also known as "virtual hosts". |
| 296 |
|
|
There are three steps to setting this up. |
| 297 |
|
|
.PP |
| 298 |
|
|
One, make DNS entries for all of the hostnames. |
| 299 |
|
|
The current way to do this, allowed by HTTP/1.1, is to use CNAME aliases, |
| 300 |
|
|
like so: |
| 301 |
|
|
.nf |
| 302 |
|
|
www.acme.com IN A 192.100.66.1 |
| 303 |
|
|
www.joe.acme.com IN CNAME www.acme.com |
| 304 |
|
|
www.jane.acme.com IN CNAME www.acme.com |
| 305 |
|
|
.fi |
| 306 |
|
|
However, this is incompatible with older HTTP/1.0 browsers. |
| 307 |
|
|
If you want to stay compatible, there's a different way - use A records |
| 308 |
|
|
instead, each with a different IP address, like so: |
| 309 |
|
|
.nf |
| 310 |
|
|
www.acme.com IN A 192.100.66.1 |
| 311 |
|
|
www.joe.acme.com IN A 192.100.66.200 |
| 312 |
|
|
www.jane.acme.com IN A 192.100.66.201 |
| 313 |
|
|
.fi |
| 314 |
|
|
This is bad because it uses extra IP addresses, a somewhat scarce resource. |
| 315 |
|
|
But if you want people with older browsers to be able to visit your |
| 316 |
|
|
sites, you still have to do it this way. |
| 317 |
|
|
.PP |
| 318 |
|
|
Step two. |
| 319 |
|
|
If you're using the modern CNAME method of multihoming, then you can |
| 320 |
|
|
skip this step. |
| 321 |
|
|
Otherwise, using the older multiple-IP-address method you |
| 322 |
|
|
must set up IP aliases or multiple interfaces for the extra addresses. |
| 323 |
|
|
You can use ifconfig(8)'s alias command to tell the machine to answer to |
| 324 |
|
|
all of the different IP addresses. |
| 325 |
|
|
Example: |
| 326 |
|
|
.nf |
| 327 |
|
|
ifconfig le0 www.acme.com |
| 328 |
|
|
ifconfig le0 www.joe.acme.com alias |
| 329 |
|
|
ifconfig le0 www.jane.acme.com alias |
| 330 |
|
|
.fi |
| 331 |
|
|
If your OS's version of ifconfig doesn't have an alias command, you're |
| 332 |
|
|
probably out of luck (but see http://www.acme.com/software/thttpd/notes.html). |
| 333 |
|
|
.PP |
| 334 |
|
|
Third and last, you must set up thttpd to handle the multiple hosts. |
| 335 |
|
|
The easiest way is with the -v flag, or the ALWAYS_VHOST config.h option. |
| 336 |
|
|
This works with either CNAME multihosting or multiple-IP multihosting. |
| 337 |
|
|
What it does is send each incoming request to a subdirectory based on the |
| 338 |
|
|
hostname it's intended for. |
| 339 |
|
|
All you have to do in order to set things up is to create those subdirectories |
| 340 |
|
|
in the directory where thttpd will run. |
| 341 |
|
|
With the example above, you'd do like so: |
| 342 |
|
|
.nf |
| 343 |
|
|
mkdir www.acme.com www.joe.acme.com www.jane.acme.com |
| 344 |
|
|
.fi |
| 345 |
|
|
If you're using old-style multiple-IP multihosting, you should also create |
| 346 |
|
|
symbolic links from the numeric addresses to the names, like so: |
| 347 |
|
|
.nf |
| 348 |
|
|
ln -s www.acme.com 192.100.66.1 |
| 349 |
|
|
ln -s www.joe.acme.com 192.100.66.200 |
| 350 |
|
|
ln -s www.jane.acme.com 192.100.66.201 |
| 351 |
|
|
.fi |
| 352 |
|
|
This lets the older HTTP/1.0 browsers find the right subdirectory. |
| 353 |
|
|
.PP |
| 354 |
|
|
There's an optional alternate step three if you're using multiple-IP |
| 355 |
|
|
multihosting: run a separate thttpd process for each hostname, using |
| 356 |
|
|
the -h flag to specify which one is which. |
| 357 |
|
|
This gives you more flexibility, since you can run each of these processes |
| 358 |
|
|
in separate directories, with different throttle files, etc. |
| 359 |
|
|
Example: |
| 360 |
|
|
.nf |
| 361 |
|
|
thttpd -r -d /usr/www -h www.acme.com |
| 362 |
|
|
thttpd -r -d /usr/www/joe -u joe -h www.joe.acme.com |
| 363 |
|
|
thttpd -r -d /usr/www/jane -u jane -h www.jane.acme.com |
| 364 |
|
|
.fi |
| 365 |
|
|
But remember, this multiple-process method does not work with CNAME |
| 366 |
|
|
multihosting - for that, you must use a single thttpd process with |
| 367 |
|
|
the -v flag. |
| 368 |
|
|
.SH "CUSTOM ERRORS" |
| 369 |
|
|
.PP |
| 370 |
|
|
thttpd lets you define your own custom error pages for the various |
| 371 |
|
|
HTTP errors. |
| 372 |
|
|
There's a separate file for each error number, all stored in one |
| 373 |
|
|
special directory. |
| 374 |
|
|
The directory name is "errors", at the top of the web directory tree. |
| 375 |
|
|
The error files should be named "errNNN.html", where NNN is the error number. |
| 376 |
|
|
So for example, to make a custom error page for the authentication failure |
| 377 |
|
|
error, which is number 401, you would put your HTML into the file |
| 378 |
|
|
"errors/err401.html". |
| 379 |
|
|
If no custom error file is found for a given error number, then the |
| 380 |
|
|
usual built-in error page is generated. |
| 381 |
|
|
.PP |
| 382 |
|
|
If you're using the virtual hosts option, you can also have different |
| 383 |
|
|
custom error pages for each different virtual host. |
| 384 |
|
|
In this case you put another "errors" directory in the top of that |
| 385 |
|
|
virtual host's web tree. |
| 386 |
|
|
thttpd will look first in the virtual host errors directory, and |
| 387 |
|
|
then in the server-wide errors directory, and if neither of those |
| 388 |
|
|
has an appropriate error file then it will generate the built-in error. |
| 389 |
|
|
.SH "NON-LOCAL REFERERS" |
| 390 |
|
|
.PP |
| 391 |
|
|
Sometimes another site on the net will embed your image files in their |
| 392 |
|
|
HTML files, which basically means they're stealing your bandwidth. |
| 393 |
|
|
You can prevent them from doing this by using non-local referer filtering. |
| 394 |
|
|
With this option, certain files can only be fetched via a local referer. |
| 395 |
|
|
The files have to be referenced by a local web page. |
| 396 |
|
|
If a web page on some other site references the files, that fetch will |
| 397 |
|
|
be blocked. |
| 398 |
|
|
There are three config-file variables for this feature: |
| 399 |
|
|
.TP |
| 400 |
|
|
.B urlpat |
| 401 |
|
|
A wildcard pattern for the URLs that should require a local referer. |
| 402 |
|
|
This is typically just image files, sound files, and so on. |
| 403 |
|
|
For example: |
| 404 |
|
|
.nf |
| 405 |
|
|
urlpat=**.jpg|**.gif|**.au|**.wav |
| 406 |
|
|
.fi |
| 407 |
|
|
For most sites, that one setting is all you need to enable referer filtering. |
| 408 |
|
|
.TP |
| 409 |
|
|
.B noemptyreferers |
| 410 |
|
|
By default, requests with no referer at all, or a null referer, or a |
| 411 |
|
|
referer with no apparent hostname, are allowed. |
| 412 |
|
|
With this variable set, such requests are disallowed. |
| 413 |
|
|
.TP |
| 414 |
|
|
.B localpat |
| 415 |
|
|
A wildcard pattern that specifies the local host or hosts. |
| 416 |
|
|
This is used to determine if the host in the referer is local or not. |
| 417 |
|
|
If not specified it defaults to the actual local hostname. |
| 418 |
|
|
.SH SYMLINKS |
| 419 |
|
|
.PP |
| 420 |
|
|
thttpd is very picky about symbolic links. |
| 421 |
|
|
Before delivering any file, it first checks each element in the path |
| 422 |
|
|
to see if it's a symbolic link, and expands them all out to get the final |
| 423 |
|
|
actual filename. |
| 424 |
|
|
Along the way it checks for things like links with ".." that go above |
| 425 |
|
|
the server's directory, and absolute symlinks (ones that start with a /). |
| 426 |
|
|
These are prohibited as security holes, so the server returns an |
| 427 |
|
|
error page for them. |
| 428 |
|
|
This means you can't set up your web directory with a bunch of symlinks |
| 429 |
|
|
pointing to individual users' home web directories. |
| 430 |
|
|
Instead you do it the other way around - the user web directories are |
| 431 |
|
|
real subdirs of the main web directory, and in each user's home |
| 432 |
|
|
dir there's a symlink pointing to their actual web dir. |
| 433 |
|
|
.PP |
| 434 |
|
|
The CGI pattern is also affected - it gets matched against the fully-expanded |
| 435 |
|
|
filename. So, if you have a single CGI directory but then put a symbolic |
| 436 |
|
|
link in it pointing somewhere else, that won't work. The CGI program will be |
| 437 |
|
|
treated as a regular file and returned to the client, instead of getting run. |
| 438 |
|
|
This could be confusing. |
| 439 |
|
|
.SH PERMISSIONS |
| 440 |
|
|
.PP |
| 441 |
|
|
thttpd is also picky about file permissions. |
| 442 |
|
|
It wants data files (HTML, images) to be world readable. |
| 443 |
|
|
Readable by the group that the thttpd process runs as is not enough - thttpd |
| 444 |
|
|
checks explicitly for the world-readable bit. |
| 445 |
|
|
This is so that no one ever gets surprised by a file that's not set |
| 446 |
|
|
world-readable and yet somehow is readable by the HTTP server and |
| 447 |
|
|
therefore the *whole* world. |
| 448 |
|
|
.PP |
| 449 |
|
|
The same logic applies to directories. |
| 450 |
|
|
As with the standard Unix "ls" program, thttpd will only let you |
| 451 |
|
|
look at the contents of a directory if its read bit is on; but |
| 452 |
|
|
as with data files, this must be the world-read bit, not just the |
| 453 |
|
|
group-read bit. |
| 454 |
|
|
.PP |
| 455 |
|
|
thttpd also wants the execute bit to be *off* for data files. |
| 456 |
|
|
A file that is marked executable but doesn't match the CGI pattern |
| 457 |
|
|
might be a script or program that got accidentally left in the |
| 458 |
|
|
wrong directory. |
| 459 |
|
|
Allowing people to fetch the contents of the file might be a security breach, |
| 460 |
|
|
so this is prohibited. |
| 461 |
|
|
Of course if an executable file *does* match the CGI pattern, then it |
| 462 |
|
|
just gets run as a CGI. |
| 463 |
|
|
.PP |
| 464 |
|
|
In summary, data files should be mode 644 (rw-r--r--), |
| 465 |
|
|
directories should be 755 (rwxr-xr-x) if you want to allow indexing and |
| 466 |
|
|
711 (rwx--x--x) to disallow it, and CGI programs should be mode |
| 467 |
|
|
755 (rwxr-xr-x) or 711 (rwx--x--x). |
| 468 |
|
|
.SH LOGS |
| 469 |
|
|
.PP |
| 470 |
|
|
thttpd does all of its logging via syslog(3). |
| 471 |
|
|
The facility it uses is configurable. |
| 472 |
|
|
Aside from error messages, there are only a few log entry types of interest, |
| 473 |
|
|
all fairly similar to CERN Common Log Format: |
| 474 |
|
|
.nf |
| 475 |
|
|
Aug 6 15:40:34 acme thttpd[583]: 165.113.207.103 - - "GET /file" 200 357 |
| 476 |
|
|
Aug 6 15:40:43 acme thttpd[583]: 165.113.207.103 - - "HEAD /file" 200 0 |
| 477 |
|
|
Aug 6 15:41:16 acme thttpd[583]: referer http://www.acme.com/ -> /dir |
| 478 |
|
|
Aug 6 15:41:16 acme thttpd[583]: user-agent Mozilla/1.1N |
| 479 |
|
|
.fi |
| 480 |
|
|
The package includes a script for translating these log entries info |
| 481 |
|
|
CERN-compatible files. |
| 482 |
|
|
Note that thttpd does not translate numeric IP addresses into domain names. |
| 483 |
|
|
This is both to save time and as a minor security measure (the numeric |
| 484 |
|
|
address is harder to spoof). |
| 485 |
|
|
.PP |
| 486 |
|
|
Relevant config.h option: LOG_FACILITY. |
| 487 |
|
|
.PP |
| 488 |
|
|
If you'd rather log directly to a file, you can use the -l command-line |
| 489 |
|
|
flag. But note that error messages still go to syslog. |
| 490 |
|
|
.SH SIGNALS |
| 491 |
|
|
.PP |
| 492 |
|
|
thttpd handles a couple of signals, which you can send via the |
| 493 |
|
|
standard Unix kill(1) command: |
| 494 |
|
|
.TP |
| 495 |
|
|
.B INT,TERM |
| 496 |
|
|
These signals tell thttpd to shut down immediately. |
| 497 |
|
|
Any requests in progress get aborted. |
| 498 |
|
|
.TP |
| 499 |
|
|
.B USR1 |
| 500 |
|
|
This signal tells thttpd to shut down as soon as it's done servicing |
| 501 |
|
|
all current requests. |
| 502 |
|
|
In addition, the network socket it uses to accept new connections gets |
| 503 |
|
|
closed immediately, which means a fresh thttpd can be started up |
| 504 |
|
|
immediately. |
| 505 |
|
|
.TP |
| 506 |
|
|
.B HUP |
| 507 |
|
|
This signal tells thttpd to close and re-open its (non-syslog) log file, |
| 508 |
|
|
for instance if you rotated the logs and want thttpd to start using the |
| 509 |
|
|
new one. |
| 510 |
|
|
However, this feature isn't actually that useful at the moment. |
| 511 |
|
|
The problem is that thttpd will generally be started as root, so that |
| 512 |
|
|
it can bind to port 80; then it gives up the root uid as soon as it can, |
| 513 |
|
|
for security reasons. |
| 514 |
|
|
But if you later send it a HUP, it will try to re-open the log file |
| 515 |
|
|
without root access and will generally fail. |
| 516 |
|
|
Also, if you're running inside a chroot tree, as you should be, |
| 517 |
|
|
the log file won't even be accessible. |
| 518 |
|
|
Currently the best alternative for log rotation is to send a USR1 signal, |
| 519 |
|
|
shutting down thttpd altogether, and then restart it. |
| 520 |
|
|
.SH "SEE ALSO" |
| 521 |
|
|
redirect(8), ssi(8), makeweb(1), htpasswd(1), syslogtocern(8), weblog_parse(1), http_get(1) |
| 522 |
|
|
.SH THANKS |
| 523 |
|
|
.PP |
| 524 |
|
|
Many thanks to contributors, reviewers, testers: |
| 525 |
|
|
John LoVerso, Jordan Hayes, Chris Torek, Jim Thompson, Barton Schaffer, |
| 526 |
|
|
Geoff Adams, Dan Kegel, John Hascall, Bennett Todd, KIKUCHI Takahiro, |
| 527 |
|
|
Catalin Ionescu. |
| 528 |
|
|
Special thanks to Craig Leres for substantial debugging and development, |
| 529 |
|
|
and for not complaining about my coding style very much. |
| 530 |
|
|
.SH AUTHOR |
| 531 |
|
|
Copyright © 1995,1998,1999,2000 by Jef Poskanzer <jef@acme.com>. |
| 532 |
|
|
All rights reserved. |
| 533 |
|
|
.\" Redistribution and use in source and binary forms, with or without |
| 534 |
|
|
.\" modification, are permitted provided that the following conditions |
| 535 |
|
|
.\" are met: |
| 536 |
|
|
.\" 1. Redistributions of source code must retain the above copyright |
| 537 |
|
|
.\" notice, this list of conditions and the following disclaimer. |
| 538 |
|
|
.\" 2. Redistributions in binary form must reproduce the above copyright |
| 539 |
|
|
.\" notice, this list of conditions and the following disclaimer in the |
| 540 |
|
|
.\" documentation and/or other materials provided with the distribution. |
| 541 |
|
|
.\" |
| 542 |
|
|
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND |
| 543 |
|
|
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| 544 |
|
|
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| 545 |
|
|
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE |
| 546 |
|
|
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| 547 |
|
|
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
| 548 |
|
|
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
| 549 |
|
|
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
| 550 |
|
|
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
| 551 |
|
|
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| 552 |
|
|
.\" SUCH DAMAGE. |