Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation...

682
Apache HTTP Server Documentation Version 2.0 Apache Software Foundation February 3, 2014

Transcript of Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation...

Page 1: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

Apache HTTP Server Documentation Version 2.0

Apache Software Foundation

February 3, 2014

Page 2: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

ii

About The PDF Documentation

Copyright c©2013 The Apache Software Foundation

Licensed under the Apache License, Version 2.0 (the ”License”); you may not use this file except in compliance withthe License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0

This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLTwith the help of Apache Ant, Apache XML Xalan, and Apache XML Xerces.

Since the HTML version of the documentation is more commonly checked during development, the PDF ver-sion may contain some errors and inconsistencies, especially in formatting. If you have difficulty reading apart of this file, please consult the HTML version of the documentation on the Apache HTTP Server website athttp://httpd.apache.org/docs/2.0/

The Apache HTTP Server Documentation is maintained by the Apache HTTP Server Documentation Project. Moreinformation is available at http://httpd.apache.org/docs-project/

Page 3: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

Contents

1 Release Notes 1

1.1 Upgrading to 2.0 from 1.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

1.2 Overview of new features in Apache 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

1.3 The Apache License, Version 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

2 Using the Apache HTTP Server 9

2.1 Compiling and Installing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

2.2 Starting Apache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

2.3 Stopping and Restarting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

2.4 Configuration Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

2.5 Configuration Sections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

2.6 Server-Wide Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

2.7 Log Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

2.8 Mapping URLs to Filesystem Locations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

2.9 Security Tips . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

2.10 Dynamic Shared Object (DSO) Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

2.11 Content Negotiation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

2.12 Custom Error Responses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

2.13 Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

2.14 Multi-Processing Modules (MPMs) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

2.15 Environment Variables in Apache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

2.16 Apache’s Handler Use . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

2.17 Filters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

2.18 suEXEC Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

2.19 Apache Performance Tuning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

2.20 URL Rewriting Guide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86

3 Apache Virtual Host documentation 109

3.1 Apache Virtual Host documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110

iii

Page 4: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

iv CONTENTS

3.2 Name-based Virtual Host Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111

3.3 Apache IP-based Virtual Host Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

3.4 Dynamically Configured Mass Virtual Hosting . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116

3.5 VirtualHost Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

3.6 An In-Depth Discussion of Virtual Host Matching . . . . . . . . . . . . . . . . . . . . . . . . . . 129

3.7 File Descriptor Limits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134

3.8 Issues Regarding DNS and Apache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136

4 Apache Server Frequently Asked Questions 139

4.1 Frequently Asked Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140

4.2 Support - Frequently Asked Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141

4.3 Error Messages - Frequently Asked Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143

5 Apache SSL/TLS Encryption 145

5.1 Apache SSL/TLS Encryption . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

5.2 SSL/TLS Strong Encryption: An Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147

5.3 SSL/TLS Strong Encryption: Compatibility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156

5.4 SSL/TLS Strong Encryption: How-To . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160

5.5 SSL/TLS Strong Encryption: FAQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165

6 Guides, Tutorials, and HowTos 179

6.1 How-To / Tutorials . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180

6.2 Authentication, Authorization and Access Control . . . . . . . . . . . . . . . . . . . . . . . . . . 181

6.3 Apache Tutorial: Dynamic Content with CGI . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185

6.4 Apache Tutorial: Introduction to Server Side Includes . . . . . . . . . . . . . . . . . . . . . . . . 191

6.5 Apache Tutorial: .htaccess files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197

6.6 Per-user web directories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202

6.7 Apache Tutorials . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204

7 Platform-specific Notes 207

7.1 Platform Specific Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208

7.2 Using Apache with Microsoft Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209

7.3 Compiling Apache for Microsoft Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218

7.4 Using Apache With Novell NetWare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223

7.5 Running a High-Performance Web Server on HPUX . . . . . . . . . . . . . . . . . . . . . . . . . 229

7.6 The Apache EBCDIC Port . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230

8 Apache HTTP Server and Supporting Programs 235

8.1 Server and Supporting Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236

Page 5: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

CONTENTS v

8.2 httpd - Apache Hypertext Transfer Protocol Server . . . . . . . . . . . . . . . . . . . . . . . . . . 237

8.3 ab - Apache HTTP server benchmarking tool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239

8.4 apachectl - Apache HTTP Server Control Interface . . . . . . . . . . . . . . . . . . . . . . . . . . 241

8.5 apxs - APache eXtenSion tool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243

8.6 configure - Configure the source tree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247

8.7 dbmmanage - Manage user authentication files in DBM format . . . . . . . . . . . . . . . . . . . 257

8.8 htdbm - Manipulate DBM password databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259

8.9 htdigest - manage user files for digest authentication . . . . . . . . . . . . . . . . . . . . . . . . . 262

8.10 htpasswd - Manage user files for basic authentication . . . . . . . . . . . . . . . . . . . . . . . . 263

8.11 logresolve - Resolve IP-addresses to hostnames in Apache log files . . . . . . . . . . . . . . . . . 265

8.12 rotatelogs - Piped logging program to rotate Apache logs . . . . . . . . . . . . . . . . . . . . . . 266

8.13 suexec - Switch user before executing external programs . . . . . . . . . . . . . . . . . . . . . . . 268

8.14 Other Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269

9 Apache Miscellaneous Documentation 271

9.1 Apache Miscellaneous Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272

9.2 International Customized Server Error Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . 273

9.3 Connections in the FIN WAIT 2 state and Apache . . . . . . . . . . . . . . . . . . . . . . . . . . 281

9.4 Known Problems in Clients . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286

9.5 Descriptors and Apache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291

9.6 Relevant Standards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294

10 Apache modules 297

10.1 Terms Used to Describe Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298

10.2 Terms Used to Describe Directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299

10.3 Apache Module core . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302

10.4 Apache Module mod access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342

10.5 Apache Module mod actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346

10.6 Apache Module mod alias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348

10.7 Apache Module mod asis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353

10.8 Apache Module mod auth . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355

10.9 Apache Module mod auth anon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358

10.10 Apache Module mod auth dbm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361

10.11 Apache Module mod auth digest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364

10.12 Apache Module mod auth ldap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369

10.13 Apache Module mod autoindex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380

10.14 Apache Module mod cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391

10.15 Apache Module mod cern meta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397

Page 6: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

vi CONTENTS

10.16 Apache Module mod cgi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399

10.17 Apache Module mod cgid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402

10.18 Apache Module mod charset lite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403

10.19 Apache Module mod dav . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406

10.20 Apache Module mod dav fs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410

10.21 Apache Module mod deflate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411

10.22 Apache Module mod dir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416

10.23 Apache Module mod disk cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418

10.24 Apache Module mod dumpio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423

10.25 Apache Module mod echo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425

10.26 Apache Module mod env . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426

10.27 Apache Module mod example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428

10.28 Apache Module mod expires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430

10.29 Apache Module mod ext filter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433

10.30 Apache Module mod file cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439

10.31 Apache Module mod headers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442

10.32 Apache Module mod imap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446

10.33 Apache Module mod include . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450

10.34 Apache Module mod info . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459

10.35 Apache Module mod isapi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461

10.36 Apache Module mod ldap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465

10.37 Apache Module mod log config . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471

10.38 Apache Module mod log forensic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476

10.39 Apache Module mod logio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478

10.40 Apache Module mod mem cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479

10.41 Apache Module mod mime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483

10.42 Apache Module mod mime magic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495

10.43 Apache Module mod negotiation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499

10.44 Apache Module mod nw ssl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503

10.45 Apache Module mod proxy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504

10.46 Apache Module mod proxy connect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518

10.47 Apache Module mod proxy ftp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519

10.48 Apache Module mod proxy http . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520

10.49 Apache Module mod rewrite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521

10.50 Apache Module mod setenvif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541

10.51 Apache Module mod so . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545

10.52 Apache Module mod speling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547

Page 7: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

CONTENTS vii

10.53 Apache Module mod ssl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549

10.54 Apache Module mod status . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573

10.55 Apache Module mod suexec . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575

10.56 Apache Module mod unique id . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576

10.57 Apache Module mod userdir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578

10.58 Apache Module mod usertrack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580

10.59 Apache Module mod version . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584

10.60 Apache Module mod vhost alias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586

10.61 Apache Module beos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590

10.62 Apache Module mpm common . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592

10.63 Apache Module leader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603

10.64 Apache Module mpm netware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604

10.65 Apache Module mpmt os2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 606

10.66 Apache Module perchild . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607

10.67 Apache Module prefork . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611

10.68 Apache Module threadpool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614

10.69 Apache Module mpm winnt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615

10.70 Apache Module worker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616

11 Developer Documentation 619

11.1 Developer Documentation for Apache 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 620

11.2 Apache 1.3 API notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621

11.3 Debugging Memory Allocation in APR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637

11.4 Documenting Apache 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640

11.5 Apache 2.0 Hook Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 641

11.6 Converting Modules from Apache 1.3 to Apache 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . 644

11.7 Request Processing in Apache 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 648

11.8 How filters work in Apache 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 652

12 Glossary and Index 655

12.1 Glossary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 656

12.2 Module Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 660

12.3 Directive Quick Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663

Page 8: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

viii CONTENTS

Page 9: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

Chapter 1

Release Notes

1

Page 10: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2 CHAPTER 1. RELEASE NOTES

1.1 Upgrading to 2.0 from 1.3

In order to assist folks upgrading, we maintain a document describing information critical to existing Apache users.These are intended to be brief notes, and you should be able to find more information in either the New Features (p. 4)document, or in the src/CHANGES file.

See also

• Overview of new features in Apache 2.0 (p. 4)

Compile-Time Configuration Changes

• Apache now uses an autoconf and libtool system for configuring the build processes (p. 10) . Using thissystem is similar to, but not the same as, using the APACI system in Apache 1.3.

• In addition to the usual selection of modules which you can choose to compile, Apache 2.0 has moved the mainpart of request processing into Multi-Processing Modules (p. 59) (MPMs).

Run-Time Configuration Changes

• Many directives that were in the core server in Apache 1.3 are now in the MPMs. If you wish the behavior of theserver to be as similar as possible to the behavior of Apache 1.3, you should select the PREFORK MPM. OtherMPMs will have different directives to control process creation and request processing.

• The proxy module (p. 504) has been revamped to bring it up to HTTP/1.1. Among the important changes, proxyaccess control is now placed inside a <PROXY> block rather than a <Directory proxy:> block.

• The handling of PATH INFO (trailing path information after the true filename) has changed for some modules.Modules that were previously implemented as a handler but are now implemented as a filter may no longeraccept requests with PATH INFO. Filters such as INCLUDES (p. 450) or PHP1 are implemented on top of thecore handler, and therefore reject requests with PATH INFO. You can use the ACCEPTPATHINFO directive toforce the core handler to accept requests with PATH INFO and thereby restore the ability to use PATH INFO inserver-side includes.

• The CACHENEGOTIATEDDOCS directive now takes the argument on or off. Existing instances of CACHENE-GOTIATEDDOCS should be replaced with CacheNegotiatedDocs on.

• The ERRORDOCUMENT directive no longer uses a quote at the beginning of the argument to indicate a textmessage. Instead, you should enclose the message in double quotes. For example, existing instances of

ErrorDocument 403 "Some Message

should be replaced with

ErrorDocument 403 "Some Message"

As long as the second argument is not a valid URL or pathname, it will be treated as a text message.

• The AccessConfig and ResourceConfig directives no longer exist. Existing instances of these directivescan be replaced with the INCLUDE directive which has equivalent functionality. If you were making use ofthe default values of these directives without including them in the configuration files, you may need to addInclude conf/access.conf and Include conf/srm.conf to your httpd.conf. In order toassure that Apache reads the configuration files in the same order as was implied by the older directives, theINCLUDE directives should be placed at the end of httpd.conf, with the one for srm.conf preceding theone for access.conf.

1http://www.php.net/

Page 11: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

1.1. UPGRADING TO 2.0 FROM 1.3 3

• The BindAddress and Port directives no longer exist. Equivalent functionality is provided with the moreflexible LISTEN directive.

• Another use of the Port directive in Apache-1.3 was setting the port number to be used in self-referentialURL’s. The Apache-2.0 equivalent is the new SERVERNAME syntax: it has been changed to allow specifyingboth the hostname and the port number for self-referential URL’s in one directive.

• The ServerType directive no longer exists. The method used to serve requests is now determined by theselection of MPM. There is currently no MPM designed to be launched by inetd.

• The mod log agent and mod log referer modules which provided the AgentLog, RefererLog andRefererIgnore directives have been removed. Agent and referer logs are still available using the CUSTOM-LOG directive of MOD LOG CONFIG.

• The AddModule and ClearModuleList directives no longer exist. These directives were used to ensurethat modules could be enabled in the correct order. The new Apache 2.0 API allows modules to explicitlyspecify their ordering, eliminating the need for these directives.

• The FancyIndexing directive has been removed. The same functionality is available through theFancyIndexing option to the INDEXOPTIONS directive.

• The MultiViews content-negotiation technique provided by MOD NEGOTIATION has become more strict in itsdefault file matching. It will select only from negotiable files. The old behavior can be restored using theMULTIVIEWSMATCH directive.

• (since version 2.0.51) The functionality of the ErrorHeader directive was put together with the HEADERdirective, since it was a misnomer. Use

Header always set foo bar

instead to get the desired behaviour.

Misc Changes

• The module MOD AUTH DIGEST, which was experimental in Apache 1.3, is now a standard module.

• The mod mmap static module, which was experimental in Apache 1.3, has been replaced withMOD FILE CACHE.

• The distribution has been completely reorganized so that it no longer contains an independent src directory. In-stead, the sources are logically organized under the main distribution directory, and installations of the compiledserver should be directed to a separate directory.

Third Party Modules

Extensive changes were made to the server API in Apache 2.0. Existing modules designed for the Apache 1.3 APIwill not work in Apache 2.0 without modification. Details are provided in the developer documentation (p. 620) .

Page 12: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

4 CHAPTER 1. RELEASE NOTES

1.2 Overview of new features in Apache 2.0

This document describes some of the major changes between the 1.3 and 2.0 versions of the Apache HTTP Server.

See also

• Upgrading to 2.0 from 1.3 (p. 2)

Core Enhancements

Unix Threading On Unix systems with POSIX threads support, Apache can now run in a hybrid multiprocess, mul-tithreaded mode. This improves scalability for many, but not all configurations.

New Build System The build system has been rewritten from scratch to be based on autoconf and libtool. Thismakes Apache’s configuration system more similar to that of other packages.

Multiprotocol Support Apache now has some of the infrastructure in place to support serving multiple protocols.MOD ECHO has been written as an example.

Better support for non-Unix platforms Apache 2.0 is faster and more stable on non-Unix platforms such as BeOS,OS/2, and Windows. With the introduction of platform-specific multi-processing modules (p. 59) (MPMs) andthe Apache Portable Runtime (APR), these platforms are now implemented in their native API, avoiding theoften buggy and poorly performing POSIX-emulation layers.

New Apache API The API for modules has changed significantly for 2.0. Many of the module-ordering/-priorityproblems from 1.3 should be gone. 2.0 does much of this automatically, and module ordering is now doneper-hook to allow more flexibility. Also, new calls have been added that provide additional module capabilitieswithout patching the core Apache server.

IPv6 Support On systems where IPv6 is supported by the underlying Apache Portable Runtime library, Apachegets IPv6 listening sockets by default. Additionally, the LISTEN, NAMEVIRTUALHOST, and VIRTUALHOSTdirectives support IPv6 numeric address strings (e.g., "Listen [2001:db8::1]:8080").

Filtering Apache modules may now be written as filters which act on the stream of content as it is delivered to or fromthe server. This allows, for example, the output of CGI scripts to be parsed for Server Side Include directivesusing the INCLUDES filter in MOD INCLUDE. The module MOD EXT FILTER allows external programs to actas filters in much the same way that CGI programs can act as handlers.

Multilanguage Error Responses Error response messages to the browser are now provided in several languages,using SSI documents. They may be customized by the administrator to achieve a consistent look and feel.

Simplified configuration Many confusing directives have been simplified. The often confusing Port andBindAddress directives are gone; only the LISTEN directive is used for IP address binding; the SERVER-NAME directive specifies the server name and port number only for redirection and vhost recognition.

Native Windows NT Unicode Support Apache 2.0 on Windows NT now uses utf-8 for all filename encodings.These directly translate to the underlying Unicode file system, providing multilanguage support for all WindowsNT-based installations, including Windows 2000 and Windows XP. This support does not extend to Windows95, 98 or ME, which continue to use the machine’s local codepage for filesystem access.

Regular Expression Library Updated Apache 2.0 includes the Perl Compatible Regular Expression Library2

(PCRE). All regular expression evaluation now uses the more powerful Perl 5 syntax.

2http://www.pcre.org/

Page 13: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

1.2. OVERVIEW OF NEW FEATURES IN APACHE 2.0 5

Module Enhancements

MOD SSL New module in Apache 2.0. This module is an interface to the SSL/TLS encryption protocols provided byOpenSSL.

MOD DAV New module in Apache 2.0. This module implements the HTTP Distributed Authoring and Versioning(DAV) specification for posting and maintaining web content.

MOD DEFLATE New module in Apache 2.0. This module allows supporting browsers to request that content becompressed before delivery, saving network bandwidth.

MOD AUTH LDAP New module in Apache 2.0.41. This module allows an LDAP database to be used to store cre-dentials for HTTP Basic Authentication. A companion module, MOD LDAP provides connection pooling andresults caching.

MOD AUTH DIGEST Includes additional support for session caching across processes using shared memory.

MOD CHARSET LITE New module in Apache 2.0. This experimental module allows for character set translation orrecoding.

MOD FILE CACHE New module in Apache 2.0. This module includes the functionality of mod mmap static inApache 1.3, plus adds further caching abilities.

MOD HEADERS This module is much more flexible in Apache 2.0. It can now modify request headers used byMOD PROXY, and it can conditionally set response headers.

MOD PROXY The proxy module has been completely rewritten to take advantage of the new filter infrastructureand to implement a more reliable, HTTP/1.1 compliant proxy. In addition, new <PROXY> configurationsections provide more readable (and internally faster) control of proxied sites; overloaded <Directory"proxy:..."> configuration are not supported. The module is now divided into specific protocol supportmodules including proxy connect, proxy ftp and proxy http.

MOD NEGOTIATION A new FORCELANGUAGEPRIORITY directive can be used to assure that the client receives asingle document in all cases, rather than NOT ACCEPTABLE or MULTIPLE CHOICES responses. In addition,the negotiation and MultiViews algorithms have been cleaned up to provide more consistent results and a newform of type map that can include document content is provided.

MOD AUTOINDEX Autoindex’ed directory listings can now be configured to use HTML tables for cleaner formatting,and allow finer-grained control of sorting, including version-sorting, and wildcard filtering of the directorylisting.

MOD INCLUDE New directives allow the default start and end tags for SSI elements to be changed and allow forerror and time format configuration to take place in the main configuration file rather than in the SSI document.Results from regular expression parsing and grouping (now based on Perl’s regular expression syntax) can beretrieved using MOD INCLUDE’s variables $0 .. $9.

MOD AUTH DBM Now supports multiple types of DBM-like databases using the AUTHDBMTYPE directive.

Page 14: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

6 CHAPTER 1. RELEASE NOTES

1.3 The Apache License, Version 2.0

Apache LicenseVersion 2.0, January 2004http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. Definitions

"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1through 9 of this document.

"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting theLicense.

"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, orare under common control with that entity. For the purposes of this definition, "control" means (i) the power,direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii)ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.

"Source" form shall mean the preferred form for making modifications, including but not limited to softwaresource code, documentation source, and configuration files.

"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form,including but not limited to compiled object code, generated documentation, and conversions to other mediatypes.

"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License,as indicated by a copyright notice that is included in or attached to the work (an example is provided in theAppendix below).

"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from)the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, asa whole, an original work of authorship. For the purposes of this License, Derivative Works shall not includeworks that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and DerivativeWorks thereof.

"Contribution" shall mean any work of authorship, including the original version of the Work and any modi-fications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor forinclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalfof the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal,or written communication sent to the Licensor or its representatives, including but not limited to communicationon electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or onbehalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication thatis conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."

"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution hasbeen received by Licensor and subsequently incorporated within the Work.

2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor herebygrants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license toreproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Workand such Derivative Works in Source or Object form.

3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants toYou a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section)

Page 15: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

1.3. THE APACHE LICENSE, VERSION 2.0 7

patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where suchlicense applies only to those patent claims licensable by such Contributor that are necessarily infringed by theirContribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s)was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in alawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributorypatent infringement, then any patent licenses granted to You under this License for that Work shall terminate asof the date such litigation is filed.

4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in anymedium, with or without modifications, and in Source or Object form, provided that You meet the followingconditions:

(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

(b) You must cause any modified files to carry prominent notices stating that You changed the files; and

(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent,trademark, and attribution notices from the Source form of the Work, excluding those notices that do notpertain to any part of the Derivative Works; and

(d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works thatYou distribute must include a readable copy of the attribution notices contained within such NOTICE file,excluding those notices that do not pertain to any part of the Derivative Works, in at least one of thefollowing places: within a NOTICE text file distributed as part of the Derivative Works; within the Sourceform or documentation, if provided along with the Derivative Works; or, within a display generated by theDerivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICEfile are for informational purposes only and do not modify the License. You may add Your own attributionnotices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text fromthe Work, provided that such additional attribution notices cannot be construed as modifying the License.

You may add Your own copyright statement to Your modifications and may provide additional or differentlicense terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Deriva-tive Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies withthe conditions stated in this License.

5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submittedfor inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, withoutany additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify theterms of any separate license agreement you may have executed with Licensor regarding such Contributions.

6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, orproduct names of the Licensor, except as required for reasonable and customary use in describing the origin ofthe Work and reproducing the content of the NOTICE file.

7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides theWork (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIESOR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties orconditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULARPURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Workand assume any risks associated with Your exercise of permissions under this License.

8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract,or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to inwriting, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental,or consequential damages of any character arising as a result of this License or out of the use or inability touse the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure ormalfunction, or any and all other commercial damages or losses), even if such Contributor has been advised ofthe possibility of such damages.

Page 16: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

8 CHAPTER 1. RELEASE NOTES

9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof,You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liabilityobligations and/or rights consistent with this License. However, in accepting such obligations, You may act onlyon Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if Youagree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims assertedagainst, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets"[]" replaced with your own identifying information. (Don’t include the brackets!) The text should be enclosed inthe appropriate comment syntax for the file format. We also recommend that a file or class name and description ofpurpose be included on the same "printed page" as the copyright notice for easier identification within third-partyarchives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.

Page 17: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

Chapter 2

Using the Apache HTTP Server

9

Page 18: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10 CHAPTER 2. USING THE APACHE HTTP SERVER

2.1 Compiling and Installing

This document covers compilation and installation of Apache on Unix and Unix-like systems only. For compiling andinstallation on Windows, see Using Apache with Microsoft Windows (p. 209) . For other platforms, see the platform(p. 208) documentation.

Apache 2.0’s configuration and installation environment has changed completely from Apache 1.3. Apache 1.3 useda custom set of scripts to achieve easy installation. Apache 2.0 now uses libtool and autoconf to create anenvironment that looks like many other Open Source projects.

If you are upgrading from one minor version to the next (for example, 2.0.50 to 2.0.51), please skip down to theupgrading section.

See also

• Configure the source tree (p. 247)

• Starting Apache (p. 14)

• Stopping and Restarting (p. 16)

Overview for the impatient

Download $ lynx http://httpd.apache.org/download.cgi

Extract $ gzip -d httpd-2 0 NN.tar.gz$ tar xvf httpd-2 0 NN.tar

Configure $ ./configure --prefix=PREFIX

Compile $ make

Install $ make install

Customize $ vi PREFIX/conf/httpd.conf

Test $ PREFIX/bin/apachectl start

NN must be replaced with the current minor version number, and PREFIX must be replaced with the filesystem pathunder which the server should be installed. If PREFIX is not specified, it defaults to /usr/local/apache2.

Each section of the compilation and installation process is described in more detail below, beginning with the require-ments for compiling and installing Apache HTTPD.

Requirements

The following requirements exist for building Apache:

Disk Space Make sure you have at least 50 MB of temporary free disk space available. After installation Apacheoccupies approximately 10 MB of disk space. The actual disk space requirements will vary considerably basedon your chosen configuration options and any third-party modules.

ANSI-C Compiler and Build System Make sure you have an ANSI-C compiler installed. The GNU C compiler(GCC)1 from the Free Software Foundation (FSF)2 is recommended (version 2.7.2 is fine). If you don’t haveGCC then at least make sure your vendor’s compiler is ANSI compliant. In addition, your PATH must containbasic build tools such as make.

Accurate time keeping Elements of the HTTP protocol are expressed as the time of day. So, it’s time to investi-gate setting some time synchronization facility on your system. Usually the ntpdate or xntpd programs

1http://www.gnu.org/software/gcc/gcc.html2http://www.gnu.org/

Page 19: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.1. COMPILING AND INSTALLING 11

are used for this purpose which are based on the Network Time Protocol (NTP). See the Usenet newsgroupcomp.protocols.time.ntp3 and the NTP homepage4 for more details about NTP software and public time servers.

Perl 55 [OPTIONAL] For some of the support scripts like apxs or dbmmanage (which are written in Perl) the Perl5 interpreter is required (versions 5.003 or newer are sufficient). If you have multiple Perl interpreters (for ex-ample, a systemwide install of Perl 4, and your own install of Perl 5), you are advised to use the --with-perloption (see below) to make sure the correct one is used by configure. If no Perl 5 interpreter is found by theconfigure script, you will not be able to use the affected support scripts. Of course, you will still be able tobuild and use Apache 2.0.

Download

Apache can be downloaded from the Apache HTTP Server download site6 which lists several mirrors. Most usersof Apache on unix-like systems will be better off downloading and compiling a source version. The build process(described below) is easy, and it allows you to customize your server to suit your needs. In addition, binary releasesare often not up to date with the latest source releases. If you do download a binary, follow the instructions in theINSTALL.bindist file inside the distribution.

After downloading, it is important to verify that you have a complete and unmodified version of the Apache HTTPServer. This can be accomplished by testing the downloaded tarball against the PGP signature. Details on how to dothis are available on the download page7 and an extended example is available describing the use of PGP8.

Extract

Extracting the source from the Apache HTTPD tarball is a simple matter of uncompressing, and then untarring:

$ gzip -d httpd-2 0 NN.tar.gz

$ tar xvf httpd-2 0 NN.tar

This will create a new directory under the current directory containing the source code for the distribution. You shouldcd into that directory before proceeding with compiling the server.

Configuring the source tree

The next step is to configure the Apache source tree for your particular platform and personal requirements. This isdone using the script configure included in the root directory of the distribution. (Developers downloading theCVS version of the Apache source tree will need to have autoconf and libtool installed and will need to runbuildconf before proceeding with the next steps. This is not necessary for official releases.)

To configure the source tree using all the default options, simply type ./configure. To change the default options,configure accepts a variety of variables and command line options.

The most important option is the location --prefix where Apache is to be installed later, because Apache has tobe configured for this location to work correctly. More fine-tuned control of the location of files is possible withadditional configure options (p. 247) .

Also at this point, you can specify which features (p. 247) you want included in Apache by enabling and disablingmodules (p. 660) . Apache comes with a Base (p. 298) set of modules included by default. Other modules are enabled

3news:comp.protocols.time.ntp4http://www.ntp.org6http://httpd.apache.org/download.cgi7http://httpd.apache.org/download.cgi#verify8http://httpd.apache.org/dev/verification.html

Page 20: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

12 CHAPTER 2. USING THE APACHE HTTP SERVER

using the --enable-module option, where module is the name of the module with the mod string removed andwith any underscore converted to a dash. You can also choose to compile modules as shared objects (DSOs) (p.44) – which can be loaded or unloaded at runtime – by using the option --enable-module=shared. Similarly,you can disable Base modules with the --disable-module option. Be careful when using these options, sinceconfigure cannot warn you if the module you specify does not exist; it will simply ignore the option.

In addition, it is sometimes necessary to provide the configure script with extra information about the location ofyour compiler, libraries, or header files. This is done by passing either environment variables or command line optionsto configure. For more information, see the configure manual page.

For a short impression of what possibilities you have, here is a typical example which compiles Apache for the instal-lation tree /sw/pkg/apache with a particular compiler and flags plus the two additional modules MOD REWRITEand MOD SPELING for later loading through the DSO mechanism:

$ CC="pgcc" CFLAGS="-O2" \./configure --prefix=/sw/pkg/apache \--enable-rewrite=shared \--enable-speling=shared

When configure is run it will take several minutes to test for the availability of features on your system and buildMakefiles which will later be used to compile the server.

Details on all the different configure options are available on the configure manual page.

Build

Now you can build the various parts which form the Apache package by simply running the command:

$ make

Please be patient here, since a base configuration takes approximately 3 minutes to compile under a Pentium III/Linux2.2 system, but this will vary widely depending on your hardware and the number of modules which you have enabled.

Install

Now it’s time to install the package under the configured installation PREFIX (see --prefix option above) byrunning:

$ make install

If you are upgrading, the installation will not overwrite your configuration files or documents.

Customize

Next, you can customize your Apache HTTP server by editing the configuration files (p. 19) under PREFIX/conf/.

$ vi PREFIX/conf/httpd.conf

Have a look at the Apache manual under docs/manual/ (p. ??) or consult http://httpd.apache.org/docs/2.0/ for the mostrecent version of this manual and a complete reference of available configuration directives (p. 663) .

Page 21: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.1. COMPILING AND INSTALLING 13

Test

Now you can start (p. 14) your Apache HTTP server by immediately running:

$ PREFIX/bin/apachectl start

and then you should be able to request your first document via URL http://localhost/. The web page you seeis located under the DOCUMENTROOT which will usually be PREFIX/htdocs/. Then stop (p. 16) the server againby running:

$ PREFIX/bin/apachectl stop

Upgrading

The first step in upgrading is to read the release announcement and the file CHANGES in the source distribution tofind any changes that may affect your site. When changing between major releases (for example, from 1.3 to 2.0 orfrom 2.0 to 2.2), there will likely be major differences in the compile-time and run-time configuration that will requiremanual adjustments. All modules will also need to be upgraded to accomodate changes in the module API.

Upgrading from one minor version to the next (for example, from 2.0.55 to 2.0.57) is easier. The make installprocess will not overwrite any of your existing documents, log files, or configuration files. In addition, the developersmake every effort to avoid incompatible changes in the configure options, run-time configuration, or the moduleAPI between minor versions. In most cases you should be able to use an identical configure command line, anidentical configuration file, and all of your modules should continue to work. (This is only valid for versions after2.0.41; earlier versions have incompatible changes.)

To upgrade across minor versions, start by finding the file config.nice in the build directory of your installedserver or at the root of the source tree for your old install. This will contain the exact configure command linethat you used to configure the source tree. Then to upgrade from one version to the next, you need only copy theconfig.nice file to the source tree of the new version, edit it to make any desired changes, and then run:

$ ./config.nice$ make$ make install$ PREFIX/bin/apachectl stop

$ PREFIX/bin/apachectl start

! You should always test any new version in your environment before putting it into produc-tion. For example, you can install and run the new version along side the old one by using adifferent --prefix and a different port (by adjusting the LISTEN directive) to test for anyincompatibilities before doing the final upgrade.

Page 22: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

14 CHAPTER 2. USING THE APACHE HTTP SERVER

2.2 Starting Apache

On Windows, Apache is normally run as a service on Windows NT, 2000 and XP, or as a console application onWindows 9x and ME. For details, see Running Apache as a Service (p. 209) and Running Apache as a ConsoleApplication (p. 209) .

On Unix, the httpd program is run as a daemon that executes continuously in the background to handle requests.This document describes how to invoke httpd.

See also

• Stopping and Restarting (p. 16)

• httpd

• apachectl

How Apache Starts

If the LISTEN specified in the configuration file is default of 80 (or any other port below 1024), then it is necessary tohave root privileges in order to start apache, so that it can bind to this privileged port. Once the server has started andperformed a few preliminary activities such as opening its log files, it will launch several child processes which do thework of listening for and answering requests from clients. The main httpd process continues to run as the root user,but the child processes run as a less privileged user. This is controlled by the selected Multi-Processing Module (p.59) .

The recommended method of invoking the httpd executable is to use the apachectl control script. This script setscertain environment variables that are necessary for httpd to function correctly under some operating systems, andthen invokes the httpd binary. apachectl will pass through any command line arguments, so any httpd optionsmay also be used with apachectl. You may also directly edit the apachectl script by changing the HTTPDvariable near the top to specify the correct location of the httpd binary and any command-line arguments that youwish to be always present.

The first thing that httpd does when it is invoked is to locate and read the configuration file (p. 19) httpd.conf.The location of this file is set at compile-time, but it is possible to specify its location at run time using the -fcommand-line option as in

/usr/local/apache2/bin/apachectl -f

/usr/local/apache2/conf/httpd.conf

If all goes well during startup, the server will detach from the terminal and the command prompt will return almostimmediately. This indicates that the server is up and running. You can then use your browser to connect to the serverand view the test page in the DOCUMENTROOT directory and the local copy of the documentation linked from thatpage.

Errors During Start-up

If Apache suffers a fatal problem during startup, it will write a message describing the problem either to the consoleor to the ERRORLOG before exiting. One of the most common error messages is "Unable to bind to Port...". This message is usually caused by either:

• Trying to start the server on a privileged port when not logged in as the root user; or

• Trying to start the server when there is another instance of Apache or some other web server already bound tothe same Port.

Page 23: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.2. STARTING APACHE 15

For further trouble-shooting instructions, consult the Apache FAQ (p. 140) .

Starting at Boot-Time

If you want your server to continue running after a system reboot, you should add a call to apachectl to yoursystem startup files (typically rc.local or a file in an rc.N directory). This will start Apache as root. Before doingthis ensure that your server is properly configured for security and access restrictions.

The apachectl script is designed to act like a standard SysV init script; it can take the arguments start,restart, and stop and translate them into the appropriate signals to httpd. So you can often simply linkapachectl into the appropriate init directory. But be sure to check the exact requirements of your system.

Additional Information

Additional information about the command-line options of httpd and apachectl as well as other support pro-grams included with the server is available on the Server and Supporting Programs (p. 236) page. There is alsodocumentation on all the modules (p. 660) included with the Apache distribution and the directives (p. 663) that theyprovide.

Page 24: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

16 CHAPTER 2. USING THE APACHE HTTP SERVER

2.3 Stopping and Restarting

This document covers stopping and restarting Apache on Unix-like systems. Windows NT, 2000 and XP users shouldsee Running Apache as a Service (p. 209) and Windows 9x and ME users should see Running Apache as a ConsoleApplication (p. 209) for information on how to control Apache on those platforms.

See also

• httpd

• apachectl

• Starting (p. 14)

Introduction

In order to stop or restart Apache, you must send a signal to the running httpd processes. There are two ways tosend the signals. First, you can use the unix kill command to directly send signals to the processes. You will noticemany httpd executables running on your system, but you should not send signals to any of them except the parent,whose pid is in the PIDFILE. That is to say you shouldn’t ever need to send signals to any process except the parent.There are three signals that you can send the parent: TERM, HUP, and USR1, which will be described in a moment.

To send a signal to the parent you should issue a command such as:

kill -TERM ‘cat /usr/local/apache2/logs/httpd.pid‘

The second method of signaling the httpd processes is to use the -k command line options: stop, restart, andgraceful, as described below. These are arguments to the httpd binary, but we recommend that you send themusing the apachectl control script, which will pass them through to httpd.

After you have signaled httpd, you can read about its progress by issuing:

tail -f /usr/local/apache2/logs/error log

Modify those examples to match your SERVERROOT and PIDFILE settings.

Stop Now

Signal: TERM apachectl -k stop

Sending the TERM or stop signal to the parent causes it to immediately attempt to kill off all of its children. It maytake it several seconds to complete killing off its children. Then the parent itself exits. Any requests in progress areterminated, and no further requests are served.

Graceful Restart

Signal: USR1 apachectl -k graceful

The USR1 or graceful signal causes the parent process to advise the children to exit after their current request (orto exit immediately if they’re not serving anything). The parent re-reads its configuration files and re-opens its logfiles. As each child dies off the parent replaces it with a child from the new generation of the configuration, whichbegins serving new requests immediately.

Page 25: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.3. STOPPING AND RESTARTING 17

=⇒On certain platforms that do not allow USR1 to be used for a graceful restart, an alternativesignal may be used (such as WINCH). The command apachectl graceful will send theright signal for your platform.

This code is designed to always respect the process control directive of the MPMs, so the number of processes andthreads available to serve clients will be maintained at the appropriate values throughout the restart process. Further-more, it respects STARTSERVERS in the following manner: if after one second at least STARTSERVERS new childrenhave not been created, then create enough to pick up the slack. Hence the code tries to maintain both the number ofchildren appropriate for the current load on the server, and respect your wishes with the STARTSERVERS parameter.

Users of MOD STATUS will notice that the server statistics are not set to zero when a USR1 is sent. The code waswritten to both minimize the time in which the server is unable to serve new requests (they will be queued up by theoperating system, so they’re not lost in any event) and to respect your tuning parameters. In order to do this it has tokeep the scoreboard used to keep track of all children across generations.

The status module will also use a G to indicate those children which are still serving requests started before the gracefulrestart was given.

At present there is no way for a log rotation script using USR1 to know for certain that all children writing the pre-restart log have finished. We suggest that you use a suitable delay after sending the USR1 signal before you do anythingwith the old log. For example if most of your hits take less than 10 minutes to complete for users on low bandwidthlinks then you could wait 15 minutes before doing anything with the old log.

=⇒If your configuration file has errors in it when you issue a restart then your parent will notrestart, it will exit with an error. In the case of graceful restarts it will also leave childrenrunning when it exits. (These are the children which are "gracefully exiting" by handling theirlast request.) This will cause problems if you attempt to restart the server – it will not be able tobind to its listening ports. Before doing a restart, you can check the syntax of the configurationfiles with the -t command line argument (see httpd). This still will not guarantee that theserver will restart correctly. To check the semantics of the configuration files as well as thesyntax, you can try starting httpd as a non-root user. If there are no errors it will attempt toopen its sockets and logs and fail because it’s not root (or because the currently running httpdalready has those ports bound). If it fails for any other reason then it’s probably a config fileerror and the error should be fixed before issuing the graceful restart.

Restart Now

Signal: HUP apachectl -k restart

Sending the HUP or restart signal to the parent causes it to kill off its children like in TERM, but the parent doesn’texit. It re-reads its configuration files, and re-opens any log files. Then it spawns a new set of children and continuesserving hits.

Users of MOD STATUS will notice that the server statistics are set to zero when a HUP is sent.

=⇒If your configuration file has errors in it when you issue a restart then your parent will notrestart, it will exit with an error. See above for a method of avoiding this.

Appendix: signals and race conditions

Prior to Apache 1.2b9 there were several race conditions involving the restart and die signals (a simply put, a racecondition is a time-sensitive problem - if something happens at just the wrong time or things happen in the wrong order,undesired behaviour will result. If the same thing happens at the right time, all will be well). For those architecturesthat have the "right" feature set we have eliminated as many as we can. But it should be noted that race conditions dostill exist on certain architectures.

Page 26: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

18 CHAPTER 2. USING THE APACHE HTTP SERVER

Architectures that use an on-disk SCOREBOARDFILE can potentially have their scoreboards corrupted. This can resultin the "bind: Address already in use" (after HUP) or "long lost child came home!" (after USR1). The former is a fatalerror, while the latter just causes the server to lose a scoreboard slot. So it may be advisable to use graceful restarts,with an occasional hard restart. These problems are very difficult to work around, but fortunately most architecturesdo not require a scoreboard file. See the SCOREBOARDFILE documentation for architecture which uses it.

All architectures have a small race condition in each child involving the second and subsequent requests on a persistentHTTP connection (KeepAlive). It may exit after reading the request line but before reading any of the request headers.There is a fix that was discovered too late to make 1.2. In theory this isn’t an issue because the KeepAlive client hasto expect these events because of network latencies and server timeouts. In practice it doesn’t seem to affect anythingeither – in a test case the server was restarted twenty times per second and clients successfully browsed the site withoutgetting broken images or empty documents.

Page 27: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.4. CONFIGURATION FILES 19

2.4 Configuration Files

This document describes the files used to configure the Apache HTTP server.

Main Configuration Files

Related ModulesMOD MIME

Related Directives<IFDEFINE>INCLUDETYPESCONFIG

Apache is configured by placing directives (p. 663) in plain text configuration files. The main configuration file isusually called httpd.conf. The location of this file is set at compile-time, but may be overridden with the -fcommand line flag. In addition, other configuration files may be added using the INCLUDE directive, and wildcardscan be used to include many configuration files. Any directive may be placed in any of these configuration files.Changes to the main configuration files are only recognized by Apache when it is started or restarted.

The server also reads a file containing mime document types; the filename is set by the TYPESCONFIG directive, andis mime.types by default.

Syntax of the Configuration Files

Apache configuration files contain one directive per line. The backslash "\" may be used as the last character on a lineto indicate that the directive continues onto the next line. There must be no other characters or white space betweenthe backslash and the end of the line.

Directives in the configuration files are case-insensitive, but arguments to directives are often case sensitive. Lines thatbegin with the hash character "#" are considered comments, and are ignored. Comments may not be included on aline after a configuration directive. Blank lines and white space occurring before a directive are ignored, so you mayindent directives for clarity.

You can check your configuration files for syntax errors without starting the server by using apachectlconfigtest or the -t command line option.

Modules

Related ModulesMOD SO

Related Directives<IFMODULE>LOADMODULE

Apache is a modular server. This implies that only the most basic functionality is included in the core server. Extendedfeatures are available through modules (p. 660) which can be loaded into Apache. By default, a base (p. 298) set ofmodules is included in the server at compile-time. If the server is compiled to use dynamically loaded (p. 44) modules,then modules can be compiled separately and added at any time using the LOADMODULE directive. Otherwise,Apache must be recompiled to add or remove modules. Configuration directives may be included conditional on apresence of a particular module by enclosing them in an <IFMODULE> block.

To see which modules are currently compiled into the server, you can use the -l command line option.

Page 28: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

20 CHAPTER 2. USING THE APACHE HTTP SERVER

Scope of Directives

Related Modules Related Directives<DIRECTORY><DIRECTORYMATCH><FILES><FILESMATCH><LOCATION><LOCATIONMATCH><VIRTUALHOST>

Directives placed in the main configuration files apply to the entire server. If you wish to change the configuration foronly a part of the server, you can scope your directives by placing them in <DIRECTORY>, <DIRECTORYMATCH>,<FILES>, <FILESMATCH>, <LOCATION>, and <LOCATIONMATCH> sections. These sections limit the applica-tion of the directives which they enclose to particular filesystem locations or URLs. They can also be nested, allowingfor very fine grained configuration.

Apache has the capability to serve many different websites simultaneously. This is called Virtual Hosting (p. 110). Directives can also be scoped by placing them inside <VIRTUALHOST> sections, so that they will only apply torequests for a particular website.

Although most directives can be placed in any of these sections, some directives do not make sense in some contexts.For example, directives controlling process creation can only be placed in the main server context. To find whichdirectives can be placed in which sections, check the Context (p. 299) of the directive. For further information, weprovide details on How Directory, Location and Files sections work (p. 21) .

.htaccess Files

Related Modules Related DirectivesACCESSFILENAMEALLOWOVERRIDE

Apache allows for decentralized management of configuration via special files placed inside the web tree. The specialfiles are usually called .htaccess, but any name can be specified in the ACCESSFILENAME directive. Directivesplaced in .htaccess files apply to the directory where you place the file, and all sub-directories. The .htaccessfiles follow the same syntax as the main configuration files. Since .htaccess files are read on every request, changesmade in these files take immediate effect.

To find which directives can be placed in .htaccess files, check the Context (p. 299) of the directive. The server ad-ministrator further controls what directives may be placed in .htaccess files by configuring the ALLOWOVERRIDEdirective in the main configuration files.

For more information on .htaccess files, see the .htaccess tutorial (p. 197) .

Page 29: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.5. CONFIGURATION SECTIONS 21

2.5 Configuration Sections

Directives in the configuration files (p. 19) may apply to the entire server, or they may be restricted to apply only toparticular directories, files, hosts, or URLs. This document describes how to use configuration section containers or.htaccess files to change the scope of other configuration directives.

Types of Configuration Section Containers

Related ModulesCOREMOD PROXY

Related Directives<DIRECTORY><DIRECTORYMATCH><FILES><FILESMATCH><IFDEFINE><IFMODULE><LOCATION><LOCATIONMATCH><PROXY><PROXYMATCH><VIRTUALHOST>

There are two basic types of containers. Most containers are evaluated for each request. The enclosed directives areapplied only for those requests that match the containers. The <IFDEFINE> and <IFMODULE> containers, on theother hand, are evaluated only at server startup and restart. If their conditions are true at startup, then the encloseddirectives will apply to all requests. If the conditions are not true, the enclosed directives will be ignored.

The <IFDEFINE> directive encloses directives that will only be applied if an appropriate parameter is defined on thehttpd command line. For example, with the following configuration, all requests will be redirected to another siteonly if the server is started using httpd -DClosedForNow:

<IfDefine ClosedForNow>Redirect / http://otherserver.example.com/

</IfDefine>

The <IFMODULE> directive is very similar, except it encloses directives that will only be applied if a particularmodule is available in the server. The module must either be statically compiled in the server, or it must be dynamicallycompiled and its LOADMODULE line must be earlier in the configuration file. This directive should only be used ifyou need your configuration file to work whether or not certain modules are installed. It should not be used to enclosedirectives that you want to work all the time, because it can suppress useful error messages about missing modules.

In the following example, the MIMEMAGICFILES directive will be applied only if MOD MIME MAGIC is available.

<IfModule mod mime magic.c>MimeMagicFile conf/magic

</IfModule>

Both <IFDEFINE> and <IFMODULE> can apply negative conditions by preceding their test with "!". Also, thesesections can be nested to achieve more complex restrictions.

Page 30: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

22 CHAPTER 2. USING THE APACHE HTTP SERVER

Filesystem and Webspace

The most commonly used configuration section containers are the ones that change the configuration of particularplaces in the filesystem or webspace. First, it is important to understand the difference between the two. The filesystemis the view of your disks as seen by your operating system. For example, in a default install, Apache resides at/usr/local/apache2 in the Unix filesystem or "c:/Program Files/Apache Group/Apache2" in theWindows filesystem. (Note that forward slashes should always be used as the path separator in Apache, even forWindows.) In contrast, the webspace is the view of your site as delivered by the web server and seen by the client. Sothe path /dir/ in the webspace corresponds to the path /usr/local/apache2/htdocs/dir/ in the filesystemof a default Apache install on Unix. The webspace need not map directly to the filesystem, since webpages may begenerated dynamically from databases or other locations.

Filesystem Containers

The <DIRECTORY> and <FILES> directives, along with their regex counterparts, apply directives to parts of thefilesystem. Directives enclosed in a <DIRECTORY> section apply to the named filesystem directory and all subdirec-tories of that directory. The same effect can be obtained using .htaccess files (p. 197) . For example, in the followingconfiguration, directory indexes will be enabled for the /var/web/dir1 directory and all subdirectories.

<Directory /var/web/dir1>Options +Indexes

</Directory>

Directives enclosed in a <FILES> section apply to any file with the specified name, regardless of what directory it liesin. So for example, the following configuration directives will, when placed in the main section of the configurationfile, deny access to any file named private.html regardless of where it is found.

<Files private.html>Order allow,denyDeny from all

</Files>

To address files found in a particular part of the filesystem, the <FILES> and <DIRECTORY> sections can becombined. For example, the following configuration will deny access to /var/web/dir1/private.html,/var/web/dir1/subdir2/private.html, /var/web/dir1/subdir3/private.html, and anyother instance of private.html found under the /var/web/dir1/ directory.

<Directory /var/web/dir1><Files private.html>Order allow,denyDeny from all</Files>

</Directory>

Webspace Containers

The <LOCATION> directive and its regex counterpart, on the other hand, change the config-uration for content in the webspace. For example, the following configuration prevents ac-cess to any URL-path that begins in /private. In particular, it will apply to requests for

Page 31: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.5. CONFIGURATION SECTIONS 23

http://yoursite.example.com/private, http://yoursite.example.com/private123, andhttp://yoursite.example.com/private/dir/file.html as well as any other requests starting withthe /private string.

<Location /private>Order Allow,DenyDeny from all

</Location>

The <LOCATION> directive need not have anything to do with the filesystem. For example, the following exam-ple shows how to map a particular URL to an internal Apache handler provided by MOD STATUS. No file calledserver-status needs to exist in the filesystem.

<Location /server-status>SetHandler server-status

</Location>

Wildcards and Regular Expressions

The <DIRECTORY>, <FILES>, and <LOCATION> directives can each use shell-style wildcard characters as infnmatch from the C standard library. The character "*" matches any sequence of characters, "?" matches anysingle character, and "[seq]" matches any character in seq. The "/" character will not be matched by any wildcard; itmust be specified explicitly.

If even more flexible matching is required, each container has a regular-expression (regex) counterpart <DIRECTO-RYMATCH>, <FILESMATCH>, and <LOCATIONMATCH> that allow perl-compatible regular expressions (p. 656)to be used in choosing the matches. But see the section below on configuration merging to find out how using regexsections will change how directives are applied.

A non-regex wildcard section that changes the configuration of all user directories could look as follows:

<Directory /home/*/public html>Options Indexes

</Directory>

Using regex sections, we can deny access to many types of image files at once:

<FilesMatch \.(?i:gif|jpe?g|png)$>Order allow,denyDeny from all

</FilesMatch>

What to use When

Choosing between filesystem containers and webspace containers is actually quite easy. When applying directives toobjects that reside in the filesystem always use <DIRECTORY> or <FILES>. When applying directives to objectsthat do not reside in the filesystem (such as a webpage generated from a database), use <LOCATION>.

It is important to never use <LOCATION> when trying to restrict access to objects in the filesystem. This is becausemany different webspace locations (URLs) could map to the same filesystem location, allowing your restrictions to becircumvented. For example, consider the following configuration:

Page 32: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

24 CHAPTER 2. USING THE APACHE HTTP SERVER

<Location /dir/>Order allow,denyDeny from all

</Location>

This works fine if the request is for http://yoursite.example.com/dir/. But what if youare on a case-insensitive filesystem? Then your restriction could be easily circumvented by requestinghttp://yoursite.example.com/DIR/. The <DIRECTORY> directive, in contrast, will apply to any con-tent served from that location, regardless of how it is called. (An exception is filesystem links. The same directory canbe placed in more than one part of the filesystem using symbolic links. The <DIRECTORY> directive will follow thesymbolic link without resetting the pathname. Therefore, for the highest level of security, symbolic links should bedisabled with the appropriate OPTIONS directive.)

If you are, perhaps, thinking that none of this applies to you because you use a case-sensitive filesystem, remember thatthere are many other ways to map multiple webspace locations to the same filesystem location. Therefore you shouldalways use the filesystem containers when you can. There is, however, one exception to this rule. Putting configurationrestrictions in a <Location /> section is perfectly safe because this section will apply to all requests regardless ofthe specific URL.

Virtual Hosts

The <VIRTUALHOST> container encloses directives that apply to specific hosts. This is useful when serving multiplehosts from the same machine with a different configuration for each. For more information, see the Virtual HostDocumentation (p. 110) .

Proxy

The <PROXY> and <PROXYMATCH> containers apply enclosed configuration directives only to sites accessedthrough MOD PROXY’s proxy server that match the specified URL. For example, the following configuration willprevent the proxy server from being used to access the cnn.com website.

<Proxy http://cnn.com/*>Order allow,denyDeny from all

</Proxy>

What Directives are Allowed?

To find out what directives are allowed in what types of configuration sections, check the Context (p. 299) of the direc-tive. Everything that is allowed in <DIRECTORY> sections is also syntactically allowed in <DIRECTORYMATCH>,<FILES>, <FILESMATCH>, <LOCATION>, <LOCATIONMATCH>, <PROXY>, and <PROXYMATCH> sections.There are some exceptions, however:

• The ALLOWOVERRIDE directive works only in <DIRECTORY> sections.

• The FollowSymLinks and SymLinksIfOwnerMatch OPTIONS work only in <DIRECTORY> sectionsor .htaccess files.

• The OPTIONS directive cannot be used in <FILES> and <FILESMATCH> sections.

Page 33: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.5. CONFIGURATION SECTIONS 25

How the sections are merged

The configuration sections are applied in a very particular order. Since this can have important effects on how config-uration directives are interpreted, it is important to understand how this works.

The order of merging is:

1. <DIRECTORY> (except regular expressions) and .htaccess done simultaneously (with .htaccess, ifallowed, overriding <DIRECTORY>)

2. <DIRECTORYMATCH> (and <Directory ˜>)

3. <FILES> and <FILESMATCH> done simultaneously

4. <LOCATION> and <LOCATIONMATCH> done simultaneously

Apart from <DIRECTORY>, each group is processed in the order that they appear in the configuration files. <DI-RECTORY> (group 1 above) is processed in the order shortest directory component to longest. So for example,<Directory /var/web/dir> will be processed before <Directory /var/web/dir/subdir>. If mul-tiple <DIRECTORY> sections apply to the same directory they are processed in the configuration file order. Config-urations included via the INCLUDE directive will be treated as if they were inside the including file at the location ofthe INCLUDE directive.

Sections inside <VIRTUALHOST> sections are applied after the corresponding sections outside the virtual host defi-nition. This allows virtual hosts to override the main server configuration.

Later sections override earlier ones.

=⇒Technical NoteThere is actually a <Location>/<LocationMatch> sequence performed just beforethe name translation phase (where Aliases and DocumentRoots are used to map URLsto filenames). The results of this sequence are completely thrown away after the translationhas completed.

Some Examples

Below is an artificial example to show the order of merging. Assuming they all apply to the request, the directives inthis example will be applied in the order A > B > C > D > E.

<Location />E</Location>

<Files f.html>D</Files>

<VirtualHost *><Directory /a/b>B</Directory></VirtualHost>

<DirectoryMatch "ˆ.*b$">C</DirectoryMatch>

<Directory /a/b>A</Directory>

Page 34: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

26 CHAPTER 2. USING THE APACHE HTTP SERVER

For a more concrete example, consider the following. Regardless of any access restrictions placed in <DIRECTORY>sections, the <LOCATION> section will be evaluated last and will allow unrestricted access to the server. In otherwords, order of merging is important, so be careful!

<Location />Order deny,allowAllow from all</Location>

# Woops! This <Directory> section will have no effect<Directory />Order allow,denyAllow from allDeny from badguy.example.com

</Directory>

Page 35: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.6. SERVER-WIDE CONFIGURATION 27

2.6 Server-Wide Configuration

This document explains some of the directives provided by the CORE server which are used to configure the basicoperations of the server.

Server Identification

Related Modules Related DirectivesSERVERNAMESERVERADMINSERVERSIGNATURESERVERTOKENSUSECANONICALNAME

The SERVERADMIN and SERVERTOKENS directives control what information about the server will be presented inserver-generated documents such as error messages. The SERVERTOKENS directive sets the value of the Server HTTPresponse header field.

The SERVERNAME and USECANONICALNAME directives are used by the server to determine how to construct self-referential URLs. For example, when a client requests a directory, but does not include the trailing slash in thedirectory name, Apache must redirect the client to the full name including the trailing slash so that the client willcorrectly resolve relative references in the document.

File Locations

Related Modules Related DirectivesCOREDUMPDIRECTORYDOCUMENTROOTERRORLOGLOCKFILEPIDFILESCOREBOARDFILESERVERROOT

These directives control the locations of the various files that Apache needs for proper operation. When the pathnameused does not begin with a slash (/), the files are located relative to the SERVERROOT. Be careful about locating filesin paths which are writable by non-root users. See the security tips (p. 40) documentation for more details.

Limiting Resource Usage

Related Modules Related DirectivesLIMITREQUESTBODYLIMITREQUESTFIELDSLIMITREQUESTFIELDSIZELIMITREQUESTLINERLIMITCPURLIMITMEMRLIMITNPROCTHREADSTACKSIZE

Page 36: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

28 CHAPTER 2. USING THE APACHE HTTP SERVER

The LIMITREQUEST* directives are used to place limits on the amount of resources Apache will use in readingrequests from clients. By limiting these values, some kinds of denial of service attacks can be mitigated.

The RLIMIT* directives are used to limit the amount of resources which can be used by processes forked off from theApache children. In particular, this will control resources used by CGI scripts and SSI exec commands.

The THREADSTACKSIZE directive is used only on Netware to control the stack size.

Page 37: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.7. LOG FILES 29

2.7 Log Files

In order to effectively manage a web server, it is necessary to get feedback about the activity and performance of theserver as well as any problems that may be occurring. The Apache HTTP Server provides very comprehensive andflexible logging capabilities. This document describes how to configure its logging capabilities, and how to understandwhat the logs contain.

Security Warning

Anyone who can write to the directory where Apache is writing a log file can almost certainly gain access to the uidthat the server is started as, which is normally root. Do NOT give people write access to the directory the logs arestored in without being aware of the consequences; see the security tips (p. 40) document for details.

In addition, log files may contain information supplied directly by the client, without escaping. Therefore, it is possiblefor malicious clients to insert control-characters in the log files, so care must be taken in dealing with raw logs.

Error Log

Related Modules Related DirectivesERRORLOGLOGLEVEL

The server error log, whose name and location is set by the ERRORLOG directive, is the most important log file. Thisis the place where Apache httpd will send diagnostic information and record any errors that it encounters in processingrequests. It is the first place to look when a problem occurs with starting the server or with the operation of the server,since it will often contain details of what went wrong and how to fix it.

The error log is usually written to a file (typically error log on Unix systems and error.log on Windows andOS/2). On Unix systems it is also possible to have the server send errors to syslog or pipe them to a program.

The format of the error log is relatively free-form and descriptive. But there is certain information that is contained inmost error log entries. For example, here is a typical message.

[Wed Oct 11 14:32:52 2000] [error] [client 127.0.0.1] client denied

by server configuration: /export/home/live/ap/htdocs/test

The first item in the log entry is the date and time of the message. The second item lists the severity of the error beingreported. The LOGLEVEL directive is used to control the types of errors that are sent to the error log by restricting theseverity level. The third item gives the IP address of the client that generated the error. Beyond that is the messageitself, which in this case indicates that the server has been configured to deny the client access. The server reports thefile-system path (as opposed to the web path) of the requested document.

A very wide variety of different messages can appear in the error log. Most look similar to the example above. Theerror log will also contain debugging output from CGI scripts. Any information written to stderr by a CGI scriptwill be copied directly to the error log.

It is not possible to customize the error log by adding or removing information. However, error log entries dealing withparticular requests have corresponding entries in the access log. For example, the above example entry correspondsto an access log entry with status code 403. Since it is possible to customize the access log, you can obtain moreinformation about error conditions using that log file.

During testing, it is often useful to continuously monitor the error log for any problems. On Unix systems, you canaccomplish this using:

Page 38: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

30 CHAPTER 2. USING THE APACHE HTTP SERVER

tail -f error log

Access Log

Related ModulesMOD LOG CONFIGMOD SETENVIF

Related DirectivesCUSTOMLOGLOGFORMATSETENVIF

The server access log records all requests processed by the server. The location and content of the access log arecontrolled by the CUSTOMLOG directive. The LOGFORMAT directive can be used to simplify the selection of thecontents of the logs. This section describes how to configure the server to record information in the access log.

Of course, storing the information in the access log is only the start of log management. The next step is to analyze thisinformation to produce useful statistics. Log analysis in general is beyond the scope of this document, and not reallypart of the job of the web server itself. For more information about this topic, and for applications which perform loganalysis, check the Open Directory9 or Yahoo10.

Various versions of Apache httpd have used other modules and directives to control access logging, includingmod log referer, mod log agent, and the TransferLog directive. The CUSTOMLOG directive now subsumes thefunctionality of all the older directives.

The format of the access log is highly configurable. The format is specified using a format string that looks much likea C-style printf(1) format string. Some examples are presented in the next sections. For a complete list of the possiblecontents of the format string, see the MOD LOG CONFIG format strings (p. 471) .

Common Log Format

A typical configuration for the access log might look as follows.

LogFormat "%h %l %u %t \"%r\" %>s %b" common

CustomLog logs/access log common

This defines the nickname common and associates it with a particular log format string. The format string consists ofpercent directives, each of which tell the server to log a particular piece of information. Literal characters may also beplaced in the format string and will be copied directly into the log output. The quote character (") must be escapedby placing a backslash before it to prevent it from being interpreted as the end of the format string. The format stringmay also contain the special control characters "\n" for new-line and "\t" for tab.

The CUSTOMLOG directive sets up a new log file using the defined nickname. The filename for the access log isrelative to the SERVERROOT unless it begins with a slash.

The above configuration will write log entries in a format known as the Common Log Format (CLF). This standardformat can be produced by many different web servers and read by many log analysis programs. The log file entriesproduced in CLF will look something like this:

127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache pb.gif

HTTP/1.0" 200 2326

9http://dmoz.org/Computers/Software/Internet/Site Management/Log analysis/10http://dir.yahoo.com/Computers and Internet/Software/Internet/World Wide Web/Servers/Log Analysis Tools/

Page 39: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.7. LOG FILES 31

Each part of this log entry is described below.

127.0.0.1 (%h) This is the IP address of the client (remote host) which made the request to the server. If HOST-NAMELOOKUPS is set to On, then the server will try to determine the hostname and log it in place of the IPaddress. However, this configuration is not recommended since it can significantly slow the server. Instead, itis best to use a log post-processor such as logresolve to determine the hostnames. The IP address reportedhere is not necessarily the address of the machine at which the user is sitting. If a proxy server exists betweenthe user and the server, this address will be the address of the proxy, rather than the originating machine.

- (%l) The "hyphen" in the output indicates that the requested piece of information is not available. In this case, theinformation that is not available is the RFC 1413 identity of the client determined by identd on the clientsmachine. This information is highly unreliable and should almost never be used except on tightly controlledinternal networks. Apache httpd will not even attempt to determine this information unless IDENTITYCHECK isset to On.

frank (%u) This is the userid of the person requesting the document as determined by HTTP authentication. Thesame value is typically provided to CGI scripts in the REMOTE USER environment variable. If the status codefor the request (see below) is 401, then this value should not be trusted because the user is not yet authenticated.If the document is not password protected, this part will be "-" just like the previous one.

[10/Oct/2000:13:55:36 -0700] (%t) The time that the request was received. The format is:

[day/month/year:hour:minute:second zone]day = 2*digitmonth = 3*letteryear = 4*digithour = 2*digitminute = 2*digitsecond = 2*digitzone = (‘+’ | ‘-’) 4*digit

It is possible to have the time displayed in another format by specifying %{format}t in the log format string,where format is as in strftime(3) from the C standard library.

"GET /apache pb.gif HTTP/1.0" (\"%r\") The request line from the client is given in double quotes. Therequest line contains a great deal of useful information. First, the method used by the client is GET. Second, theclient requested the resource /apache pb.gif, and third, the client used the protocol HTTP/1.0. It is alsopossible to log one or more parts of the request line independently. For example, the format string "%m %U%q%H" will log the method, path, query-string, and protocol, resulting in exactly the same output as "%r".

200 (%>s) This is the status code that the server sends back to the client. This information is very valuable, becauseit reveals whether the request resulted in a successful response (codes beginning in 2), a redirection (codesbeginning in 3), an error caused by the client (codes beginning in 4), or an error in the server (codes beginningin 5). The full list of possible status codes can be found in the HTTP specification11 (RFC2616 section 10).

2326 (%b) The last part indicates the size of the object returned to the client, not including the response headers. Ifno content was returned to the client, this value will be "-". To log "0" for no content, use %B instead.

Combined Log Format

Another commonly used format string is called the Combined Log Format. It can be used as follows.

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\"\"%{User-agent}i\"" combined

CustomLog log/access log combined

11http://www.w3.org/Protocols/rfc2616/rfc2616.txt

Page 40: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

32 CHAPTER 2. USING THE APACHE HTTP SERVER

This format is exactly the same as the Common Log Format, with the addition of two more fields. Each of theadditional fields uses the percent-directive %{header}i, where header can be any HTTP request header. The accesslog under this format will look like:

127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache pb.gif

HTTP/1.0" 200 2326 "http://www.example.com/start.html" "Mozilla/4.08

[en] (Win98; I ;Nav)"

The additional fields are:

"http://www.example.com/start.html" (\"%{Referer}i\") The "Referer" (sic) HTTP requestheader. This gives the site that the client reports having been referred from. (This should be the page thatlinks to or includes /apache pb.gif).

"Mozilla/4.08 [en] (Win98; I ;Nav)" (\"%{User-agent}i\") The User-Agent HTTP requestheader. This is the identifying information that the client browser reports about itself.

Multiple Access Logs

Multiple access logs can be created simply by specifying multiple CUSTOMLOG directives in the configuration file.For example, the following directives will create three access logs. The first contains the basic CLF information, whilethe second and third contain referer and browser information. The last two CUSTOMLOG lines show how to mimicthe effects of the ReferLog and AgentLog directives.

LogFormat "%h %l %u %t \"%r\" %>s %b" commonCustomLog logs/access log commonCustomLog logs/referer log "%{Referer}i -> %U"

CustomLog logs/agent log "%{User-agent}i"

This example also shows that it is not necessary to define a nickname with the LOGFORMAT directive. Instead, thelog format can be specified directly in the CUSTOMLOG directive.

Conditional Logs

There are times when it is convenient to exclude certain entries from the access logs based on characteristics ofthe client request. This is easily accomplished with the help of environment variables (p. 60) . First, an environmentvariable must be set to indicate that the request meets certain conditions. This is usually accomplished with SETENVIF.Then the env= clause of the CUSTOMLOG directive is used to include or exclude requests where the environmentvariable is set. Some examples:

# Mark requests from the loop-back interfaceSetEnvIf Remote Addr "127\.0\.0\.1" dontlog# Mark requests for the robots.txt fileSetEnvIf Request URI "ˆ/robots\.txt$" dontlog# Log what remains

CustomLog logs/access log common env=!dontlog

As another example, consider logging requests from english-speakers to one log file, and non-english speakers to adifferent log file.

Page 41: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.7. LOG FILES 33

SetEnvIf Accept-Language "en" englishCustomLog logs/english log common env=english

CustomLog logs/non english log common env=!english

Although we have just shown that conditional logging is very powerful and flexible, it is not the only way to controlthe contents of the logs. Log files are more useful when they contain a complete record of server activity. It is ofteneasier to simply post-process the log files to remove requests that you do not want to consider.

Log Rotation

On even a moderately busy server, the quantity of information stored in the log files is very large. The access log filetypically grows 1 MB or more per 10,000 requests. It will consequently be necessary to periodically rotate the logfiles by moving or deleting the existing logs. This cannot be done while the server is running, because Apache willcontinue writing to the old log file as long as it holds the file open. Instead, the server must be restarted (p. 16) afterthe log files are moved or deleted so that it will open new log files.

By using a graceful restart, the server can be instructed to open new log files without losing any existing or pendingconnections from clients. However, in order to accomplish this, the server must continue to write to the old log fileswhile it finishes serving old requests. It is therefore necessary to wait for some time after the restart before doing anyprocessing on the log files. A typical scenario that simply rotates the logs and compresses the old logs to save spaceis:

mv access log access log.oldmv error log error log.oldapachectl gracefulsleep 600

gzip access log.old error log.old

Another way to perform log rotation is using piped logs as discussed in the next section.

Piped Logs

Apache httpd is capable of writing error and access log files through a pipe to another process, rather than directlyto a file. This capability dramatically increases the flexibility of logging, without adding code to the main server. Inorder to write logs to a pipe, simply replace the filename with the pipe character "|", followed by the name of theexecutable which should accept log entries on its standard input. Apache will start the piped-log process when theserver starts, and will restart it if it crashes while the server is running. (This last feature is why we can refer to thistechnique as "reliable piped logging".)

Piped log processes are spawned by the parent Apache httpd process, and inherit the userid of that process. This meansthat piped log programs usually run as root. It is therefore very important to keep the programs simple and secure.

One important use of piped logs is to allow log rotation without having to restart the server. The Apache HTTP Serverincludes a simple program called rotatelogs for this purpose. For example, to rotate the logs every 24 hours, youcan use:

CustomLog "|/usr/local/apache/bin/rotatelogs /var/log/access log

86400" common

Notice that quotes are used to enclose the entire command that will be called for the pipe. Although these examplesare for the access log, the same technique can be used for the error log.

Page 42: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

34 CHAPTER 2. USING THE APACHE HTTP SERVER

A similar but much more flexible log rotation program called cronolog12 is available at an external site.

As with conditional logging, piped logs are a very powerful tool, but they should not be used where a simpler solutionlike off-line post-processing is available.

Virtual Hosts

When running a server with many virtual hosts (p. 110) , there are several options for dealing with log files. First,it is possible to use logs exactly as in a single-host server. Simply by placing the logging directives outside the<VIRTUALHOST> sections in the main server context, it is possible to log all requests in the same access log anderror log. This technique does not allow for easy collection of statistics on individual virtual hosts.

If CUSTOMLOG or ERRORLOG directives are placed inside a <VIRTUALHOST> section, all requests or errors forthat virtual host will be logged only to the specified file. Any virtual host which does not have logging directives willstill have its requests sent to the main server logs. This technique is very useful for a small number of virtual hosts,but if the number of hosts is very large, it can be complicated to manage. In addition, it can often create problems withinsufficient file descriptors (p. 134) .

For the access log, there is a very good compromise. By adding information on the virtual host to the log format string,it is possible to log all hosts to the same log, and later split the log into individual files. For example, consider thefollowing directives.

LogFormat "%v %l %u %t \"%r\" %>s %b" comonvhost

CustomLog logs/access log comonvhost

The %v is used to log the name of the virtual host that is serving the request. Then a program like split-logfile (p. 269)can be used to post-process the access log in order to split it into one file per virtual host.

Other Log Files

Related ModulesMOD CGIMOD REWRITE

Related DirectivesPIDFILEREWRITELOGREWRITELOGLEVELSCRIPTLOGSCRIPTLOGBUFFERSCRIPTLOGLENGTH

PID File

On startup, Apache httpd saves the process id of the parent httpd process to the file logs/httpd.pid. This filenamecan be changed with the PIDFILE directive. The process-id is for use by the administrator in restarting and terminatingthe daemon by sending signals to the parent process; on Windows, use the -k command line option instead. For moreinformation see the Stopping and Restarting (p. 16) page.

12http://www.cronolog.org/

Page 43: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.7. LOG FILES 35

Script Log

In order to aid in debugging, the SCRIPTLOG directive allows you to record the input to and output from CGI scripts.This should only be used in testing - not for live servers. More information is available in the mod cgi (p. 399)documentation.

Rewrite Log

When using the powerful and complex features of mod rewrite (p. 521) , it is almost always necessary to use theREWRITELOG to help in debugging. This log file produces a detailed analysis of how the rewriting engine transformsrequests. The level of detail is controlled by the REWRITELOGLEVEL directive.

Page 44: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

36 CHAPTER 2. USING THE APACHE HTTP SERVER

2.8 Mapping URLs to Filesystem Locations

This document explains how Apache uses the URL of a request to determine the filesystem location from which toserve a file.

Related Modules and Directives

Related ModulesMOD ALIASMOD PROXYMOD REWRITEMOD USERDIRMOD SPELINGMOD VHOST ALIAS

Related DirectivesALIASALIASMATCHCHECKSPELLINGDOCUMENTROOTERRORDOCUMENTOPTIONSPROXYPASSPROXYPASSREVERSEREDIRECTREDIRECTMATCHREWRITECONDREWRITEMATCHSCRIPTALIASSCRIPTALIASMATCHUSERDIR

DocumentRoot

In deciding what file to serve for a given request, Apache’s default behavior is to take the URL-Path for the request(the part of the URL following the hostname and port) and add it to the end of the DOCUMENTROOT specified in yourconfiguration files. Therefore, the files and directories underneath the DOCUMENTROOT make up the basic documenttree which will be visible from the web.

Apache is also capable of Virtual Hosting (p. 110) , where the server receives requests for more than one host. Inthis case, a different DOCUMENTROOT can be specified for each virtual host, or alternatively, the directives providedby the module MOD VHOST ALIAS can be used to dynamically determine the appropriate place from which to servecontent based on the requested IP address or hostname.

Files Outside the DocumentRoot

There are frequently circumstances where it is necessary to allow web access to parts of the filesystem that are notstrictly underneath the DOCUMENTROOT. Apache offers several different ways to accomplish this. On Unix systems,symbolic links can bring other parts of the filesystem under the DOCUMENTROOT. For security reasons, Apachewill follow symbolic links only if the OPTIONS setting for the relevant directory includes FollowSymLinks orSymLinksIfOwnerMatch.

Alternatively, the ALIAS directive will map any part of the filesystem into the web space. For example, with

Alias /docs /var/web

the URL http://www.example.com/docs/dir/file.html will be served from/var/web/dir/file.html. The SCRIPTALIAS directive works the same way, with the additionaleffect that all content located at the target path is treated as CGI scripts.

Page 45: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.8. MAPPING URLS TO FILESYSTEM LOCATIONS 37

For situations where you require additional flexibility, you can use the ALIASMATCH and SCRIPTALIASMATCHdirectives to do powerful regular-expression based matching and substitution. For example,

ScriptAliasMatch ˆ/˜([a-zA-Z0-9]+)/cgi-bin/(.+) /home/$1/cgi-bin/$2

will map a request to http://example.com/˜user/cgi-bin/script.cgi to the path/home/user/cgi-bin/script.cgi and will treat the resulting file as a CGI script.

User Directories

Traditionally on Unix systems, the home directory of a particular user can be referred to as ˜user/. The moduleMOD USERDIR extends this idea to the web by allowing files under each user’s home directory to be accessed usingURLs such as the following.

http://www.example.com/˜user/file.html

For security reasons, it is inappropriate to give direct access to a user’s home directory from the web. There-fore, the USERDIR directive specifies a directory underneath the user’s home directory where web files are lo-cated. Using the default setting of Userdir public html, the above URL maps to a file at a directory like/home/user/public html/file.html where /home/user/ is the user’s home directory as specified in/etc/passwd.

There are also several other forms of the Userdir directive which you can use on systems where /etc/passwddoes not contain the location of the home directory.

Some people find the "˜" symbol (which is often encoded on the web as %7e) to be awkward and prefer to use analternate string to represent user directories. This functionality is not supported by mod userdir. However, if users’home directories are structured in a regular way, then it is possible to use the ALIASMATCH directive to achievethe desired effect. For example, to make http://www.example.com/upages/user/file.html map to/home/user/public html/file.html, use the following AliasMatch directive:

AliasMatch ˆ/upages/([a-zA-Z0-9]+)/?(.*) /home/$1/public html/$2

URL Redirection

The configuration directives discussed in the above sections tell Apache to get content from a specific place in thefilesystem and return it to the client. Sometimes, it is desirable instead to inform the client that the requested content islocated at a different URL, and instruct the client to make a new request with the new URL. This is called redirectionand is implemented by the REDIRECT directive. For example, if the contents of the directory /foo/ under theDOCUMENTROOT are moved to the new directory /bar/, you can instruct clients to request the content at the newlocation as follows:

Redirect permanent /foo/ http://www.example.com/bar/

This will redirect any URL-Path starting in /foo/ to the same URL path on the www.example.com server with/bar/ substituted for /foo/. You can redirect clients to any server, not only the origin server.

Apache also provides a REDIRECTMATCH directive for more complicated rewriting problems. For example, to redi-rect requests for the site home page to a different site, but leave all other requests alone, use the following configuration:

Page 46: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

38 CHAPTER 2. USING THE APACHE HTTP SERVER

RedirectMatch permanent ˆ/$ http://www.example.com/startpage.html

Alternatively, to temporarily redirect all pages on one site to a particular page on another site, use the following:

RedirectMatch temp .* http://othersite.example.com/startpage.html

Reverse Proxy

Apache also allows you to bring remote documents into the URL space of the local server. This technique is calledreverse proxying because the web server acts like a proxy server by fetching the documents from a remote server andreturning them to the client. It is different from normal proxying because, to the client, it appears the documentsoriginate at the reverse proxy server.

In the following example, when clients request documents under the /foo/ directory, the server fetches those docu-ments from the /bar/ directory on internal.example.com and returns them to the client as if they were fromthe local server.

ProxyPass /foo/ http://internal.example.com/bar/

ProxyPassReverse /foo/ http://internal.example.com/bar/

The PROXYPASS configures the server to fetch the appropriate documents, while the PROXYPASSREVERSE directiverewrites redirects originating at internal.example.com so that they target the appropriate directory on the localserver. It is important to note, however, that links inside the documents will not be rewritten. So any absolute linkson internal.example.com will result in the client breaking out of the proxy server and requesting directly frominternal.example.com.

Rewriting Engine

When even more powerful substitution is required, the rewriting engine provided by MOD REWRITE can be useful.The directives provided by this module use characteristics of the request such as browser type or source IP address indeciding from where to serve content. In addition, mod rewrite can use external database files or programs to determinehow to handle a request. The rewriting engine is capable of performing all three types of mappings discussed above:internal redirects (aliases), external redirects, and proxying. Many practical examples employing mod rewrite arediscussed in the URL Rewriting Guide (p. 86) .

File Not Found

Inevitably, URLs will be requested for which no matching file can be found in the filesystem. This can happen forseveral reasons. In some cases, it can be a result of moving documents from one location to another. In this case, it isbest to use URL redirection to inform clients of the new location of the resource. In this way, you can assure that oldbookmarks and links will continue to work, even though the resource is at a new location.

Another common cause of "File Not Found" errors is accidental mistyping of URLs, either directly in the browser,or in HTML links. Apache provides the module MOD SPELING (sic) to help with this problem. When this module isactivated, it will intercept "File Not Found" errors and look for a resource with a similar filename. If one such file isfound, mod speling will send an HTTP redirect to the client informing it of the correct location. If several "close"files are found, a list of available alternatives will be presented to the client.

An especially useful feature of mod speling, is that it will compare filenames without respect to case. This can helpsystems where users are unaware of the case-sensitive nature of URLs and the unix filesystem. But using mod speling

Page 47: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.8. MAPPING URLS TO FILESYSTEM LOCATIONS 39

for anything more than the occasional URL correction can place additional load on the server, since each "incorrect"request is followed by a URL redirection and a new request from the client.

If all attempts to locate the content fail, Apache returns an error page with HTTP status code 404 (file not found). Theappearance of this page is controlled with the ERRORDOCUMENT directive and can be customized in a flexible manneras discussed in the Custom error responses (p. 54) and International Server Error Responses (p. 273) documents.

Page 48: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

40 CHAPTER 2. USING THE APACHE HTTP SERVER

2.9 Security Tips

Some hints and tips on security issues in setting up a web server. Some of the suggestions will be general, othersspecific to Apache.

Keep up to Date

The Apache HTTP Server has a good record for security and a developer community highly concerned about securityissues. But it is inevitable that some problems – small or large – will be discovered in software after it is released. Forthis reason, it is crucial to keep aware of updates to the software. If you have obtained your version of the HTTP Serverdirectly from Apache, we highly recommend you subscribe to the Apache HTTP Server Announcements List13 whereyou can keep informed of new releases and security updates. Similar services are available from most third-partydistributors of Apache software.

Of course, most times that a web server is compromised, it is not because of problems in the HTTP Server code.Rather, it comes from problems in add-on code, CGI scripts, or the underlying Operating System. You must thereforestay aware of problems and updates with all the software on your system.

Permissions on ServerRoot Directories

In typical operation, Apache is started by the root user, and it switches to the user defined by the USER directive toserve hits. As is the case with any command that root executes, you must take care that it is protected from modificationby non-root users. Not only must the files themselves be writeable only by root, but so must the directories, and parentsof all directories. For example, if you choose to place ServerRoot in /usr/local/apache then it is suggested thatyou create that directory as root, with commands like these:

mkdir /usr/local/apachecd /usr/local/apachemkdir bin conf logschown 0 . bin conf logschgrp 0 . bin conf logs

chmod 755 . bin conf logs

It is assumed that /, /usr, and /usr/local are only modifiable by root. When you install the httpd executable,you should ensure that it is similarly protected:

cp httpd /usr/local/apache/binchown 0 /usr/local/apache/bin/httpdchgrp 0 /usr/local/apache/bin/httpd

chmod 511 /usr/local/apache/bin/httpd

You can create an htdocs subdirectory which is modifiable by other users – since root never executes any files out ofthere, and shouldn’t be creating files in there.

If you allow non-root users to modify any files that root either executes or writes on then you open your system toroot compromises. For example, someone could replace the httpd binary so that the next time you start it, it willexecute some arbitrary code. If the logs directory is writeable (by a non-root user), someone could replace a log filewith a symlink to some other system file, and then root might overwrite that file with arbitrary data. If the log filesthemselves are writeable (by a non-root user), then someone may be able to overwrite the log itself with bogus data.

13http://httpd.apache.org/lists.html#http-announce

Page 49: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.9. SECURITY TIPS 41

Server Side Includes

Server Side Includes (SSI) present a server administrator with several potential security risks.

The first risk is the increased load on the server. All SSI-enabled files have to be parsed by Apache, whether or notthere are any SSI directives included within the files. While this load increase is minor, in a shared server environmentit can become significant.

SSI files also pose the same risks that are associated with CGI scripts in general. Using the exec cmd element,SSI-enabled files can execute any CGI script or program under the permissions of the user and group Apache runs as,as configured in httpd.conf.

There are ways to enhance the security of SSI files while still taking advantage of the benefits they provide.

To isolate the damage a wayward SSI file can cause, a server administrator can enable suexec (p. 68) as described inthe CGI in General section.

Enabling SSI for files with .html or .htm extensions can be dangerous. This is especially true in a shared, or hightraffic, server environment. SSI-enabled files should have a separate extension, such as the conventional .shtml.This helps keep server load at a minimum and allows for easier management of risk.

Another solution is to disable the ability to run scripts and programs from SSI pages. To do this replaceIncludes with IncludesNOEXEC in the OPTIONS directive. Note that users may still use <--#includevirtual="..." --> to execute CGI scripts if these scripts are in directories designated by a SCRIPTALIASdirective.

CGI in General

First of all, you always have to remember that you must trust the writers of the CGI scripts/programs or your abilityto spot potential security holes in CGI, whether they were deliberate or accidental. CGI scripts can run essentiallyarbitrary commands on your system with the permissions of the web server user and can therefore be extremelydangerous if they are not carefully checked.

All the CGI scripts will run as the same user, so they have potential to conflict (accidentally or deliberately) with otherscripts e.g. User A hates User B, so he writes a script to trash User B’s CGI database. One program which can be usedto allow scripts to run as different users is suEXEC (p. 68) which is included with Apache as of 1.2 and is called fromspecial hooks in the Apache server code. Another popular way of doing this is with CGIWrap14.

Non Script Aliased CGI

Allowing users to execute CGI scripts in any directory should only be considered if:

• You trust your users not to write scripts which will deliberately or accidentally expose your system to an attack.

• You consider security at your site to be so feeble in other areas, as to make one more potential hole irrelevant.

• You have no users, and nobody ever visits your server.

Script Aliased CGI

Limiting CGI to special directories gives the admin control over what goes into those directories. This is inevitablymore secure than non script aliased CGI, but only if users with write access to the directories are trusted or the adminis willing to test each new CGI script/program for potential security holes.

Most sites choose this option over the non script aliased CGI approach.

14http://cgiwrap.unixtools.org/

Page 50: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

42 CHAPTER 2. USING THE APACHE HTTP SERVER

Other sources of dynamic content

Embedded scripting options which run as part of the server itself, such as mod php, mod perl, mod tcl, andmod python, run under the identity of the server itself (see the USER directive), and therefore scripts executed bythese engines potentially can access anything the server user can. Some scripting engines may provide restrictions, butit is better to be safe and assume not.

Protecting System Settings

To run a really tight ship, you’ll want to stop users from setting up .htaccess files which can override securityfeatures you’ve configured. Here’s one way to do it.

In the server configuration file, put

<Directory />AllowOverride None

</Directory>

This prevents the use of .htaccess files in all directories apart from those specifically enabled.

Protect Server Files by Default

One aspect of Apache which is occasionally misunderstood is the feature of default access. That is, unless you takesteps to change it, if the server can find its way to a file through normal URL mapping rules, it can serve it to clients.

For instance, consider the following example:

# cd /; ln -s / public html

Accessing http://localhost/˜root/

This would allow clients to walk through the entire filesystem. To work around this, add the following block to yourserver’s configuration:

<Directory />Order Deny,AllowDeny from all

</Directory>

This will forbid default access to filesystem locations. Add appropriate DIRECTORY blocks to allow access only inthose areas you wish. For example,

<Directory /usr/users/*/public html>Order Deny,AllowAllow from all</Directory><Directory /usr/local/httpd>Order Deny,AllowAllow from all

</Directory>

Page 51: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.9. SECURITY TIPS 43

Pay particular attention to the interactions of LOCATION and DIRECTORY directives; for instance, even if<Directory /> denies access, a <Location /> directive might overturn it.

Also be wary of playing games with the USERDIR directive; setting it to something like ./ would have the sameeffect, for root, as the first example above. If you are using Apache 1.3 or above, we strongly recommend that youinclude the following line in your server configuration files:

UserDir disabled root

Watching Your Logs

To keep up-to-date with what is actually going on against your server you have to check the Log Files (p. 29) . Eventhough the log files only reports what has already happened, they will give you some understanding of what attacks isthrown against the server and allow you to check if the necessary level of security is present.

A couple of examples:

grep -c "/jsp/source.jsp?/jsp/ /jsp/source.jsp??" access log

grep "client denied" error log | tail -n 10

The first example will list the number of attacks trying to exploit the Apache Tomcat Source.JSP Malformed RequestInformation Disclosure Vulnerability15, the second example will list the ten last denied clients, for example:

[Thu Jul 11 17:18:39 2002] [error] [client foo.bar.com] client denied

by server configuration: /usr/local/apache/htdocs/.htpasswd

As you can see, the log files only report what already has happened, so if the client had been able to access the.htpasswd file you would have seen something similar to:

foo.bar.com - - [12/Jul/2002:01:59:13 +0200] "GET /.htpasswd

HTTP/1.1"

in your Access Log (p. 29) . This means you probably commented out the following in your server configuration file:

<Files ˜ "ˆ\.ht">Order allow,denyDeny from all

</Files>

15http://online.securityfocus.com/bid/4876/info/

Page 52: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

44 CHAPTER 2. USING THE APACHE HTTP SERVER

2.10 Dynamic Shared Object (DSO) Support

The Apache HTTP Server is a modular program where the administrator can choose the functionality to include in theserver by selecting a set of modules. The modules can be statically compiled into the httpd binary when the server isbuilt. Alternatively, modules can be compiled as Dynamic Shared Objects (DSOs) that exist separately from the mainhttpd binary file. DSO modules may be compiled at the time the server is built, or they may be compiled and addedat a later time using the Apache Extension Tool (apxs).

This document describes how to use DSO modules as well as the theory behind their use.

Implementation

Related ModulesMOD SO

Related DirectivesLOADMODULE

The DSO support for loading individual Apache modules is based on a module named MOD SO which must be stat-ically compiled into the Apache core. It is the only module besides CORE which cannot be put into a DSO itself.Practically all other distributed Apache modules can then be placed into a DSO by individually enabling the DSObuild for them via configure’s --enable-module=shared option as discussed in the install documentation(p. 10) . After a module is compiled into a DSO named mod foo.so you can use MOD SO’s LOADMODULE com-mand in your httpd.conf file to load this module at server startup or restart.

To simplify this creation of DSO files for Apache modules (especially for third-party modules) a new support programnamed apxs (APache eXtenSion) is available. It can be used to build DSO based modules outside of the Apachesource tree. The idea is simple: When installing Apache the configure’s make install procedure installs theApache C header files and puts the platform-dependent compiler and linker flags for building DSO files into the apxsprogram. This way the user can use apxs to compile his Apache module sources without the Apache distributionsource tree and without having to fiddle with the platform-dependent compiler and linker flags for DSO support.

Usage Summary

To give you an overview of the DSO features of Apache 2.x, here is a short and concise summary:

1. Build and install a distributed Apache module, say mod foo.c, into its own DSO mod foo.so:

$ ./configure --prefix=/path/to/install --enable-foo=shared

$ make install

2. Build and install a third-party Apache module, say mod foo.c, into its own DSO mod foo.so:

$ ./configure --add-module=module type:/path/to/3rdparty/mod foo.c--enable-foo=shared

$ make install

3. Configure Apache for later installation of shared modules:

$ ./configure --enable-so

$ make install

Page 53: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.10. DYNAMIC SHARED OBJECT (DSO) SUPPORT 45

4. Build and install a third-party Apache module, say mod foo.c, into its own DSO mod foo.so outside ofthe Apache source tree using apxs:

$ cd /path/to/3rdparty$ apxs -c mod foo.c

$ apxs -i -a -n foo mod foo.la

In all cases, once the shared module is compiled, you must use a LOADMODULE directive in httpd.conf to tellApache to activate the module.

Background

On modern Unix derivatives there exists a nifty mechanism usually called dynamic linking/loading of Dynamic SharedObjects (DSO) which provides a way to build a piece of program code in a special format for loading it at run-timeinto the address space of an executable program.

This loading can usually be done in two ways: Automatically by a system program called ld.so when an executableprogram is started or manually from within the executing program via a programmatic system interface to the Unixloader through the system calls dlopen()/dlsym().

In the first way the DSO’s are usually called shared libraries or DSO libraries and named libfoo.so orlibfoo.so.1.2. They reside in a system directory (usually /usr/lib) and the link to the executable programis established at build-time by specifying -lfoo to the linker command. This hard-codes library references into theexecutable program file so that at start-time the Unix loader is able to locate libfoo.so in /usr/lib, in pathshard-coded via linker-options like -R or in paths configured via the environment variable LD LIBRARY PATH. It thenresolves any (yet unresolved) symbols in the executable program which are available in the DSO.

Symbols in the executable program are usually not referenced by the DSO (because it’s a reusable library of generalcode) and hence no further resolving has to be done. The executable program has no need to do anything on its ownto use the symbols from the DSO because the complete resolving is done by the Unix loader. (In fact, the code toinvoke ld.so is part of the run-time startup code which is linked into every executable program which has beenbound non-static). The advantage of dynamic loading of common library code is obvious: the library code needs to bestored only once, in a system library like libc.so, saving disk space for every program.

In the second way the DSO’s are usually called shared objects or DSO files and can be named with an arbitraryextension (although the canonical name is foo.so). These files usually stay inside a program-specific directoryand there is no automatically established link to the executable program where they are used. Instead the executableprogram manually loads the DSO at run-time into its address space via dlopen(). At this time no resolving ofsymbols from the DSO for the executable program is done. But instead the Unix loader automatically resolves any(yet unresolved) symbols in the DSO from the set of symbols exported by the executable program and its alreadyloaded DSO libraries (especially all symbols from the ubiquitous libc.so). This way the DSO gets knowledge ofthe executable program’s symbol set as if it had been statically linked with it in the first place.

Finally, to take advantage of the DSO’s API the executable program has to resolve particular symbols from the DSOvia dlsym() for later use inside dispatch tables etc. In other words: The executable program has to manually resolveevery symbol it needs to be able to use it. The advantage of such a mechanism is that optional program parts need notbe loaded (and thus do not spend memory) until they are needed by the program in question. When required, theseprogram parts can be loaded dynamically to extend the base program’s functionality.

Although this DSO mechanism sounds straightforward there is at least one difficult step here: The resolving of symbolsfrom the executable program for the DSO when using a DSO to extend a program (the second way). Why? Because"reverse resolving" DSO symbols from the executable program’s symbol set is against the library design (where thelibrary has no knowledge about the programs it is used by) and is neither available under all platforms nor standardized.In practice the executable program’s global symbols are often not re-exported and thus not available for use in a DSO.

Page 54: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

46 CHAPTER 2. USING THE APACHE HTTP SERVER

Finding a way to force the linker to export all global symbols is the main problem one has to solve when using DSOfor extending a program at run-time.

The shared library approach is the typical one, because it is what the DSO mechanism was designed for, hence itis used for nearly all types of libraries the operating system provides. On the other hand using shared objects forextending a program is not used by a lot of programs.

As of 1998 there are only a few software packages available which use the DSO mechanism to actually extend theirfunctionality at run-time: Perl 5 (via its XS mechanism and the DynaLoader module), Netscape Server, etc. Startingwith version 1.3, Apache joined the crew, because Apache already uses a module concept to extend its functionalityand internally uses a dispatch-list-based approach to link external modules into the Apache core functionality. So,Apache is really predestined for using DSO to load its modules at run-time.

Advantages and Disadvantages

The above DSO based features have the following advantages:

• The server package is more flexible at run-time because the actual server process can be assembled at run-timevia LOADMODULE httpd.conf configuration commands instead of configure options at build-time. Forinstance this way one is able to run different server instances (standard & SSL version, minimalistic & poweredup version [mod perl, PHP3], etc.) with only one Apache installation.

• The server package can be easily extended with third-party modules even after installation. This is at least agreat benefit for vendor package maintainers who can create a Apache core package and additional packagescontaining extensions like PHP3, mod perl, mod fastcgi, etc.

• Easier Apache module prototyping because with the DSO/apxs pair you can both work outside the Apachesource tree and only need an apxs -i command followed by an apachectl restart to bring a newversion of your currently developed module into the running Apache server.

DSO has the following disadvantages:

• The DSO mechanism cannot be used on every platform because not all operating systems support dynamicloading of code into the address space of a program.

• The server is approximately 20% slower at startup time because of the symbol resolving overhead the Unixloader now has to do.

• The server is approximately 5% slower at execution time under some platforms because position independentcode (PIC) sometimes needs complicated assembler tricks for relative addressing which are not necessarily asfast as absolute addressing.

• Because DSO modules cannot be linked against other DSO-based libraries (ld -lfoo) on all platforms (forinstance a.out-based platforms usually don’t provide this functionality while ELF-based platforms do) you can-not use the DSO mechanism for all types of modules. Or in other words, modules compiled as DSO files arerestricted to only use symbols from the Apache core, from the C library (libc) and all other dynamic or staticlibraries used by the Apache core, or from static library archives (libfoo.a) containing position indepen-dent code. The only chances to use other code is to either make sure the Apache core itself already contains areference to it or loading the code yourself via dlopen().

Page 55: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.11. CONTENT NEGOTIATION 47

2.11 Content Negotiation

Apache supports content negotiation as described in the HTTP/1.1 specification. It can choose the best representationof a resource based on the browser-supplied preferences for media type, languages, character set and encoding. Italso implements a couple of features to give more intelligent handling of requests from browsers that send incompletenegotiation information.

Content negotiation is provided by the MOD NEGOTIATION module, which is compiled in by default.

About Content Negotiation

A resource may be available in several different representations. For example, it might be available in differentlanguages or different media types, or a combination. One way of selecting the most appropriate choice is to give theuser an index page, and let them select. However it is often possible for the server to choose automatically. This worksbecause browsers can send, as part of each request, information about what representations they prefer. For example,a browser could indicate that it would like to see information in French, if possible, else English will do. Browsersindicate their preferences by headers in the request. To request only French representations, the browser would send

Accept-Language: fr

Note that this preference will only be applied when there is a choice of representations and they vary by language.

As an example of a more complex request, this browser has been configured to accept French and English, but preferFrench, and to accept various media types, preferring HTML over plain text or other text types, and preferring GIF orJPEG over other media types, but also allowing any other media type as a last resort:

Accept-Language: fr; q=1.0, en; q=0.5

Accept: text/html; q=1.0, text/*; q=0.8, image/gif; q=0.6,

image/jpeg; q=0.6, image/*; q=0.5, */*; q=0.1

Apache supports ’server driven’ content negotiation, as defined in the HTTP/1.1 specification. It fully supports theAccept, Accept-Language, Accept-Charset andAccept-Encoding request headers. Apache also sup-ports ’transparent’ content negotiation, which is an experimental negotiation protocol defined in RFC 2295 and RFC2296. It does not offer support for ’feature negotiation’ as defined in these RFCs.

A resource is a conceptual entity identified by a URI (RFC 2396). An HTTP server like Apache provides access torepresentations of the resource(s) within its namespace, with each representation in the form of a sequence of byteswith a defined media type, character set, encoding, etc. Each resource may be associated with zero, one, or more thanone representation at any given time. If multiple representations are available, the resource is referred to as negotiableand each of its representations is termed a variant. The ways in which the variants for a negotiable resource vary arecalled the dimensions of negotiation.

Negotiation in Apache

In order to negotiate a resource, the server needs to be given information about each of the variants. This is done inone of two ways:

• Using a type map (i.e., a *.var file) which names the files containing the variants explicitly, or

• Using a ’MultiViews’ search, where the server does an implicit filename pattern match and chooses from amongthe results.

Page 56: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

48 CHAPTER 2. USING THE APACHE HTTP SERVER

Using a type-map file

A type map is a document which is associated with the handler named type-map (or, for backwards-compatibilitywith older Apache configurations, the MIME type application/x-type-map). Note that to use this feature, youmust have a handler set in the configuration that defines a file suffix as type-map; this is best done with

AddHandler type-map .var

in the server configuration file.

Type map files should have the same name as the resource which they are describing, and have an entry for eachavailable variant; these entries consist of contiguous HTTP-format header lines. Entries for different variants areseparated by blank lines. Blank lines are illegal within an entry. It is conventional to begin a map file with an entry forthe combined entity as a whole (although this is not required, and if present will be ignored). An example map file isshown below. This file would be named foo.var, as it describes a resource named foo.

URI: foo

URI: foo.en.htmlContent-type: text/htmlContent-language: en

URI: foo.fr.de.htmlContent-type: text/html;charset=iso-8859-2

Content-language: fr, de

Note also that a typemap file will take precedence over the filename’s extension, even when Multiviews is on. If thevariants have different source qualities, that may be indicated by the "qs" parameter to the media type, as in thispicture (available as JPEG, GIF, or ASCII-art):

URI: foo

URI: foo.jpegContent-type: image/jpeg; qs=0.8

URI: foo.gifContent-type: image/gif; qs=0.5

URI: foo.txt

Content-type: text/plain; qs=0.01

qs values can vary in the range 0.000 to 1.000. Note that any variant with a qs value of 0.000 will never be chosen.Variants with no ’qs’ parameter value are given a qs factor of 1.0. The qs parameter indicates the relative ’quality’of this variant compared to the other available variants, independent of the client’s capabilities. For example, a JPEGfile is usually of higher source quality than an ASCII file if it is attempting to represent a photograph. However, if theresource being represented is an original ASCII art, then an ASCII representation would have a higher source qualitythan a JPEG representation. A qs value is therefore specific to a given variant depending on the nature of the resourceit represents.

The full list of headers recognized is available in the mod negotation typemap (p. 499) documentation.

Multiviews

MultiViews is a per-directory option, meaning it can be set with an OPTIONS directive within a <DIRECTORY>,<LOCATION> or <FILES> section in httpd.conf, or (if ALLOWOVERRIDE is properly set) in .htaccess files.Note that Options All does not set MultiViews; you have to ask for it by name.

Page 57: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.11. CONTENT NEGOTIATION 49

The effect of MultiViews is as follows: if the server receives a request for /some/dir/foo, if /some/dir hasMultiViews enabled, and /some/dir/foo does not exist, then the server reads the directory looking for filesnamed foo.*, and effectively fakes up a type map which names all those files, assigning them the same media typesand content-encodings it would have if the client had asked for one of them by name. It then chooses the best matchto the client’s requirements.

MultiViewsmay also apply to searches for the file named by the DIRECTORYINDEX directive, if the server is tryingto index a directory. If the configuration files specify

DirectoryIndex index

then the server will arbitrate between index.html and index.html3 if both are present. If neither are present,and index.cgi is there, the server will run it.

If one of the files found when reading the directory does not have an extension recognized by mod mime to designateits Charset, Content-Type, Language, or Encoding, then the result depends on the setting of the MULTIVIEWSMATCHdirective. This directive determines whether handlers, filters, and other extension types can participate in MultiViewsnegotiation.

The Negotiation Methods

After Apache has obtained a list of the variants for a given resource, either from a type-map file or from the filenamesin the directory, it invokes one of two methods to decide on the ’best’ variant to return, if any. It is not necessary toknow any of the details of how negotiation actually takes place in order to use Apache’s content negotiation features.However the rest of this document explains the methods used for those interested.

There are two negotiation methods:

1. Server driven negotiation with the Apache algorithm is used in the normal case. The Apache algorithm isexplained in more detail below. When this algorithm is used, Apache can sometimes ’fiddle’ the quality factorof a particular dimension to achieve a better result. The ways Apache can fiddle quality factors is explained inmore detail below.

2. Transparent content negotiation is used when the browser specifically requests this through the mechanismdefined in RFC 2295. This negotiation method gives the browser full control over deciding on the ’best’ variant,the result is therefore dependent on the specific algorithms used by the browser. As part of the transparentnegotiation process, the browser can ask Apache to run the ’remote variant selection algorithm’ defined in RFC2296.

Dimensions of Negotiation

Dimension NotesMedia Type Browser indicates preferences with the Accept header field. Each item can have an associated quality factor.

Variant description can also have a quality factor (the "qs" parameter).Language Browser indicates preferences with the Accept-Language header field. Each item can have a quality factor.

Variants can be associated with none, one or more than one language.Encoding Browser indicates preference with the Accept-Encoding header field. Each item can have a quality factor.Charset Browser indicates preference with the Accept-Charset header field. Each item can have a quality factor.

Variants can indicate a charset as a parameter of the media type.

Apache Negotiation Algorithm

Apache can use the following algorithm to select the ’best’ variant (if any) to return to the browser. This algorithm isnot further configurable. It operates as follows:

Page 58: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

50 CHAPTER 2. USING THE APACHE HTTP SERVER

1. First, for each dimension of the negotiation, check the appropriate Accept* header field and assign a quality toeach variant. If the Accept* header for any dimension implies that this variant is not acceptable, eliminate it. Ifno variants remain, go to step 4.

2. Select the ’best’ variant by a process of elimination. Each of the following tests is applied in order. Any variantsnot selected at each test are eliminated. After each test, if only one variant remains, select it as the best matchand proceed to step 3. If more than one variant remains, move on to the next test.

(a) Multiply the quality factor from the Accept header with the quality-of-source factor for this variantsmedia type, and select the variants with the highest value.

(b) Select the variants with the highest language quality factor.

(c) Select the variants with the best language match, using either the order of languages in theAccept-Language header (if present), or else the order of languages in the LanguagePrioritydirective (if present).

(d) Select the variants with the highest ’level’ media parameter (used to give the version of text/html mediatypes).

(e) Select variants with the best charset media parameters, as given on the Accept-Charset header line.Charset ISO-8859-1 is acceptable unless explicitly excluded. Variants with a text/* media type but notexplicitly associated with a particular charset are assumed to be in ISO-8859-1.

(f) Select those variants which have associated charset media parameters that are not ISO-8859-1. If there areno such variants, select all variants instead.

(g) Select the variants with the best encoding. If there are variants with an encoding that is acceptable to theuser-agent, select only these variants. Otherwise if there is a mix of encoded and non-encoded variants,select only the unencoded variants. If either all variants are encoded or all variants are not encoded, selectall variants.

(h) Select the variants with the smallest content length.

(i) Select the first variant of those remaining. This will be either the first listed in the type-map file, or whenvariants are read from the directory, the one whose file name comes first when sorted using ASCII codeorder.

3. The algorithm has now selected one ’best’ variant, so return it as the response. The HTTP response header Varyis set to indicate the dimensions of negotiation (browsers and caches can use this information when caching theresource). End.

4. To get here means no variant was selected (because none are acceptable to the browser). Return a 406 status(meaning "No acceptable representation") with a response body consisting of an HTML document listing theavailable variants. Also set the HTTP Vary header to indicate the dimensions of variance.

Fiddling with Quality Values

Apache sometimes changes the quality values from what would be expected by a strict interpretation of the Apachenegotiation algorithm above. This is to get a better result from the algorithm for browsers which do not send full oraccurate information. Some of the most popular browsers send Accept header information which would otherwiseresult in the selection of the wrong variant in many cases. If a browser sends full and correct information these fiddleswill not be applied.

Media Types and Wildcards

The Accept: request header indicates preferences for media types. It can also include ’wildcard’ media types, suchas "image/*" or "*/*" where the * matches any string. So a request including:

Page 59: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.11. CONTENT NEGOTIATION 51

Accept: image/*, */*

would indicate that any type starting "image/" is acceptable, as is any other type. Some browsers routinely sendwildcards in addition to explicit types they can handle. For example:

Accept: text/html, text/plain, image/gif, image/jpeg, */*

The intention of this is to indicate that the explicitly listed types are preferred, but if a different representation isavailable, that is ok too. Using explicit quality values, what the browser really wants is something like:

Accept: text/html, text/plain, image/gif, image/jpeg, */*; q=0.01

The explicit types have no quality factor, so they default to a preference of 1.0 (the highest). The wildcard */* is givena low preference of 0.01, so other types will only be returned if no variant matches an explicitly listed type.

If the Accept: header contains no q factors at all, Apache sets the q value of "*/*", if present, to 0.01 to emulatethe desired behavior. It also sets the q value of wildcards of the format "type/*" to 0.02 (so these are preferred overmatches against "*/*". If any media type on the Accept: header contains a q factor, these special values are notapplied, so requests from browsers which send the explicit information to start with work as expected.

Language Negotiation Exceptions

New in Apache 2.0, some exceptions have been added to the negotiation algorithm to allow graceful fallback whenlanguage negotiation fails to find a match.

When a client requests a page on your server, but the server cannot find a single page that matches theAccept-language sent by the browser, the server will return either a "No Acceptable Variant" or "MultipleChoices" response to the client. To avoid these error messages, it is possible to configure Apache to ignore theAccept-language in these cases and provide a document that does not explicitly match the client’s request. TheFORCELANGUAGEPRIORITY directive can be used to override one or both of these error messages and substitute theservers judgement in the form of the LANGUAGEPRIORITY directive.

The server will also attempt to match language-subsets when no other match can be found. For example, if a clientrequests documents with the language en-GB for British English, the server is not normally allowed by the HTTP/1.1standard to match that against a document that is marked as simply en. (Note that it is almost surely a configura-tion error to include en-GB and not en in the Accept-Language header, since it is very unlikely that a readerunderstands British English, but doesn’t understand English in general. Unfortunately, many current clients have de-fault configurations that resemble this.) However, if no other language match is possible and the server is about toreturn a "No Acceptable Variants" error or fallback to the LANGUAGEPRIORITY, the server will ignore the subsetspecification and match en-GB against en documents. Implicitly, Apache will add the parent language to the client’sacceptable language list with a very low quality value. But note that if the client requests "en-GB; q=0.9, fr; q=0.8",and the server has documents designated "en" and "fr", then the "fr" document will be returned. This is necessaryto maintain compliance with the HTTP/1.1 specification and to work effectively with properly configured clients.

In order to support advanced techniques (such as cookies or special URL-paths) to determine the user’s preferred lan-guage, since Apache 2.0.47 MOD NEGOTIATION recognizes the environment variable (p. 60) prefer-language.If it exists and contains an appropriate language tag, MOD NEGOTIATION will try to select a matching variant. Ifthere’s no such variant, the normal negotiation process applies.

ExampleSetEnvIf Cookie "language=en" prefer-language=en

SetEnvIf Cookie "language=fr" prefer-language=fr

Page 60: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

52 CHAPTER 2. USING THE APACHE HTTP SERVER

Extensions to Transparent Content Negotiation

Apache extends the transparent content negotiation protocol (RFC 2295) as follows. A new {encoding ..} ele-ment is used in variant lists to label variants which are available with a specific content-encoding only. The implemen-tation of the RVSA/1.0 algorithm (RFC 2296) is extended to recognize encoded variants in the list, and to use themas candidate variants whenever their encodings are acceptable according to the Accept-Encoding request header.The RVSA/1.0 implementation does not round computed quality factors to 5 decimal places before choosing the bestvariant.

Note on hyperlinks and naming conventions

If you are using language negotiation you can choose between different naming conventions, because files can havemore than one extension, and the order of the extensions is normally irrelevant (see the mod mime (p. 483) documen-tation for details).

A typical file has a MIME-type extension (e.g., html), maybe an encoding extension (e.g., gz), and of course alanguage extension (e.g., en) when we have different language variants of this file.

Examples:

• foo.en.html

• foo.html.en

• foo.en.html.gz

Here some more examples of filenames together with valid and invalid hyperlinks:

Filename Valid hyperlink Invalid hyperlinkfoo.html.en foo

foo.html-

foo.en.html foo foo.htmlfoo.html.en.gz foo

foo.htmlfoo.gzfoo.html.gz

foo.en.html.gz foo foo.htmlfoo.html.gzfoo.gz

foo.gz.html.en foofoo.gzfoo.gz.html

foo.html

foo.html.gz.en foofoo.htmlfoo.html.gz

foo.gz

Looking at the table above, you will notice that it is always possible to use the name without any extensions in ahyperlink (e.g., foo). The advantage is that you can hide the actual type of a document rsp. file and can change itlater, e.g., from html to shtml or cgi without changing any hyperlink references.

If you want to continue to use a MIME-type in your hyperlinks (e.g. foo.html) the language extension (including anencoding extension if there is one) must be on the right hand side of the MIME-type extension (e.g., foo.html.en).

Note on Caching

When a cache stores a representation, it associates it with the request URL. The next time that URL is requested,the cache can use the stored representation. But, if the resource is negotiable at the server, this might result in onlythe first requested variant being cached and subsequent cache hits might return the wrong response. To prevent this,

Page 61: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.11. CONTENT NEGOTIATION 53

Apache normally marks all responses that are returned after content negotiation as non-cacheable by HTTP/1.0 clients.Apache also supports the HTTP/1.1 protocol features to allow caching of negotiated responses.

For requests which come from a HTTP/1.0 compliant client (either a browser or a cache), the directive CACHENE-GOTIATEDDOCS can be used to allow caching of responses which were subject to negotiation. This directive can begiven in the server config or virtual host, and takes no arguments. It has no effect on requests from HTTP/1.1 clients.

Page 62: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

54 CHAPTER 2. USING THE APACHE HTTP SERVER

2.12 Custom Error Responses

Additional functionality allows webmasters to configure the response of Apache to some error or problem.

Customizable responses can be defined to be activated in the event of a server detected error or problem.

If a script crashes and produces a "500 Server Error" response, then this response can be replaced with either somefriendlier text or by a redirection to another URL (local or external).

Behavior

Old Behavior

NCSA httpd 1.3 would return some boring old error/problem message which would often be meaningless to the user,and would provide no means of logging the symptoms which caused it.

New Behavior

The server can be asked to:

1. Display some other text, instead of the NCSA hard coded messages, or

2. redirect to a local URL, or

3. redirect to an external URL.

Redirecting to another URL can be useful, but only if some information can be passed which can then be used toexplain and/or log the error/problem more clearly.

To achieve this, Apache will define new CGI-like environment variables:

REDIRECT HTTP ACCEPT=*/*, image/gif, image/x-xbitmap, image/jpegREDIRECT HTTP USER AGENT=Mozilla/1.1b2 (X11; I; HP-UX A.09.059000/712)REDIRECT PATH=.:/bin:/usr/local/bin:/etcREDIRECT QUERY STRING=REDIRECT REMOTE ADDR=121.345.78.123REDIRECT REMOTE HOST=ooh.ahhh.comREDIRECT SERVER NAME=crash.bang.eduREDIRECT SERVER PORT=80REDIRECT SERVER SOFTWARE=Apache/0.8.15

REDIRECT URL=/cgi-bin/buggy.pl

Note the REDIRECT prefix.

At least REDIRECT URL and REDIRECT QUERY STRING will be passed to the new URL (assuming it’s a cgi-scriptor a cgi-include). The other variables will exist only if they existed prior to the error/problem. None of these will beset if your ERRORDOCUMENT is an external redirect (anything starting with a scheme name like http:, even if itrefers to the same host as the server).

Page 63: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.12. CUSTOM ERROR RESPONSES 55

Configuration

Use of ERRORDOCUMENT is enabled for .htaccess files when the ALLOWOVERRIDE is set accordingly.

Here are some examples...

ErrorDocument 500 /cgi-bin/crash-recoverErrorDocument 500 "Sorry, our script crashed. Oh dear"ErrorDocument 500 http://xxx/ErrorDocument 404 /Lame excuses/not found.html

ErrorDocument 401 /Subscription/how to subscribe.html

The syntax is,

ErrorDocument <3-digit-code> <action>

where the action can be,

1. Text to be displayed. Prefix the text with a quote ("). Whatever follows the quote is displayed. Note: the (")prefix isn’t displayed.

2. An external URL to redirect to.

3. A local URL to redirect to.

Custom Error Responses and Redirects

Apache’s behavior to redirected URLs has been modified so that additional environment variables are available to ascript/server-include.

Old behavior

Standard CGI vars were made available to a script which has been redirected to. No indication of where the redirectioncame from was provided.

New behavior

A new batch of environment variables will be initialized for use by a script which has been redirected to. Each newvariable will have the prefix REDIRECT . REDIRECT environment variables are created from the CGI environmentvariables which existed prior to the redirect, they are renamed with a REDIRECT prefix, i.e., HTTP USER AGENTbecomes REDIRECT HTTP USER AGENT. In addition to these new variables, Apache will define REDIRECT URLand REDIRECT STATUS to help the script trace its origin. Both the original URL and the URL being redirected tocan be logged in the access log.

If the ErrorDocument specifies a local redirect to a CGI script, the script should include a "Status:" header fieldin its output in order to ensure the propagation all the way back to the client of the error condition that caused it to beinvoked. For instance, a Perl ErrorDocument script might include the following:

...print "Content-type: text/html\n";printf "Status: %s Condition Intercepted\n", $ENV{"REDIRECT STATUS"};...

Page 64: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

56 CHAPTER 2. USING THE APACHE HTTP SERVER

If the script is dedicated to handling a particular error condition, such as 404NotFound, it can use the specific codeand error text instead.

Note that the script must emit an appropriate Status: header (such as 302Found), if the response contains aLocation: header (in order to issue a client side redirect). Otherwise the Location: header may have no effect.

Page 65: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.13. BINDING 57

2.13 Binding

Configuring Apache to listen on specific addresses and ports.

See also

• Virtual Hosts (p. 110)

• DNS Issues (p. 136)

Overview

Related ModulesCOREMPM COMMON

Related Directives<VIRTUALHOST>LISTEN

When Apache starts, it binds to some port and address on the local machine and waits for incoming requests. Bydefault, it listens to all addresses on the machine. However, it needs to be told to listen on specific ports, or to listenon only selected addresses, or a combination. This is often combined with the Virtual Host feature which determineshow Apache responds to different IP addresses, hostnames and ports.

The LISTEN directive tells the server to accept incoming requests only on the specified port or address-and-portcombinations. If only a port number is specified in the LISTEN directive, the server listens to the given port on allinterfaces. If an IP address is given as well as a port, the server will listen on the given port and interface. MultipleLISTEN directives may be used to specify a number of addresses and ports to listen on. The server will respond torequests from any of the listed addresses and ports.

For example, to make the server accept connections on both port 80 and port 8000, use:

Listen 80

Listen 8000

To make the server accept connections on two specified interfaces and port numbers, use

Listen 192.170.2.1:80

Listen 192.170.2.5:8000

IPv6 addresses must be surrounded in square brackets, as in the following example:

Listen [2001:db8::a00:20ff:fea7:ccea]:80

Special IPv6 Considerations

A growing number of platforms implement IPv6, and APR supports IPv6 on most of these platforms, allowing Apacheto allocate IPv6 sockets and handle requests which were sent over IPv6.

One complicating factor for Apache administrators is whether or not an IPv6 socket can handle both IPv4 connectionsand IPv6 connections. Handling IPv4 connections with an IPv6 socket uses IPv4-mapped IPv6 addresses, which areallowed by default on most platforms but are disallowed by default on FreeBSD, NetBSD, and OpenBSD in order tomatch the system-wide policy on those platforms. But even on systems where it is disallowed by default, a specialconfigure parameter can change this behavior for Apache.

Page 66: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

58 CHAPTER 2. USING THE APACHE HTTP SERVER

If you want Apache to handle IPv4 and IPv6 connections with a minimum of sockets, which requires using IPv4-mapped IPv6 addresses, specify the --enable-v4-mapped configure option and use generic LISTEN direc-tives like the following:

Listen 80

With --enable-v4-mapped, the Listen directives in the default configuration file created by Apache will use thisform. --enable-v4-mapped is the default on all platforms but FreeBSD, NetBSD, and OpenBSD, so this isprobably how your Apache was built.

If you want Apache to handle IPv4 connections only, regardless of what your platform and APR will support, specifyan IPv4 address on all LISTEN directives, as in the following examples:

Listen 0.0.0.0:80

Listen 192.170.2.1:80

If you want Apache to handle IPv4 and IPv6 connections on separate sockets (i.e., to disable IPv4-mapped addresses),specify the --disable-v4-mapped configure option and use specific Listen directives like the following:

Listen [::]:80

Listen 0.0.0.0:80

With --disable-v4-mapped, the Listen directives in the default configuration file created by Apache will usethis form. --disable-v4-mapped is the default on FreeBSD, NetBSD, and OpenBSD.

How This Works With Virtual Hosts

LISTEN does not implement Virtual Hosts. It only tells the main server what addresses and ports to listen to. If no<VIRTUALHOST> directives are used, the server will behave the same for all accepted requests. However, <VIR-TUALHOST> can be used to specify a different behavior for one or more of the addresses and ports. To implementa VirtualHost, the server must first be told to listen to the address and port to be used. Then a <VIRTUALHOST>section should be created for a specified address and port to set the behavior of this virtual host. Note that if the<VIRTUALHOST> is set for an address and port that the server is not listening to, it cannot be accessed.

Page 67: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.14. MULTI-PROCESSING MODULES (MPMS) 59

2.14 Multi-Processing Modules (MPMs)

This document describes what a Multi-Processing Module is and how they are used by the Apache HTTP Server.

Introduction

The Apache HTTP Server is designed to be a powerful and flexible web server that can work on a very wide variety ofplatforms in a range of different environments. Different platforms and different environments often require differentfeatures, or may have different ways of implementing the same feature most efficiently. Apache has always accommo-dated a wide variety of environments through its modular design. This design allows the webmaster to choose whichfeatures will be included in the server by selecting which modules to load either at compile-time or at run-time.

Apache 2.0 extends this modular design to the most basic functions of a web server. The server ships with a selectionof Multi-Processing Modules (MPMs) which are responsible for binding to network ports on the machine, acceptingrequests, and dispatching children to handle the requests.

Extending the modular design to this level of the server allows two important benefits:

• Apache can more cleanly and efficiently support a wide variety of operating systems. In particular, the Windowsversion of Apache is now much more efficient, since MPM WINNT can use native networking features in placeof the POSIX layer used in Apache 1.3. This benefit also extends to other operating systems that implementspecialized MPMs.

• The server can be better customized for the needs of the particular site. For example, sites that need a great dealof scalability can choose to use a threaded MPM like WORKER, while sites requiring stability or compatibilitywith older software can use a PREFORK. In addition, special features like serving different hosts under differentuserids (PERCHILD) can be provided.

At the user level, MPMs appear much like other Apache modules. The main difference is that one and only one MPMmust be loaded into the server at any time. The list of available MPMs appears on the module index page (p. 660) .

Choosing an MPM

MPMs must be chosen during configuration, and compiled into the server. Compilers are capable of optimizing a lotof functions if threads are used, but only if they know that threads are being used.

To actually choose the desired MPM, use the argument --with-mpm=NAME with the configure script. NAME isthe name of the desired MPM.

Once the server has been compiled, it is possible to determine which MPM was chosen by using ./httpd -l. Thiscommand will list every module that is compiled into the server, including the MPM.

MPM Defaults

The following table lists the default MPMs for various operating systems. This will be the MPM selected if you donot make another choice at compile-time.

BeOS BEOS

Netware MPM NETWARE

OS/2 MPMT OS2Unix PREFORK

Windows MPM WINNT

Page 68: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

60 CHAPTER 2. USING THE APACHE HTTP SERVER

2.15 Environment Variables in Apache

The Apache HTTP Server provides a mechanism for storing information in named variables that are called environmentvariables. This information can be used to control various operations such as logging or access control. The variablesare also used as a mechanism to communicate with external programs such as CGI scripts. This document discussesdifferent ways to manipulate and use these variables.

Although these variables are referred to as environment variables, they are not the same as the environment variablescontrolled by the underlying operating system. Instead, these variables are stored and manipulated in an internalApache structure. They only become actual operating system environment variables when they are provided to CGIscripts and Server Side Include scripts. If you wish to manipulate the operating system environment under whichthe server itself runs, you must use the standard environment manipulation mechanisms provided by your operatingsystem shell.

Setting Environment Variables

Related ModulesMOD ENVMOD REWRITEMOD SETENVIFMOD UNIQUE ID

Related DirectivesBROWSERMATCHBROWSERMATCHNOCASEPASSENVREWRITERULESETENVSETENVIFSETENVIFNOCASEUNSETENV

Basic Environment Manipulation

The most basic way to set an environment variable in Apache is using the unconditional SETENV directive. Variablesmay also be passed from the environment of the shell which started the server using the PASSENV directive.

Conditional Per-Request Settings

For additional flexibility, the directives provided by MOD SETENVIF allow environment variables to be set on a per-request basis, conditional on characteristics of particular requests. For example, a variable could be set only whena specific browser (User-Agent) is making a request, or only when a specific Referer [sic] header is found. Evenmore flexibility is available through the MOD REWRITE’s REWRITERULE which uses the [E=...] option to setenvironment variables.

Unique Identifiers

Finally, MOD UNIQUE ID sets the environment variable UNIQUE ID for each request to a value which is guaranteedto be unique across "all" requests under very specific conditions.

Standard CGI Variables

In addition to all environment variables set within the Apache configuration and passed from the shell, CGI scripts andSSI pages are provided with a set of environment variables containing meta-information about the request as required

Page 69: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.15. ENVIRONMENT VARIABLES IN APACHE 61

by the CGI specification16.

Some Caveats

• It is not possible to override or change the standard CGI variables using the environment manipulation directives.

• When suexec is used to launch CGI scripts, the environment will be cleaned down to a set of safe variablesbefore CGI scripts are launched. The list of safe variables is defined at compile-time in suexec.c.

• For portability reasons, the names of environment variables may contain only letters, numbers, and the un-derscore character. In addition, the first character may not be a number. Characters which do not match thisrestriction will be replaced by an underscore when passed to CGI scripts and SSI pages.

• The SETENV directive runs late during request processing meaning that directives such as SETENVIF andREWRITECOND will not see the variables set with it.

Using Environment Variables

Related ModulesMOD ACCESSMOD CGIMOD EXT FILTERMOD HEADERSMOD INCLUDEMOD LOG CONFIGMOD REWRITE

Related DirectivesALLOWCUSTOMLOGDENYEXTFILTERDEFINEHEADERLOGFORMATREWRITECONDREWRITERULE

CGI Scripts

One of the primary uses of environment variables is to communicate information to CGI scripts. As discussed above,the environment passed to CGI scripts includes standard meta-information about the request in addition to any variablesset within the Apache configuration. For more details, see the CGI tutorial (p. 185) .

SSI Pages

Server-parsed (SSI) documents processed by MOD INCLUDE’s INCLUDES filter can print environment variables usingthe echo element, and can use environment variables in flow control elements to makes parts of a page conditional oncharacteristics of a request. Apache also provides SSI pages with the standard CGI environment variables as discussedabove. For more details, see the SSI tutorial (p. 191) .

Access Control

Access to the server can be controlled based on the value of environment variables using the allow from env=and deny from env= directives. In combination with SETENVIF, this allows for flexible control of access to theserver based on characteristics of the client. For example, you can use these directives to deny access to a particularbrowser (User-Agent).

16http://cgi-spec.golux.com/

Page 70: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

62 CHAPTER 2. USING THE APACHE HTTP SERVER

Conditional Logging

Environment variables can be logged in the access log using the LOGFORMAT option %e. In addition, the decision onwhether or not to log requests can be made based on the status of environment variables using the conditional formof the CUSTOMLOG directive. In combination with SETENVIF this allows for flexible control of which requests arelogged. For example, you can choose not to log requests for filenames ending in gif, or you can choose to only logrequests from clients which are outside your subnet.

Conditional Response Headers

The HEADER directive can use the presence or absence of an environment variable to determine whether or not acertain HTTP header will be placed in the response to the client. This allows, for example, a certain response headerto be sent only if a corresponding header is received in the request from the client.

External Filter Activation

External filters configured by MOD EXT FILTER using the EXTFILTERDEFINE directive can by activated conditionalon an environment variable using the disableenv= and enableenv= options.

URL Rewriting

The %{ENV:variable} form of TestString in the REWRITECOND allows MOD REWRITE’s rewrite engine to makedecisions conditional on environment variables. Note that the variables accessible in MOD REWRITE without the ENV:prefix are not actually environment variables. Rather, they are variables special to MOD REWRITE which cannot beaccessed from other modules.

Special Purpose Environment Variables

Interoperability problems have led to the introduction of mechanisms to modify the way Apache behaves when talkingto particular clients. To make these mechanisms as flexible as possible, they are invoked by defining environmentvariables, typically with BROWSERMATCH, though SETENV and PASSENV could also be used, for example.

downgrade-1.0

This forces the request to be treated as a HTTP/1.0 request even if it was in a later dialect.

force-no-vary

This causes any Vary fields to be removed from the response header before it is sent back to the client. Some clientsdon’t interpret this field correctly (see the known client problems (p. 286) page); setting this variable can work aroundthis problem. Setting this variable also implies force-response-1.0.

force-response-1.0

This forces an HTTP/1.0 response to clients making an HTTP/1.0 request. It was originally implemented as a result ofa problem with AOL’s proxies. Some HTTP/1.0 clients may not behave correctly when given an HTTP/1.1 response,and this can be used to interoperate with them.

Page 71: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.15. ENVIRONMENT VARIABLES IN APACHE 63

gzip-only-text/html

When set to a value of "1", this variable disables the DEFLATE output filter provided by MOD DEFLATE for content-types other than text/html.

no-gzip

When set, the DEFLATE filter of MOD DEFLATE will be turned off.

nokeepalive

This disables KEEPALIVE when set.

prefer-language

This influences MOD NEGOTIATION’s behaviour. If it contains a language tag (such as en, ja or x-klingon),MOD NEGOTIATION tries to deliver a variant with that language. If there’s no such variant, the normal negotiation (p.47) process applies.

redirect-carefully

This forces the server to be more careful when sending a redirect to the client. This is typically used when a clienthas a known problem handling redirects. This was originally implemented as a result of a problem with Microsoft’sWebFolders software which has a problem handling redirects on directory resources via DAV methods.

suppress-error-charset

Available in versions after 2.0.54

When Apache issues a redirect in response to a client request, the response includes some actual text to be displayedin case the client can’t (or doesn’t) automatically follow the redirection. Apache ordinarily labels this text accordingto the character set which it uses, which is ISO-8859-1.

However, if the redirection is to a page that uses a different character set, some broken browser versions will try touse the character set from the redirection text rather than the actual page. This can result in Greek, for instance, beingincorrectly rendered.

Setting this environment variable causes Apache to omit the character set for the redirection text, and these brokenbrowsers will then correctly use that of the destination page.

Examples

Changing protocol behavior with misbehaving clients

We recommend that the following lines be included in httpd.conf to deal with known client problems.

Page 72: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

64 CHAPTER 2. USING THE APACHE HTTP SERVER

## The following directives modify normal HTTP response behavior.# The first directive disables keepalive for Netscape 2.x and browsers that# spoof it. There are known problems with these browser implementations.# The second directive is for Microsoft Internet Explorer 4.0b2# which has a broken HTTP/1.1 implementation and does not properly# support keepalive when it is used on 301 or 302 (redirect) responses.#BrowserMatch "Mozilla/2" nokeepaliveBrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0

## The following directive disables HTTP/1.1 responses to browsers which# are in violation of the HTTP/1.0 spec by not being able to grok a# basic 1.1 response.#BrowserMatch "RealPlayer 4\.0" force-response-1.0BrowserMatch "Java/1\.0" force-response-1.0BrowserMatch "JDK/1\.0" force-response-1.0

Do not log requests for images in the access log

This example keeps requests for images from appearing in the access log. It can be easily modified to prevent loggingof particular directories, or to prevent logging of requests coming from particular hosts.

SetEnvIf Request URI \.gif image-requestSetEnvIf Request URI \.jpg image-requestSetEnvIf Request URI \.png image-request

CustomLog logs/access log common env=!image-request

Prevent "Image Theft"

This example shows how to keep people not on your server from using images on your server as inline-images on theirpages. This is not a recommended configuration, but it can work in limited circumstances. We assume that all yourimages are in a directory called /web/images.

SetEnvIf Referer "ˆhttp://www\.example\.com/" local referal# Allow browsers that do not send Referer infoSetEnvIf Referer "ˆ$" local referal<Directory /web/images>

Order Deny,AllowDeny from allAllow from env=local referal

</Directory>

For more information about this technique, see the "Keeping Your Images from Adorning Other Sites17" tutorial onServerWatch.

17http://www.serverwatch.com/tutorials/article.php/1132731

Page 73: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.16. APACHE’S HANDLER USE 65

2.16 Apache’s Handler Use

This document describes the use of Apache’s Handlers.

What is a Handler

Related ModulesMOD ACTIONSMOD ASISMOD CGIMOD IMAPMOD INFOMOD MIMEMOD NEGOTIATIONMOD STATUS

Related DirectivesACTIONADDHANDLERREMOVEHANDLERSETHANDLER

A "handler" is an internal Apache representation of the action to be performed when a file is called. Generally, fileshave implicit handlers, based on the file type. Normally, all files are simply served by the server, but certain file typesare "handled" separately.

Apache 1.1 adds the ability to use handlers explicitly. Based on either filename extensions or on location, handlers canbe specified without relation to file type. This is advantageous both because it is a more elegant solution, and becauseit also allows for both a type and a handler to be associated with a file. (See also Files with Multiple Extensions (p.483) .)

Handlers can either be built into the server or included in a module, or they can be added with the ACTION directive.The built-in handlers in the standard distribution are as follows:

• default-handler: Send the file using the default handler(), which is the handler used by default to handlestatic content. (core)

• send-as-is: Send file with HTTP headers as is. (MOD ASIS)

• cgi-script: Treat the file as a CGI script. (MOD CGI)

• imap-file: Parse as an imagemap rule file. (MOD IMAP)

• server-info: Get the server’s configuration information. (MOD INFO)

• server-status: Get the server’s status report. (MOD STATUS)

• type-map: Parse as a type map file for content negotiation. (MOD NEGOTIATION)

Examples

Modifying static content using a CGI script

The following directives will cause requests for files with the html extension to trigger the launch of the footer.plCGI script.

Action add-footer /cgi-bin/footer.pl

AddHandler add-footer .html

Then the CGI script is responsible for sending the originally requested document (pointed to by thePATH TRANSLATED environment variable) and making whatever modifications or additions are desired.

Page 74: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

66 CHAPTER 2. USING THE APACHE HTTP SERVER

Files with HTTP headers

The following directives will enable the send-as-is handler, which is used for files which contain their own HTTPheaders. All files in the /web/htdocs/asis/ directory will be processed by the send-as-is handler, regardlessof their filename extensions.

<Directory /web/htdocs/asis>SetHandler send-as-is

</Directory>

Programmer’s Note

In order to implement the handler features, an addition has been made to the Apache API (p. 621) that you may wishto make use of. Specifically, a new record has been added to the request rec structure:

char *handler

If you wish to have your module engage a handler, you need only to set r->handler to the name of the handler atany time prior to the invoke handler stage of the request. Handlers are implemented as they were before, albeitusing the handler name instead of a content type. While it is not necessary, the naming convention for handlers is touse a dash-separated word, with no slashes, so as to not invade the media type name-space.

Page 75: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.17. FILTERS 67

2.17 Filters

This document describes the use of filters in Apache.

Filters

Related ModulesMOD DEFLATEMOD EXT FILTERMOD INCLUDE

Related DirectivesADDINPUTFILTERADDOUTPUTFILTERREMOVEINPUTFILTERREMOVEOUTPUTFILTEREXTFILTERDEFINEEXTFILTEROPTIONSSETINPUTFILTERSETOUTPUTFILTER

A filter is a process that is applied to data that is sent or received by the server. Data sent by clients to the server isprocessed by input filters while data sent by the server to the client is processed by output filters. Multiple filters canbe applied to the data, and the order of the filters can be explicitly specified.

Filters are used internally by Apache to perform functions such as chunking and byte-range request handling. In addi-tion, modules can provide filters that are selectable using run-time configuration directives. The set of filters that applyto data can be manipulated with the SETINPUTFILTER, SETOUTPUTFILTER, ADDINPUTFILTER, ADDOUTPUTFIL-TER, REMOVEINPUTFILTER, and REMOVEOUTPUTFILTER directives.

The following user-selectable filters are currently provided with the Apache HTTP Server distribution.

INCLUDES Server-Side Includes processing by MOD INCLUDE

DEFLATE Compress output before sending it to the client using MOD DEFLATE

In addition, the module MOD EXT FILTER allows for external programs to be defined as filters.

Page 76: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

68 CHAPTER 2. USING THE APACHE HTTP SERVER

2.18 suEXEC Support

The suEXEC feature provides Apache users the ability to run CGI and SSI programs under user IDs different fromthe user ID of the calling web server. Normally, when a CGI or SSI program executes, it runs as the same user who isrunning the web server.

Used properly, this feature can reduce considerably the security risks involved with allowing users to develop and runprivate CGI or SSI programs. However, if suEXEC is improperly configured, it can cause any number of problemsand possibly create new holes in your computer’s security. If you aren’t familiar with managing setuid root programsand the security issues they present, we highly recommend that you not consider using suEXEC.

Before we begin

Before jumping head-first into this document, you should be aware of the assumptions made on the part of the ApacheGroup and this document.

First, it is assumed that you are using a UNIX derivative operating system that is capable of setuid and setgid oper-ations. All command examples are given in this regard. Other platforms, if they are capable of supporting suEXEC,may differ in their configuration.

Second, it is assumed you are familiar with some basic concepts of your computer’s security and its administration.This involves an understanding of setuid/setgid operations and the various effects they may have on your system andits level of security.

Third, it is assumed that you are using an unmodified version of suEXEC code. All code for suEXEC has beencarefully scrutinized and tested by the developers as well as numerous beta testers. Every precaution has been takento ensure a simple yet solidly safe base of code. Altering this code can cause unexpected problems and new securityrisks. It is highly recommended you not alter the suEXEC code unless you are well versed in the particulars of securityprogramming and are willing to share your work with the Apache Group for consideration.

Fourth, and last, it has been the decision of the Apache Group to NOT make suEXEC part of the default installationof Apache. To this end, suEXEC configuration requires of the administrator careful attention to details. After dueconsideration has been given to the various settings for suEXEC, the administrator may install suEXEC through normalinstallation methods. The values for these settings need to be carefully determined and specified by the administratorto properly maintain system security during the use of suEXEC functionality. It is through this detailed process thatthe Apache Group hopes to limit suEXEC installation only to those who are careful and determined enough to use it.

Still with us? Yes? Good. Let’s move on!

suEXEC Security Model

Before we begin configuring and installing suEXEC, we will first discuss the security model you are about to imple-ment. By doing so, you may better understand what exactly is going on inside suEXEC and what precautions are takento ensure your system’s security.

suEXEC is based on a setuid "wrapper" program that is called by the main Apache web server. This wrapper is calledwhen an HTTP request is made for a CGI or SSI program that the administrator has designated to run as a userid otherthan that of the main server. When such a request is made, Apache provides the suEXEC wrapper with the program’sname and the user and group IDs under which the program is to execute.

The wrapper then employs the following process to determine success or failure – if any one of these conditions fail,the program logs the failure and exits with an error, otherwise it will continue:

1. Is the user executing this wrapper a valid user of this system?

This is to ensure that the user executing the wrapper is truly a user of the system.

Page 77: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.18. SUEXEC SUPPORT 69

2. Was the wrapper called with the proper number of arguments?

The wrapper will only execute if it is given the proper number of arguments. The proper argument format isknown to the Apache web server. If the wrapper is not receiving the proper number of arguments, it is eitherbeing hacked, or there is something wrong with the suEXEC portion of your Apache binary.

3. Is this valid user allowed to run the wrapper?

Is this user the user allowed to run this wrapper? Only one user (the Apache user) is allowed to execute thisprogram.

4. Does the target CGI or SSI program have an unsafe hierarchical reference?

Does the target CGI or SSI program’s path contain a leading ’/’ or have a ’..’ backreference?These are not allowed; the target CGI/SSI program must reside within suEXEC’s document root (see--with-suexec-docroot=DIR below).

5. Is the target user name valid?

Does the target user exist?

6. Is the target group name valid?

Does the target group exist?

7. Is the target user NOT superuser?

Presently, suEXEC does not allow root to execute CGI/SSI programs.

8. Is the target userid ABOVE the minimum ID number?

The minimum user ID number is specified during configuration. This allows you to set the lowest possibleuserid that will be allowed to execute CGI/SSI programs. This is useful to block out "system" accounts.

9. Is the target group NOT the superuser group?

Presently, suEXEC does not allow the root group to execute CGI/SSI programs.

10. Is the target groupid ABOVE the minimum ID number?

The minimum group ID number is specified during configuration. This allows you to set the lowest possiblegroupid that will be allowed to execute CGI/SSI programs. This is useful to block out "system" groups.

11. Can the wrapper successfully become the target user and group?

Here is where the program becomes the target user and group via setuid and setgid calls. The group access listis also initialized with all of the groups of which the user is a member.

12. Can we change directory to the one in which the target CGI/SSI program resides?

If it doesn’t exist, it can’t very well contain files. If we can’t change directory to it, it might aswell not exist.

13. Is the directory within the Apache webspace?

If the request is for a regular portion of the server, is the requested directory within suEXEC’s document root?If the request is for a USERDIR, is the requested directory within the directory configured as suEXEC’s userdir(see suEXEC’s configuration options)?

14. Is the directory NOT writable by anyone else?

We don’t want to open up the directory to others; only the owner user may be able to alter this directoriescontents.

15. Does the target CGI/SSI program exist?

If it doesn’t exists, it can’t very well be executed.

Page 78: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

70 CHAPTER 2. USING THE APACHE HTTP SERVER

16. Is the target CGI/SSI program NOT writable by anyone else?We don’t want to give anyone other than the owner the ability to change the CGI/SSI program.

17. Is the target CGI/SSI program NOT setuid or setgid?We do not want to execute programs that will then change our UID/GID again.

18. Is the target user/group the same as the program’s user/group?Is the user the owner of the file?

19. Can we successfully clean the process environment to ensure safe operations?suEXEC cleans the process’ environment by establishing a safe execution PATH (defined during configuration),as well as only passing through those variables whose names are listed in the safe environment list (also createdduring configuration).

20. Can we successfully become the target CGI/SSI program and execute?Here is where suEXEC ends and the target CGI/SSI program begins.

This is the standard operation of the suEXEC wrapper’s security model. It is somewhat stringent and can impose newlimitations and guidelines for CGI/SSI design, but it was developed carefully step-by-step with security in mind.

For more information as to how this security model can limit your possibilities in regards to server configuration, aswell as what security risks can be avoided with a proper suEXEC setup, see the "Beware the Jabberwock" section ofthis document.

Configuring & Installing suEXEC

Here’s where we begin the fun.

suEXEC configuration options

--enable-suexec This option enables the suEXEC feature which is never installed or activated by default. Atleast one --with-suexec-xxxxx option has to be provided together with the --enable-suexec optionto let APACI accept your request for using the suEXEC feature.

--with-suexec-bin=PATH The path to the suexec binary must be hard-coded in the server for security rea-sons. Use this option to override the default path. e.g. --with-suexec-bin=/usr/bin/suexec

--with-suexec-caller=UID The username (p. 592) under which Apache normally runs. This is the only userallowed to execute this program.

--with-suexec-userdir=DIR Define to be the subdirectory under users’ home directories where suEXECaccess should be allowed. All executables under this directory will be executable by suEXEC as the user so theyshould be "safe" programs. If you are using a "simple" USERDIR directive (ie. one without a "*" in it) thisshould be set to the same value. suEXEC will not work properly in cases where the USERDIR directive pointsto a location that is not the same as the user’s home directory as referenced in the passwd file. Default value is"public html".If you have virtual hosts with a different USERDIR for each, you will need to define them to all reside in oneparent directory; then name that parent directory here. If this is not defined properly, "˜userdir" cgi requestswill not work!

--with-suexec-docroot=DIR Define as the DocumentRoot set for Apache. This will be the only hierarchy(aside from USERDIRs) that can be used for suEXEC behavior. The default directory is the --datadirvalue with the suffix "/htdocs", e.g. if you configure with "--datadir=/home/apache" the directory"/home/apache/htdocs" is used as document root for the suEXEC wrapper.

Page 79: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.18. SUEXEC SUPPORT 71

--with-suexec-uidmin=UID Define this as the lowest UID allowed to be a target user for suEXEC. For mostsystems, 500 or 100 is common. Default value is 100.

--with-suexec-gidmin=GID Define this as the lowest GID allowed to be a target group for suEXEC. For mostsystems, 100 is common and therefore used as default value.

--with-suexec-logfile=FILE This defines the filename to which all suEXEC transactions and errors arelogged (useful for auditing and debugging purposes). By default the logfile is named "suexec log" andlocated in your standard logfile directory (--logfiledir).

--with-suexec-safepath=PATH Define a safe PATH environment to pass to CGI executables. Default valueis "/usr/local/bin:/usr/bin:/bin".

Compiling and installing the suEXEC wrapper

If you have enabled the suEXEC feature with the --enable-suexec option the suexec binary (together withApache itself) is automatically built if you execute the make command.

After all components have been built you can execute the command make install to install them. The bi-nary image suexec is installed in the directory defined by the --sbindir option. The default location is"/usr/local/apache2/bin/suexec".

Please note that you need root privileges for the installation step. In order for the wrapper to set the user ID, it mustbe installed as owner root and must have the setuserid execution bit set for file modes.

Setting paranoid permissions

Although the suEXEC wrapper will check to ensure that its caller is the correct user as specified with the--with-suexec-caller configure option, there is always the possibility that a system or library call suEXECuses before this check may be exploitable on your system. To counter this, and because it is best-practise in general,you should use filesystem permissions to ensure that only the group Apache runs as may execute suEXEC.

If for example, your web server is configured to run as:

User www

Group webgroup

and suexec is installed at "/usr/local/apache2/bin/suexec", you should run:

chgrp webgroup /usr/local/apache2/bin/suexec

chmod 4750 /usr/local/apache2/bin/suexec

This will ensure that only the group Apache runs as can even execute the suEXEC wrapper.

Enabling & Disabling suEXEC

Upon startup of Apache, it looks for the file suexec in the directory defined by the --sbindir option (default is"/usr/local/apache/bin/suexec"). If Apache finds a properly configured suEXEC wrapper, it will print the followingmessage to the error log:

[notice] suEXEC mechanism enabled (wrapper: /path/to/suexec)

Page 80: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

72 CHAPTER 2. USING THE APACHE HTTP SERVER

If you don’t see this message at server startup, the server is most likely not finding the wrapper program where itexpects it, or the executable is not installed setuid root.

If you want to enable the suEXEC mechanism for the first time and an Apache server is already running you must killand restart Apache. Restarting it with a simple HUP or USR1 signal will not be enough.

If you want to disable suEXEC you should kill and restart Apache after you have removed the suexec file.

Using suEXEC

Requests for CGI programs will call the suEXEC wrapper only if they are for a virtual host containing a SUEXE-CUSERGROUP directive or if they are processed by MOD USERDIR.

Virtual Hosts:One way to use the suEXEC wrapper is through the SUEXECUSERGROUP directive in VIRTUALHOST definitions. Bysetting this directive to values different from the main server user ID, all requests for CGI resources will be executedas the User and Group defined for that <VIRTUALHOST>. If this directive is not specified for a <VIRTUALHOST>then the main server userid is assumed.

User directories:Requests that are processed by MOD USERDIR will call the suEXEC wrapper to execute CGI programs under theuserid of the requested user directory. The only requirement needed for this feature to work is for CGI executionto be enabled for the user and that the script must meet the scrutiny of the security checks above. See also the--with-suexec-userdir compile time option.

Debugging suEXEC

The suEXEC wrapper will write log information to the file defined with the --with-suexec-logfile option asindicated above. If you feel you have configured and installed the wrapper properly, have a look at this log and theerror log for the server to see where you may have gone astray.

Beware the Jabberwock: Warnings & Examples

NOTE! This section may not be complete. For the latest revision of this section of the documentation, see the ApacheGroup’s Online Documentation18 version.

There are a few points of interest regarding the wrapper that can cause limitations on server setup. Please review thesebefore submitting any "bugs" regarding suEXEC.

• suEXEC Points Of Interest

• Hierarchy limitations

For security and efficiency reasons, all suEXEC requests must remain within either a top-level document rootfor virtual host requests, or one top-level personal document root for userdir requests. For example, if you havefour VirtualHosts configured, you would need to structure all of your VHosts’ document roots off of one mainApache document hierarchy to take advantage of suEXEC for VirtualHosts. (Example forthcoming.)

• suEXEC’s PATH environment variable

This can be a dangerous thing to change. Make certain every path you include in this define is a trusteddirectory. You don’t want to open people up to having someone from across the world running a trojan horse onthem.

18http://httpd.apache.org/docs/2.0/suexec.html

Page 81: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.18. SUEXEC SUPPORT 73

• Altering the suEXEC code

Again, this can cause Big Trouble if you try this without knowing what you are doing. Stay away from it if atall possible.

Page 82: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

74 CHAPTER 2. USING THE APACHE HTTP SERVER

2.19 Apache Performance Tuning

Apache 2.x is a general-purpose webserver, designed to provide a balance of flexibility, portability, and performance.Although it has not been designed specifically to set benchmark records, Apache 2.x is capable of high performancein many real-world situations.

Compared to Apache 1.3, release 2.x contains many additional optimizations to increase throughput and scalability.Most of these improvements are enabled by default. However, there are compile-time and run-time configurationchoices that can significantly affect performance. This document describes the options that a server administratorcan configure to tune the performance of an Apache 2.x installation. Some of these configuration options enable thehttpd to better take advantage of the capabilities of the hardware and OS, while others allow the administrator to tradefunctionality for speed.

Hardware and Operating System Issues

The single biggest hardware issue affecting webserver performance is RAM. A webserver should never ever have toswap, as swapping increases the latency of each request beyond a point that users consider "fast enough". This causesusers to hit stop and reload, further increasing the load. You can, and should, control the MAXCLIENTS setting so thatyour server does not spawn so many children it starts swapping. This procedure for doing this is simple: determinethe size of your average Apache process, by looking at your process list via a tool such as top, and divide this intoyour total available memory, leaving some room for other processes.

Beyond that the rest is mundane: get a fast enough CPU, a fast enough network card, and fast enough disks, where"fast enough" is something that needs to be determined by experimentation.

Operating system choice is largely a matter of local concerns. But some guidelines that have proven generally usefulare:

• Run the latest stable release and patchlevel of the operating system that you choose. Many OS suppliers haveintroduced significant performance improvements to their TCP stacks and thread libraries in recent years.

• If your OS supports a sendfile(2) system call, make sure you install the release and/or patches needed toenable it. (With Linux, for example, this means using Linux 2.4 or later. For early releases of Solaris 8, you mayneed to apply a patch.) On systems where it is available, sendfile enables Apache 2 to deliver static contentfaster and with lower CPU utilization.

Run-Time Configuration Issues

Related ModulesMOD DIRMPM COMMONMOD STATUS

Related DirectivesALLOWOVERRIDEDIRECTORYINDEXHOSTNAMELOOKUPSENABLEMMAPENABLESENDFILEKEEPALIVETIMEOUTMAXSPARESERVERSMINSPARESERVERSOPTIONSSTARTSERVERS

Page 83: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.19. APACHE PERFORMANCE TUNING 75

HostnameLookups and other DNS considerations

Prior to Apache 1.3, HOSTNAMELOOKUPS defaulted to On. This adds latency to every request because it requires aDNS lookup to complete before the request is finished. In Apache 1.3 this setting defaults to Off. If you need to haveaddresses in your log files resolved to hostnames, use the logresolve program that comes with Apache, or one ofthe numerous log reporting packages which are available.

It is recommended that you do this sort of postprocessing of your log files on some machine other than the productionweb server machine, in order that this activity not adversely affect server performance.

If you use any ALLOW from domain or DENY from domain directives (i.e., using a hostname, or a domainname, rather than an IP address) then you will pay for two DNS lookups (a reverse, followed by a forward lookup tomake sure that the reverse is not being spoofed). For best performance, therefore, use IP addresses, rather than names,when using these directives, if possible.

Note that it’s possible to scope the directives, such as within a <Location /server-status> section. In thiscase the DNS lookups are only performed on requests matching the criteria. Here’s an example which disables lookupsexcept for .html and .cgi files:

HostnameLookups off<Files ˜ "\.(html|cgi)$">

HostnameLookups on

</Files>

But even still, if you just need DNS names in some CGIs you could consider doing the gethostbyname call in thespecific CGIs that need it.

FollowSymLinks and SymLinksIfOwnerMatch

Wherever in your URL-space you do not have an Options FollowSymLinks, or you do have an OptionsSymLinksIfOwnerMatch Apache will have to issue extra system calls to check up on symlinks. One extra callper filename component. For example, if you had:

DocumentRoot /www/htdocs<Directory />

Options SymLinksIfOwnerMatch

</Directory>

and a request is made for the URI /index.html. Then Apache will perform lstat(2) on /www, /www/htdocs,and /www/htdocs/index.html. The results of these lstats are never cached, so they will occur on everysingle request. If you really desire the symlinks security checking you can do something like this:

DocumentRoot /www/htdocs<Directory />

Options FollowSymLinks

</Directory>

<Directory /www/htdocs>

Options -FollowSymLinks +SymLinksIfOwnerMatch

</Directory>

This at least avoids the extra checks for the DOCUMENTROOT path. Note that you’ll need to add similar sectionsif you have any ALIAS or REWRITERULE paths outside of your document root. For highest performance, and nosymlink protection, set FollowSymLinks everywhere, and never set SymLinksIfOwnerMatch.

Page 84: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

76 CHAPTER 2. USING THE APACHE HTTP SERVER

AllowOverride

Wherever in your URL-space you allow overrides (typically .htaccess files) Apache will attempt to open.htaccess for each filename component. For example,

DocumentRoot /www/htdocs<Directory />

AllowOverride all

</Directory>

and a request is made for the URI /index.html. Then Apache will attempt to open /.htaccess,/www/.htaccess, and /www/htdocs/.htaccess. The solutions are similar to the previous case of OptionsFollowSymLinks. For highest performance use AllowOverride None everywhere in your filesystem.

Negotiation

If at all possible, avoid content-negotiation if you’re really interested in every last ounce of performance. In practicethe benefits of negotiation outweigh the performance penalties. There’s one case where you can speed up the server.Instead of using a wildcard such as:

DirectoryIndex index

Use a complete list of options:

DirectoryIndex index.cgi index.pl index.shtml index.html

where you list the most common choice first.

Also note that explicitly creating a type-map file provides better performance than using MultiViews, as thenecessary information can be determined by reading this single file, rather than having to scan the directory for files.

If your site needs content negotiation consider using type-map files, rather than the Options MultiViewsdirective to accomplish the negotiation. See the Content Negotiation (p. 47) documentation for a full discussion of themethods of negotiation, and instructions for creating type-map files.

Memory-mapping

In situations where Apache 2.x needs to look at the contents of a file being delivered–for example, when doing server-side-include processing–it normally memory-maps the file if the OS supports some form of mmap(2).

On some platforms, this memory-mapping improves performance. However, there are cases where memory-mappingcan hurt the performance or even the stability of the httpd:

• On some operating systems, mmap does not scale as well as read(2) when the number of CPUs increases.On multiprocessor Solaris servers, for example, Apache 2.x sometimes delivers server-parsed files faster whenmmap is disabled.

• If you memory-map a file located on an NFS-mounted filesystem and a process on another NFS client machinedeletes or truncates the file, your process may get a bus error the next time it tries to access the mapped filecontent.

For installations where either of these factors applies, you should use EnableMMAP off to disable the memory-mapping of delivered files. (Note: This directive can be overridden on a per-directory basis.)

Page 85: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.19. APACHE PERFORMANCE TUNING 77

Sendfile

In situations where Apache 2.x can ignore the contents of the file to be delivered – for example, when serving staticfile content – it normally uses the kernel sendfile support the file if the OS supports the sendfile(2) operation.

On most platforms, using sendfile improves performance by eliminating separate read and send mechanics. However,there are cases where using sendfile can harm the stability of the httpd:

• Some platforms may have broken sendfile support that the build system did not detect, especially if the binarieswere built on another box and moved to such a machine with broken sendfile support.

• With an NFS-mounted files, the kernel may be unable to reliably serve the network file through it’s own cache.

For installations where either of these factors applies, you should use EnableSendfile off to disable sendfiledelivery of file contents. (Note: This directive can be overridden on a per-directory basis.)

Process Creation

Prior to Apache 1.3 the MINSPARESERVERS, MAXSPARESERVERS, and STARTSERVERS settings all had drasticeffects on benchmark results. In particular, Apache required a "ramp-up" period in order to reach a number ofchildren sufficient to serve the load being applied. After the initial spawning of STARTSERVERS children, only onechild per second would be created to satisfy the MINSPARESERVERS setting. So a server being accessed by 100simultaneous clients, using the default STARTSERVERS of 5 would take on the order 95 seconds to spawn enoughchildren to handle the load. This works fine in practice on real-life servers, because they aren’t restarted frequently.But does really poorly on benchmarks which might only run for ten minutes.

The one-per-second rule was implemented in an effort to avoid swamping the machine with the startup of new children.If the machine is busy spawning children it can’t service requests. But it has such a drastic effect on the perceivedperformance of Apache that it had to be replaced. As of Apache 1.3, the code will relax the one-per-second rule. Itwill spawn one, wait a second, then spawn two, wait a second, then spawn four, and it will continue exponentiallyuntil it is spawning 32 children per second. It will stop whenever it satisfies the MINSPARESERVERS setting.

This appears to be responsive enough that it’s almost unnecessary to twiddle the MINSPARESERVERS, MAXSPARE-SERVERS and STARTSERVERS knobs. When more than 4 children are spawned per second, a message will be emittedto the ERRORLOG. If you see a lot of these errors then consider tuning these settings. Use the MOD STATUS output asa guide.

Related to process creation is process death induced by the MAXREQUESTSPERCHILD setting. By default this is 0,which means that there is no limit to the number of requests handled per child. If your configuration currently has thisset to some very low number, such as 30, you may want to bump this up significantly. If you are running SunOS oran old version of Solaris, limit this to 10000 or so because of memory leaks.

When keep-alives are in use, children will be kept busy doing nothing waiting for more requests on the already openconnection. The default KEEPALIVETIMEOUT of 15 seconds attempts to minimize this effect. The tradeoff here isbetween network bandwidth and server resources. In no event should you raise this above about 60 seconds, as mostof the benefits are lost19.

Compile-Time Configuration Issues

Choosing an MPM

Apache 2.x supports pluggable concurrency models, called Multi-Processing Modules (p. 59) (MPMs). When build-ing Apache, you must choose an MPM to use. There are platform-specific MPMs for some platforms: BEOS,

19http://www.research.digital.com/wrl/techreports/abstracts/95.4.html

Page 86: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

78 CHAPTER 2. USING THE APACHE HTTP SERVER

MPM NETWARE, MPMT OS2, and MPM WINNT. For general Unix-type systems, there are several MPMs from whichto choose. The choice of MPM can affect the speed and scalability of the httpd:

• The WORKER MPM uses multiple child processes with many threads each. Each thread handles one connectionat a time. Worker generally is a good choice for high-traffic servers because it has a smaller memory footprintthan the prefork MPM.

• The PREFORK MPM uses multiple child processes with one thread each. Each process handles one connectionat a time. On many systems, prefork is comparable in speed to worker, but it uses more memory. Prefork’sthreadless design has advantages over worker in some situations: it can be used with non-thread-safe third-partymodules, and it is easier to debug on platforms with poor thread debugging support.

For more information on these and other MPMs, please see the MPM documentation (p. 59) .

Modules

Since memory usage is such an important consideration in performance, you should attempt to eliminate modules thatyou are not actually using. If you have built the modules as DSOs (p. 44) , eliminating modules is a simple matterof commenting out the associated LOADMODULE directive for that module. This allows you to experiment withremoving modules, and seeing if your site still functions in their absense.

If, on the other hand, you have modules statically linked into your Apache binary, you will need to recompile Apachein order to remove unwanted modules.

An associated question that arises here is, of course, what modules you need, and which ones you don’t. The answerhere will, of course, vary from one web site to another. However, the minimal list of modules which you can get bywith tends to include MOD MIME, MOD DIR, and MOD LOG CONFIG. mod log config is, of course, optional, asyou can run a web site without log files. This is, however, not recommended.

Atomic Operations

Some modules, such as MOD CACHE and recent development builds of the worker MPM, use APR’s atomic API. ThisAPI provides atomic operations that can be used for lightweight thread synchronization.

By default, APR implements these operations using the most efficient mechanism available on each target OS/CPUplatform. Many modern CPUs, for example, have an instruction that does an atomic compare-and-swap (CAS) opera-tion in hardware. On some platforms, however, APR defaults to a slower, mutex-based implementation of the atomicAPI in order to ensure compatibility with older CPU models that lack such instructions. If you are building Apachefor one of these platforms, and you plan to run only on newer CPUs, you can select a faster atomic implementation atbuild time by configuring Apache with the --enable-nonportable-atomics option:

./buildconf

./configure --with-mpm=worker --enable-nonportable-atomics=yes

The --enable-nonportable-atomics option is relevant for the following platforms:

• Solaris on SPARCBy default, APR uses mutex-based atomics on Solaris/SPARC. If you configure with--enable-nonportable-atomics, however, APR generates code that uses a SPARC v8plusopcode for fast hardware compare-and-swap. If you configure Apache with this option, the atomic operationswill be more efficient (allowing for lower CPU utilization and higher concurrency), but the resulting executablewill run only on UltraSPARC chips.

Page 87: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.19. APACHE PERFORMANCE TUNING 79

• Linux on x86By default, APR uses mutex-based atomics on Linux. If you configure with--enable-nonportable-atomics, however, APR generates code that uses a 486 opcode forfast hardware compare-and-swap. This will result in more efficient atomic operations, but the resultingexecutable will run only on 486 and later chips (and not on 386).

mod status and ExtendedStatus On

If you include MOD STATUS and you also set ExtendedStatus On when building and running Apache, then onevery request Apache will perform two calls to gettimeofday(2) (or times(2) depending on your operatingsystem), and (pre-1.3) several extra calls to time(2). This is all done so that the status report contains timingindications. For highest performance, set ExtendedStatus off (which is the default).

accept Serialization - multiple sockets

! Warning:This section has not been fully updated to take into account changes made in the 2.x version ofthe Apache HTTP Server. Some of the information may still be relevant, but please use it withcare.

This discusses a shortcoming in the Unix socket API. Suppose your web server uses multiple LISTEN statementsto listen on either multiple ports or multiple addresses. In order to test each socket to see if a connection is readyApache uses select(2). select(2) indicates that a socket has zero or at least one connection waiting on it.Apache’s model includes multiple children, and all the idle ones test for new connections at the same time. A naiveimplementation looks something like this (these examples do not match the code, they’re contrived for pedagogicalpurposes):

for (;;) {for (;;) {

fd set accept fds;

FD ZERO (&accept fds);for (i = first socket; i <= last socket; ++i) {

FD SET (i, &accept fds);

}rc = select (last socket+1, &accept fds, NULL, NULL, NULL);if (rc < 1) continue;new connection = -1;for (i = first socket; i <= last socket; ++i) {

if (FD ISSET (i, &accept fds)) {new connection = accept (i, NULL, NULL);if (new connection != -1) break;

}}if (new connection != -1) break;

}process the new connection;

}

But this naive implementation has a serious starvation problem. Recall that multiple children execute this loop at thesame time, and so multiple children will block at select when they are in between requests. All those blocked

Page 88: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

80 CHAPTER 2. USING THE APACHE HTTP SERVER

children will awaken and return from select when a single request appears on any socket (the number of childrenwhich awaken varies depending on the operating system and timing issues). They will all then fall down into the loopand try to accept the connection. But only one will succeed (assuming there’s still only one connection ready), therest will be blocked in accept. This effectively locks those children into serving requests from that one socket andno other sockets, and they’ll be stuck there until enough new requests appear on that socket to wake them all up. Thisstarvation problem was first documented in PR#46720. There are at least two solutions.

One solution is to make the sockets non-blocking. In this case the accept won’t block the children, and they willbe allowed to continue immediately. But this wastes CPU time. Suppose you have ten idle children in select, andone connection arrives. Then nine of those children will wake up, try to accept the connection, fail, and loop backinto select, accomplishing nothing. Meanwhile none of those children are servicing requests that occurred on othersockets until they get back up to the select again. Overall this solution does not seem very fruitful unless you haveas many idle CPUs (in a multiprocessor box) as you have idle children, not a very likely situation.

Another solution, the one used by Apache, is to serialize entry into the inner loop. The loop looks like this (differenceshighlighted):

for (;;) {accept mutex on ();for (;;) {

fd set accept fds;

FD ZERO (&accept fds);for (i = first socket; i <= last socket; ++i) {

FD SET (i, &accept fds);

}rc = select (last socket+1, &accept fds, NULL, NULL, NULL);if (rc < 1) continue;new connection = -1;for (i = first socket; i <= last socket; ++i) {

if (FD ISSET (i, &accept fds)) {new connection = accept (i, NULL, NULL);if (new connection != -1) break;

}}if (new connection != -1) break;

}accept mutex off ();process the new connection;

}

The functions accept mutex on and accept mutex off implement a mutual exclusion semaphore. Only onechild can have the mutex at any time. There are several choices for implementing these mutexes. The choice is definedin src/conf.h (pre-1.3) or src/include/ap config.h (1.3 or later). Some architectures do not have anylocking choice made, on these architectures it is unsafe to use multiple LISTEN directives.

The directive ACCEPTMUTEX can be used to change the selected mutex implementation at run-time.

AcceptMutex flock This method uses the flock(2) system call to lock a lock file (located by the LOCKFILEdirective).

AcceptMutex fcntl This method uses the fcntl(2) system call to lock a lock file (located by the LOCKFILEdirective).

20http://bugs.apache.org/index/full/467

Page 89: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.19. APACHE PERFORMANCE TUNING 81

AcceptMutex sysvsem (1.3 or later) This method uses SysV-style semaphores to implement the mutex. Unfor-tunately SysV-style semaphores have some bad side-effects. One is that it’s possible Apache will die withoutcleaning up the semaphore (see the ipcs(8) man page). The other is that the semaphore API allows for adenial of service attack by any CGIs running under the same uid as the webserver (i.e., all CGIs, unless youuse something like suexec or cgiwrapper). For these reasons this method is not used on any architectureexcept IRIX (where the previous two are prohibitively expensive on most IRIX boxes).

AcceptMutex pthread (1.3 or later) This method uses POSIX mutexes and should work on any architectureimplementing the full POSIX threads specification, however appears to only work on Solaris (2.5 or later), andeven then only in certain configurations. If you experiment with this you should watch out for your serverhanging and not responding. Static content only servers may work just fine.

AcceptMutex posixsem (2.0 or later) This method uses POSIX semaphores. The semaphore ownership is notrecovered if a thread in the process holding the mutex segfaults, resulting in a hang of the web server.

If your system has another method of serialization which isn’t in the above list then it may be worthwhile adding codefor it to APR.

Another solution that has been considered but never implemented is to partially serialize the loop – that is, let in acertain number of processes. This would only be of interest on multiprocessor boxes where it’s possible multiplechildren could run simultaneously, and the serialization actually doesn’t take advantage of the full bandwidth. This isa possible area of future investigation, but priority remains low because highly parallel web servers are not the norm.

Ideally you should run servers without multiple LISTEN statements if you want the highest performance. But read on.

accept Serialization - single socket

The above is fine and dandy for multiple socket servers, but what about single socket servers? In theory they shouldn’texperience any of these same problems because all children can just block in accept(2) until a connection arrives,and no starvation results. In practice this hides almost the same "spinning" behaviour discussed above in the non-blocking solution. The way that most TCP stacks are implemented, the kernel actually wakes up all processes blockedin accept when a single connection arrives. One of those processes gets the connection and returns to user-space,the rest spin in the kernel and go back to sleep when they discover there’s no connection for them. This spinning ishidden from the user-land code, but it’s there nonetheless. This can result in the same load-spiking wasteful behaviourthat a non-blocking solution to the multiple sockets case can.

For this reason we have found that many architectures behave more "nicely" if we serialize even the single socketcase. So this is actually the default in almost all cases. Crude experiments under Linux (2.0.30 on a dual Pentiumpro 166 w/128Mb RAM) have shown that the serialization of the single socket case causes less than a 3% decrease inrequests per second over unserialized single-socket. But unserialized single-socket showed an extra 100ms latency oneach request. This latency is probably a wash on long haul lines, and only an issue on LANs. If you want to overridethe single socket serialization you can define SINGLE LISTEN UNSERIALIZED ACCEPT and then single-socketservers will not serialize at all.

Lingering Close

As discussed in draft-ietf-http-connection-00.txt21 section 8, in order for an HTTP server to reliably implement theprotocol it needs to shutdown each direction of the communication independently (recall that a TCP connection isbi-directional, each half is independent of the other). This fact is often overlooked by other servers, but is correctlyimplemented in Apache as of 1.2.

When this feature was added to Apache it caused a flurry of problems on various versions of Unix because of ashortsightedness. The TCP specification does not state that the FIN WAIT 2 state has a timeout, but it doesn’t prohibit

21http://www.ics.uci.edu/pub/ietf/http/draft-ietf-http-connection-00.txt

Page 90: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

82 CHAPTER 2. USING THE APACHE HTTP SERVER

it. On systems without the timeout, Apache 1.2 induces many sockets stuck forever in the FIN WAIT 2 state. In manycases this can be avoided by simply upgrading to the latest TCP/IP patches supplied by the vendor. In cases where thevendor has never released patches (i.e., SunOS4 – although folks with a source license can patch it themselves) wehave decided to disable this feature.

There are two ways of accomplishing this. One is the socket option SO LINGER. But as fate would have it, this hasnever been implemented properly in most TCP/IP stacks. Even on those stacks with a proper implementation (i.e.,Linux 2.0.31) this method proves to be more expensive (cputime) than the next solution.

For the most part, Apache implements this in a function called lingering close (in http main.c). The func-tion looks roughly like this:

void lingering close (int s){

char junk buffer[2048];

/* shutdown the sending side */shutdown (s, 1);

signal (SIGALRM, lingering death);alarm (30);

for (;;) {select (s for reading, 2 second timeout);if (error) break;if (s is ready for reading) {

if (read (s, junk buffer, sizeof (junk buffer)) <= 0) {break;

}/* just toss away whatever is here */

}}close (s);

}

This naturally adds some expense at the end of a connection, but it is required for a reliable implementation. AsHTTP/1.1 becomes more prevalent, and all connections are persistent, this expense will be amortized over morerequests. If you want to play with fire and disable this feature you can define NO LINGCLOSE, but this is not recom-mended at all. In particular, as HTTP/1.1 pipelined persistent connections come into use lingering close is anabsolute necessity (and pipelined connections are faster22, so you want to support them).

Scoreboard File

Apache’s parent and children communicate with each other through something called the scoreboard. Ideally thisshould be implemented in shared memory. For those operating systems that we either have access to, or have beengiven detailed ports for, it typically is implemented using shared memory. The rest default to using an on-disk file.The on-disk file is not only slow, but it is unreliable (and less featured). Peruse the src/main/conf.h file for yourarchitecture and look for either USE MMAP SCOREBOARD or USE SHMGET SCOREBOARD. Defining one of thosetwo (as well as their companions HAVE MMAP and HAVE SHMGET respectively) enables the supplied shared memorycode. If your system has another type of shared memory, edit the file src/main/http main.c and add the hooksnecessary to use it in Apache. (Send us back a patch too please.)

=⇒Historical note: The Linux port of Apache didn’t start to use shared memory until version 1.2of Apache. This oversight resulted in really poor and unreliable behaviour of earlier versionsof Apache on Linux.

22http://www.w3.org/Protocols/HTTP/Performance/Pipeline.html

Page 91: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.19. APACHE PERFORMANCE TUNING 83

DYNAMIC MODULE LIMIT

If you have no intention of using dynamically loaded modules (you probably don’t if you’re reading this and tun-ing your server for every last ounce of performance) then you should add -DDYNAMIC MODULE LIMIT=0 whenbuilding your server. This will save RAM that’s allocated only for supporting dynamically loaded modules.

Appendix: Detailed Analysis of a Trace

Here is a system call trace of Apache 2.0.38 with the worker MPM on Solaris 8. This trace was collected using:

truss -l -p httpd child pid.

The -l option tells truss to log the ID of the LWP (lightweight process–Solaris’s form of kernel-level thread) thatinvokes each system call.

Other systems may have different system call tracing utilities such as strace, ktrace, or par. They all producesimilar output.

In this trace, a client has requested a 10KB static file from the httpd. Traces of non-static requests or requests withcontent negotiation look wildly different (and quite ugly in some cases).

/67: accept(3, 0x00200BEC, 0x00200C0C, 1) (sleeping...)/67: accept(3, 0x00200BEC, 0x00200C0C, 1) = 9

In this trace, the listener thread is running within LWP #67.

=⇒Note the lack of accept(2) serialization. On this particular platform, the worker MPM usesan unserialized accept by default unless it is listening on multiple ports.

/65: lwp_park(0x00000000, 0) = 0/67: lwp_unpark(65, 1) = 0

Upon accepting the connection, the listener thread wakes up a worker thread to do the request processing. In this trace,the worker thread that handles the request is mapped to LWP #65.

/65: getsockname(9, 0x00200BA4, 0x00200BC4, 1) = 0

In order to implement virtual hosts, Apache needs to know the local socket address used to accept the connection. It ispossible to eliminate this call in many situations (such as when there are no virtual hosts, or when LISTEN directivesare used which do not have wildcard addresses). But no effort has yet been made to do these optimizations.

/65: brk(0x002170E8) = 0/65: brk(0x002190E8) = 0

The brk(2) calls allocate memory from the heap. It is rare to see these in a system call trace, because the httpduses custom memory allocators (apr pool and apr bucket alloc) for most request processing. In this trace,the httpd has just been started, so it must call malloc(3) to get the blocks of raw memory with which to create thecustom memory allocators.

Page 92: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

84 CHAPTER 2. USING THE APACHE HTTP SERVER

/65: fcntl(9, F_GETFL, 0x00000000) = 2/65: fstat64(9, 0xFAF7B818) = 0/65: getsockopt(9, 65535, 8192, 0xFAF7B918, 0xFAF7B910, 2190656) = 0/65: fstat64(9, 0xFAF7B818) = 0/65: getsockopt(9, 65535, 8192, 0xFAF7B918, 0xFAF7B914, 2190656) = 0/65: setsockopt(9, 65535, 8192, 0xFAF7B918, 4, 2190656) = 0/65: fcntl(9, F_SETFL, 0x00000082) = 0

Next, the worker thread puts the connection to the client (file descriptor 9) in non-blocking mode. Thesetsockopt(2) and getsockopt(2) calls are a side-effect of how Solaris’s libc handles fcntl(2) on sock-ets.

/65: read(9, " G E T / 1 0 k . h t m".., 8000) = 97

The worker thread reads the request from the client.

/65: stat("/var/httpd/apache/httpd-8999/htdocs/10k.html", 0xFAF7B978) = 0/65: open("/var/httpd/apache/httpd-8999/htdocs/10k.html", O_RDONLY) = 10

This httpd has been configured with Options FollowSymLinks and AllowOverride None. Thus it doesn’tneed to lstat(2) each directory in the path leading up to the requested file, nor check for .htaccess files. Itsimply calls stat(2) to verify that the file: 1) exists, and 2) is a regular file, not a directory.

/65: sendfilev(0, 9, 0x00200F90, 2, 0xFAF7B53C) = 10269

In this example, the httpd is able to send the HTTP response header and the requested file with a singlesendfilev(2) system call. Sendfile semantics vary among operating systems. On some other systems, it is neces-sary to do a write(2) or writev(2) call to send the headers before calling sendfile(2).

/65: write(4, " 1 2 7 . 0 . 0 . 1 - ".., 78) = 78

This write(2) call records the request in the access log. Note that one thing missing from this trace is a time(2)call. Unlike Apache 1.3, Apache 2.x uses gettimeofday(3) to look up the time. On some operating systems,like Linux or Solaris, gettimeofday has an optimized implementation that doesn’t require as much overhead as atypical system call.

/65: shutdown(9, 1, 1) = 0/65: poll(0xFAF7B980, 1, 2000) = 1/65: read(9, 0xFAF7BC20, 512) = 0/65: close(9) = 0

The worker thread does a lingering close of the connection.

/65: close(10) = 0/65: lwp_park(0x00000000, 0) (sleeping...)

Page 93: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.19. APACHE PERFORMANCE TUNING 85

Finally the worker thread closes the file that it has just delivered and blocks until the listener assigns it another con-nection.

/67: accept(3, 0x001FEB74, 0x001FEB94, 1) (sleeping...)

Meanwhile, the listener thread is able to accept another connection as soon as it has dispatched this connection toa worker thread (subject to some flow-control logic in the worker MPM that throttles the listener if all the availableworkers are busy). Though it isn’t apparent from this trace, the next accept(2) can (and usually does, under highload conditions) occur in parallel with the worker thread’s handling of the just-accepted connection.

Page 94: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

86 CHAPTER 2. USING THE APACHE HTTP SERVER

2.20 URL Rewriting Guide

=⇒Originally written byRalf S. Engelschall <[email protected]>December 1997

This document supplements the MOD REWRITE reference documentation (p. 521) . It describes how one can useApache’s MOD REWRITE to solve typical URL-based problems with which webmasters are commonony confronted.We give detailed descriptions on how to solve each problem by configuring URL rewriting rulesets.

Introduction to mod rewrite

The Apache module MOD REWRITE is a killer one, i.e. it is a really sophisticated module which provides a powerfulway to do URL manipulations. With it you can do nearly all types of URL manipulations you ever dreamed about.The price you have to pay is to accept complexity, because MOD REWRITE’s major drawback is that it is not easy tounderstand and use for the beginner. And even Apache experts sometimes discover new aspects where MOD REWRITEcan help.

In other words: With MOD REWRITE you either shoot yourself in the foot the first time and never use it again or loveit for the rest of your life because of its power. This paper tries to give you a few initial success events to avoid the firstcase by presenting already invented solutions to you.

Practical Solutions

Here come a lot of practical solutions I’ve either invented myself or collected from other people’s solutions in the past.Feel free to learn the black magic of URL rewriting from these examples.

! ATTENTION: Depending on your server-configuration it can be necessary to slightly changethe examples for your situation, e.g. adding the [PT] flag when additionally usingMOD ALIAS and MOD USERDIR, etc. Or rewriting a ruleset to fit in .htaccess contextinstead of per-server context. Always try to understand what a particular ruleset really doesbefore you use it. It avoid problems.

URL Layout

Canonical URLs

Description: On some webservers there are more than one URL for a resource. Usually there are canonical URLs(which should be actually used and distributed) and those which are just shortcuts, internal ones, etc. Indepen-dent of which URL the user supplied with the request he should finally see the canonical one only.

Solution: We do an external HTTP redirect for all non-canonical URLs to fix them in the location view of the Browserand for all subsequent requests. In the example ruleset below we replace /˜user by the canonical /u/userand fix a missing trailing slash for /u/user.

RewriteRule ˆ/˜([ˆ/]+)/?(.*) /u/$1/$2 [R]RewriteRule ˆ/([uge])/([ˆ/]+)$ /$1/$2/ [R]

Page 95: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.20. URL REWRITING GUIDE 87

Canonical Hostnames

Description: The goal of this rule is to force the use of a particular hostname, in preference to other hostnames whichmay be used to reach the same site. For example, if you wish to force the use of www.example.com instead ofexample.com, you might use a variant of the following recipe.

Solution:

# For sites running on a port other than 80RewriteCond %{HTTP_HOST} !ˆwww\.example\.com [NC]RewriteCond %{HTTP_HOST} !ˆ$RewriteCond %{SERVER_PORT} !ˆ80$RewriteRule ˆ/(.*) http://www.example.com:%{SERVER_PORT}/$1 [L,R]

# And for a site running on port 80RewriteCond %{HTTP_HOST} !ˆwww\.example\.com [NC]RewriteCond %{HTTP_HOST} !ˆ$RewriteRule ˆ/(.*) http://www.example.com/$1 [L,R]

Moved DocumentRoot

Description: Usually the DOCUMENTROOT of the webserver directly relates to the URL "/". But often this data isnot really of top-level priority, it is perhaps just one entity of a lot of data pools. For instance at our Intranet sitesthere are /e/www/ (the homepage for WWW), /e/sww/ (the homepage for the Intranet) etc. Now becausethe data of the DOCUMENTROOT stays at /e/www/ we had to make sure that all inlined images and other stuffinside this data pool work for subsequent requests.

Solution: We redirect the URL / to /e/www/:

RewriteEngine onRewriteRule ˆ/$ /e/www/ [R]

Note that this can also be handled using the REDIRECTMATCH directive:

RedirectMatch ˆ/$ http://example.com/e/www/

Trailing Slash Problem

Description: Every webmaster can sing a song about the problem of the trailing slash on URLs referencing directo-ries. If they are missing, the server dumps an error, because if you say /˜quux/foo instead of /˜quux/foo/then the server searches for a file named foo. And because this file is a directory it complains. Actually it triesto fix it itself in most of the cases, but sometimes this mechanism need to be emulated by you. For instance afteryou have done a lot of complicated URL rewritings to CGI scripts etc.

Solution: The solution to this subtle problem is to let the server add the trailing slash automatically. To do thiscorrectly we have to use an external redirect, so the browser correctly requests subsequent images etc. If weonly did a internal rewrite, this would only work for the directory page, but would go wrong when any images areincluded into this page with relative URLs, because the browser would request an in-lined object. For instance,a request for image.gif in /˜quux/foo/index.html would become /˜quux/image.gif withoutthe external redirect!

So, to do this trick we write:

Page 96: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

88 CHAPTER 2. USING THE APACHE HTTP SERVER

RewriteEngine onRewriteBase /˜quux/RewriteRule ˆfoo$ foo/ [R]

The crazy and lazy can even do the following in the top-level .htaccess file of their homedir. But notice thatthis creates some processing overhead.

RewriteEngine onRewriteBase /˜quux/RewriteCond %{REQUEST_FILENAME} -dRewriteRule ˆ(.+[ˆ/])$ $1/ [R]

Webcluster through Homogeneous URL Layout

Description: We want to create a homogeneous and consistent URL layout over all WWW servers on a Intranetwebcluster, i.e. all URLs (per definition server local and thus server dependent!) become actually server in-dependent! What we want is to give the WWW namespace a consistent server-independent layout: no URLshould have to include any physically correct target server. The cluster itself should drive us automatically tothe physical target host.

Solution: First, the knowledge of the target servers come from (distributed) external maps which contain informationwhere our users, groups and entities stay. The have the form

user1 server_of_user1user2 server_of_user2: :

We put them into files map.xxx-to-host. Second we need to instruct all servers to redirect URLs of theforms

/u/user/anypath/g/group/anypath/e/entity/anypath

to

http://physical-host/u/user/anypathhttp://physical-host/g/group/anypathhttp://physical-host/e/entity/anypath

when the URL is not locally valid to a server. The following ruleset does this for us by the help of the map files(assuming that server0 is a default server which will be used if a user has no entry in the map):

Page 97: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.20. URL REWRITING GUIDE 89

RewriteEngine on

RewriteMap user-to-host txt:/path/to/map.user-to-hostRewriteMap group-to-host txt:/path/to/map.group-to-hostRewriteMap entity-to-host txt:/path/to/map.entity-to-host

RewriteRule ˆ/u/([ˆ/]+)/?(.*) http://${user-to-host:$1|server0}/u/$1/$2RewriteRule ˆ/g/([ˆ/]+)/?(.*) http://${group-to-host:$1|server0}/g/$1/$2RewriteRule ˆ/e/([ˆ/]+)/?(.*) http://${entity-to-host:$1|server0}/e/$1/$2

RewriteRule ˆ/([uge])/([ˆ/]+)/?$ /$1/$2/.www/RewriteRule ˆ/([uge])/([ˆ/]+)/([ˆ.]+.+) /$1/$2/.www/$3\

Move Homedirs to Different Webserver

Description: Many webmasters have asked for a solution to the following situation: They wanted to redirect justall homedirs on a webserver to another webserver. They usually need such things when establishing a newerwebserver which will replace the old one over time.

Solution: The solution is trivial with MOD REWRITE. On the old webserver we just redirect all /˜user/anypathURLs to http://newserver/˜user/anypath.

RewriteEngine onRewriteRule ˆ/˜(.+) http://newserver/˜$1 [R,L]

Structured Homedirs

Description: Some sites with thousands of users usually use a structured homedir layout, i.e. each homedir is ina subdirectory which begins for instance with the first character of the username. So, /˜foo/anypath is/home/f/foo/.www/anypath while /˜bar/anypath is /home/b/bar/.www/anypath.

Solution: We use the following ruleset to expand the tilde URLs into exactly the above layout.

RewriteEngine onRewriteRule ˆ/˜(([a-z])[a-z0-9]+)(.*) /home/$2/$1/.www$3

Filesystem Reorganization

Description: This really is a hardcore example: a killer application which heavily uses per-directoryRewriteRules to get a smooth look and feel on the Web while its data structure is never touched or ad-justed. Background: net.sw is my archive of freely available Unix software packages, which I started to collectin 1992. It is both my hobby and job to to this, because while I’m studying computer science I have also workedfor many years as a system and network administrator in my spare time. Every week I need some sort of softwareso I created a deep hierarchy of directories where I stored the packages:

Page 98: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

90 CHAPTER 2. USING THE APACHE HTTP SERVER

drwxrwxr-x 2 netsw users 512 Aug 3 18:39 Audio/drwxrwxr-x 2 netsw users 512 Jul 9 14:37 Benchmark/drwxrwxr-x 12 netsw users 512 Jul 9 00:34 Crypto/drwxrwxr-x 5 netsw users 512 Jul 9 00:41 Database/drwxrwxr-x 4 netsw users 512 Jul 30 19:25 Dicts/drwxrwxr-x 10 netsw users 512 Jul 9 01:54 Graphic/drwxrwxr-x 5 netsw users 512 Jul 9 01:58 Hackers/drwxrwxr-x 8 netsw users 512 Jul 9 03:19 InfoSys/drwxrwxr-x 3 netsw users 512 Jul 9 03:21 Math/drwxrwxr-x 3 netsw users 512 Jul 9 03:24 Misc/drwxrwxr-x 9 netsw users 512 Aug 1 16:33 Network/drwxrwxr-x 2 netsw users 512 Jul 9 05:53 Office/drwxrwxr-x 7 netsw users 512 Jul 9 09:24 SoftEng/drwxrwxr-x 7 netsw users 512 Jul 9 12:17 System/drwxrwxr-x 12 netsw users 512 Aug 3 20:15 Typesetting/drwxrwxr-x 10 netsw users 512 Jul 9 14:08 X11/

In July 1996 I decided to make this archive public to the world via a nice Web interface. "Nice" means that Iwanted to offer an interface where you can browse directly through the archive hierarchy. And "nice" meansthat I didn’t wanted to change anything inside this hierarchy - not even by putting some CGI scripts at the topof it. Why? Because the above structure should be later accessible via FTP as well, and I didn’t want any Webor CGI stuff to be there.

Solution: The solution has two parts: The first is a set of CGI scripts which create all the pages at all directory levelson-the-fly. I put them under /e/netsw/.www/ as follows:

-rw-r--r-- 1 netsw users 1318 Aug 1 18:10 .wwwacldrwxr-xr-x 18 netsw users 512 Aug 5 15:51 DATA/-rw-rw-rw- 1 netsw users 372982 Aug 5 16:35 LOGFILE-rw-r--r-- 1 netsw users 659 Aug 4 09:27 TODO-rw-r--r-- 1 netsw users 5697 Aug 1 18:01 netsw-about.html-rwxr-xr-x 1 netsw users 579 Aug 2 10:33 netsw-access.pl-rwxr-xr-x 1 netsw users 1532 Aug 1 17:35 netsw-changes.cgi-rwxr-xr-x 1 netsw users 2866 Aug 5 14:49 netsw-home.cgidrwxr-xr-x 2 netsw users 512 Jul 8 23:47 netsw-img/-rwxr-xr-x 1 netsw users 24050 Aug 5 15:49 netsw-lsdir.cgi-rwxr-xr-x 1 netsw users 1589 Aug 3 18:43 netsw-search.cgi-rwxr-xr-x 1 netsw users 1885 Aug 1 17:41 netsw-tree.cgi-rw-r--r-- 1 netsw users 234 Jul 30 16:35 netsw-unlimit.lst

The DATA/ subdirectory holds the above directory structure, i.e. the real net.sw stuff and gets automaticallyupdated via rdist from time to time. The second part of the problem remains: how to link these two structurestogether into one smooth-looking URL tree? We want to hide the DATA/ directory from the user while runningthe appropriate CGI scripts for the various URLs. Here is the solution: first I put the following into the per-directory configuration file in the DOCUMENTROOT of the server to rewrite the announced URL /net.sw/ tothe internal path /e/netsw:

RewriteRule ˆnet.sw$ net.sw/ [R]RewriteRule ˆnet.sw/(.*)$ e/netsw/$1

The first rule is for requests which miss the trailing slash! The second rule does the real thing. And then comesthe killer configuration which stays in the per-directory config file /e/netsw/.www/.wwwacl:

Page 99: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.20. URL REWRITING GUIDE 91

Options ExecCGI FollowSymLinks Includes MultiViews

RewriteEngine on

# we are reached via /net.sw/ prefixRewriteBase /net.sw/

# first we rewrite the root dir to# the handling cgi scriptRewriteRule ˆ$ netsw-home.cgi [L]RewriteRule ˆindex\.html$ netsw-home.cgi [L]

# strip out the subdirs when# the browser requests us from perdir pagesRewriteRule ˆ.+/(netsw-[ˆ/]+/.+)$ $1 [L]

# and now break the rewriting for local filesRewriteRule ˆnetsw-home\.cgi.* - [L]RewriteRule ˆnetsw-changes\.cgi.* - [L]RewriteRule ˆnetsw-search\.cgi.* - [L]RewriteRule ˆnetsw-tree\.cgi$ - [L]RewriteRule ˆnetsw-about\.html$ - [L]RewriteRule ˆnetsw-img/.*$ - [L]

# anything else is a subdir which gets handled# by another cgi scriptRewriteRule !ˆnetsw-lsdir\.cgi.* - [C]RewriteRule (.*) netsw-lsdir.cgi/$1

Some hints for interpretation:

1. Notice the L (last) flag and no substitution field (’-’) in the forth part

2. Notice the ! (not) character and the C (chain) flag at the first rule in the last part

3. Notice the catch-all pattern in the last rule

NCSA imagemap to Apache mod imap

Description: When switching from the NCSA webserver to the more modern Apache webserver a lot of peoplewant a smooth transition. So they want pages which use their old NCSA imagemap program to work underApache with the modern MOD IMAP. The problem is that there are a lot of hyperlinks around which referencethe imagemap program via /cgi-bin/imagemap/path/to/page.map. Under Apache this has to readjust /path/to/page.map.

Solution: We use a global rule to remove the prefix on-the-fly for all requests:

RewriteEngine onRewriteRule ˆ/cgi-bin/imagemap(.*) $1 [PT]

Search pages in more than one directory

Description: Sometimes it is necessary to let the webserver search for pages in more than one directory. Here Multi-Views or other techniques cannot help.

Page 100: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

92 CHAPTER 2. USING THE APACHE HTTP SERVER

Solution: We program a explicit ruleset which searches for the files in the directories.

RewriteEngine on

# first try to find it in custom/...# ...and if found stop and be happy:RewriteCond /your/docroot/dir1/%{REQUEST_FILENAME} -fRewriteRule ˆ(.+) /your/docroot/dir1/$1 [L]

# second try to find it in pub/...# ...and if found stop and be happy:RewriteCond /your/docroot/dir2/%{REQUEST_FILENAME} -fRewriteRule ˆ(.+) /your/docroot/dir2/$1 [L]

# else go on for other Alias or ScriptAlias directives,# etc.RewriteRule ˆ(.+) - [PT]

Set Environment Variables According To URL Parts

Description: Perhaps you want to keep status information between requests and use the URL to encode it. But youdon’t want to use a CGI wrapper for all pages just to strip out this information.

Solution: We use a rewrite rule to strip out the status information and remember it via an environment variable whichcan be later dereferenced from within XSSI or CGI. This way a URL /foo/S=java/bar/ gets translated to/foo/bar/ and the environment variable named STATUS is set to the value "java".

RewriteEngine onRewriteRule ˆ(.*)/S=([ˆ/]+)/(.*) $1/$3 [E=STATUS:$2]

Virtual User Hosts

Description: Assume that you want to provide www.username.host.domain.com for the homepage of user-name via just DNS A records to the same machine and without any virtualhosts on this machine.

Solution: For HTTP/1.0 requests there is no solution, but for HTTP/1.1 requests which contain a Host: HTTP headerwe can use the following ruleset to rewrite http://www.username.host.com/anypath internally to/home/username/anypath:

RewriteEngine onRewriteCond %{HTTP_HOST} ˆwww\.[ˆ.]+\.host\.com$RewriteRule ˆ(.+) %{HTTP_HOST}$1 [C]RewriteRule ˆwww\.([ˆ.]+)\.host\.com(.*) /home/$1$2

Page 101: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.20. URL REWRITING GUIDE 93

Redirect Homedirs For Foreigners

Description: We want to redirect homedir URLs to another webserver www.somewhere.com when the requestinguser does not stay in the local domain ourdomain.com. This is sometimes used in virtual host contexts.

Solution: Just a rewrite condition:

RewriteEngine onRewriteCond %{REMOTE_HOST} !ˆ.+\.ourdomain\.com$RewriteRule ˆ(/˜.+) http://www.somewhere.com/$1 [R,L]

Redirect Failing URLs To Other Webserver

Description: A typical FAQ about URL rewriting is how to redirect failing requests on webserver A to webserverB. Usually this is done via ERRORDOCUMENT CGI-scripts in Perl, but there is also a MOD REWRITE solution.But notice that this performs more poorly than using an ERRORDOCUMENT CGI-script!

Solution: The first solution has the best performance but less flexibility, and is less error safe:

RewriteEngine onRewriteCond /your/docroot/%{REQUEST_FILENAME} !-fRewriteRule ˆ(.+) http://webserverB.dom/$1

The problem here is that this will only work for pages inside the DOCUMENTROOT. While you can add moreConditions (for instance to also handle homedirs, etc.) there is better variant:

RewriteEngine onRewriteCond %{REQUEST_URI} !-URewriteRule ˆ(.+) http://webserverB.dom/$1

This uses the URL look-ahead feature of MOD REWRITE. The result is that this will work for all types of URLsand is a safe way. But it does a performance impact on the webserver, because for every request there is onemore internal subrequest. So, if your webserver runs on a powerful CPU, use this one. If it is a slow machine,use the first approach or better a ERRORDOCUMENT CGI-script.

Extended Redirection

Description: Sometimes we need more control (concerning the character escaping mechanism) of URLs on redirects.Usually the Apache kernels URL escape function also escapes anchors, i.e. URLs like "url#anchor". Youcannot use this directly on redirects with MOD REWRITE because the uri escape() function of Apachewould also escape the hash character. How can we redirect to such a URL?

Solution: We have to use a kludge by the use of a NPH-CGI script which does the redirect itself. Because here noescaping is done (NPH=non-parseable headers). First we introduce a new URL scheme xredirect: by thefollowing per-server config-line (should be one of the last rewrite rules):

RewriteRule ˆxredirect:(.+) /path/to/nph-xredirect.cgi/$1 \[T=application/x-httpd-cgi,L]

Page 102: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

94 CHAPTER 2. USING THE APACHE HTTP SERVER

This forces all URLs prefixed with xredirect: to be piped through the nph-xredirect.cgi program.And this program just looks like:

#!/path/to/perl#### nph-xredirect.cgi -- NPH/CGI script for extended redirects## Copyright (c) 1997 Ralf S. Engelschall, All Rights Reserved.##

$| = 1;$url = $ENV{’PATH_INFO’};

print "HTTP/1.0 302 Moved Temporarily\n";print "Server: $ENV{’SERVER_SOFTWARE’}\n";print "Location: $url\n";print "Content-type: text/html\n";print "\n";print "<html>\n";print "<head>\n";print "<title>302 Moved Temporarily (EXTENDED)</title>\n";print "</head>\n";print "<body>\n";print "<h1>Moved Temporarily (EXTENDED)</h1>\n";print "The document has moved <a HREF=\"$url\">here</a>.<p>\n";print "</body>\n";print "</html>\n";

##EOF##

This provides you with the functionality to do redirects to all URL schemes, i.e. including the one which are notdirectly accepted by MOD REWRITE. For instance you can now also redirect to news:newsgroup via

RewriteRule ˆanyurl xredirect:news:newsgroup

=⇒Notice: You have not to put [R] or [R,L] to the above rule because the xredirect: needto be expanded later by our special "pipe through" rule above.

Archive Access Multiplexer

Description: Do you know the great CPAN (Comprehensive Perl Archive Network) underhttp://www.perl.com/CPAN? This does a redirect to one of several FTP servers around the worldwhich carry a CPAN mirror and is approximately near the location of the requesting client. Actually this canbe called an FTP access multiplexing service. While CPAN runs via CGI scripts, how can a similar approachimplemented via MOD REWRITE?

Solution: First we notice that from version 3.0.0 MOD REWRITE can also use the "ftp:" scheme on redirects. Andsecond, the location approximation can be done by a REWRITEMAP over the top-level domain of the client.With a tricky chained ruleset we can use this top-level domain as a key to our multiplexing map.

RewriteEngine onRewriteMap multiplex txt:/path/to/map.cxanRewriteRule ˆ/CxAN/(.*) %{REMOTE_HOST}::$1 [C]RewriteRule ˆ.+\.([a-zA-Z]+)::(.*)$ ${multiplex:$1|ftp.default.dom}$2 [R,L]

Page 103: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.20. URL REWRITING GUIDE 95

#### map.cxan -- Multiplexing Map for CxAN##

de ftp://ftp.cxan.de/CxAN/uk ftp://ftp.cxan.uk/CxAN/com ftp://ftp.cxan.com/CxAN/:##EOF##

Time-Dependent Rewriting

Description: When tricks like time-dependent content should happen a lot of webmasters still use CGI scripts whichdo for instance redirects to specialized pages. How can it be done via MOD REWRITE?

Solution: There are a lot of variables named TIME xxx for rewrite conditions. In conjunction with the speciallexicographic comparison patterns <STRING, >STRING and =STRING we can do time-dependent redirects:

RewriteEngine onRewriteCond %{TIME_HOUR}%{TIME_MIN} >0700RewriteCond %{TIME_HOUR}%{TIME_MIN} <1900RewriteRule ˆfoo\.html$ foo.day.htmlRewriteRule ˆfoo\.html$ foo.night.html

This provides the content of foo.day.html under the URL foo.html from 07:00-19:00 and at theremaining time the contents of foo.night.html. Just a nice feature for a homepage...

Backward Compatibility for YYYY to XXXX migration

Description: How can we make URLs backward compatible (still existing virtually) after migratingdocument.YYYY to document.XXXX, e.g. after translating a bunch of .html files to .phtml?

Solution: We just rewrite the name to its basename and test for existence of the new extension. If it exists, we takethat name, else we rewrite the URL to its original state.

# backward compatibility ruleset for# rewriting document.html to document.phtml# when and only when document.phtml exists# but no longer document.htmlRewriteEngine onRewriteBase /˜quux/# parse out basename, but remember the factRewriteRule ˆ(.*)\.html$ $1 [C,E=WasHTML:yes]# rewrite to document.phtml if existsRewriteCond %{REQUEST_FILENAME}.phtml -fRewriteRule ˆ(.*)$ $1.phtml [S=1]# else reverse the previous basename cutoutRewriteCond %{ENV:WasHTML} ˆyes$RewriteRule ˆ(.*)$ $1.html

Page 104: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

96 CHAPTER 2. USING THE APACHE HTTP SERVER

Content Handling

From Old to New (intern)

Description: Assume we have recently renamed the page foo.html to bar.html and now want to provide theold URL for backward compatibility. Actually we want that users of the old URL even not recognize that thepages was renamed.

Solution: We rewrite the old URL to the new one internally via the following rule:

RewriteEngine onRewriteBase /˜quux/RewriteRule ˆfoo\.html$ bar.html

From Old to New (extern)

Description: Assume again that we have recently renamed the page foo.html to bar.html and now want toprovide the old URL for backward compatibility. But this time we want that the users of the old URL get hintedto the new one, i.e. their browsers Location field should change, too.

Solution: We force a HTTP redirect to the new URL which leads to a change of the browsers and thus the users view:

RewriteEngine onRewriteBase /˜quux/RewriteRule ˆfoo\.html$ bar.html [R]

Browser Dependent Content

Description: At least for important top-level pages it is sometimes necessary to provide the optimum of browserdependent content, i.e. one has to provide a maximum version for the latest Netscape variants, a minimumversion for the Lynx browsers and a average feature version for all others.

Solution: We cannot use content negotiation because the browsers do not provide their type in that form. Insteadwe have to act on the HTTP header "User-Agent". The following condig does the following: If the HTTPheader "User-Agent" begins with "Mozilla/3", the page foo.html is rewritten to foo.NS.html and andthe rewriting stops. If the browser is "Lynx" or "Mozilla" of version 1 or 2 the URL becomes foo.20.html.All other browsers receive page foo.32.html. This is done by the following ruleset:

RewriteCond %{HTTP_USER_AGENT} ˆMozilla/3.*RewriteRule ˆfoo\.html$ foo.NS.html [L]

RewriteCond %{HTTP_USER_AGENT} ˆLynx/.* [OR]RewriteCond %{HTTP_USER_AGENT} ˆMozilla/[12].*RewriteRule ˆfoo\.html$ foo.20.html [L]

RewriteRule ˆfoo\.html$ foo.32.html [L]

Page 105: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.20. URL REWRITING GUIDE 97

Dynamic Mirror

Description: Assume there are nice webpages on remote hosts we want to bring into our namespace. For FTP serverswe would use the mirror program which actually maintains an explicit up-to-date copy of the remote data onthe local machine. For a webserver we could use the program webcopy which acts similar via HTTP. But bothtechniques have one major drawback: The local copy is always just as up-to-date as often we run the program. Itwould be much better if the mirror is not a static one we have to establish explicitly. Instead we want a dynamicmirror with data which gets updated automatically when there is need (updated data on the remote host).

Solution: To provide this feature we map the remote webpage or even the complete remote webarea to our namespaceby the use of the Proxy Throughput feature (flag [P]):

RewriteEngine onRewriteBase /˜quux/RewriteRule ˆhotsheet/(.*)$ http://www.tstimpreso.com/hotsheet/$1 [P]

RewriteEngine onRewriteBase /˜quux/RewriteRule ˆusa-news\.html$ http://www.quux-corp.com/news/index.html [P]

Reverse Dynamic Mirror

Description: ...

Solution: RewriteEngine onRewriteCond /mirror/of/remotesite/$1 -URewriteRule ˆhttp://www\.remotesite\.com/(.*)$ /mirror/of/remotesite/$1

Retrieve Missing Data from Intranet

Description: This is a tricky way of virtually running a corporate (external) Internet webserver(www.quux-corp.dom), while actually keeping and maintaining its data on a (internal) Intranetwebserver (www2.quux-corp.dom) which is protected by a firewall. The trick is that on the externalwebserver we retrieve the requested data on-the-fly from the internal one.

Solution: First, we have to make sure that our firewall still protects the internal webserver and that only the externalwebserver is allowed to retrieve data from it. For a packet-filtering firewall we could for instance configure afirewall ruleset like the following:

ALLOW Host www.quux-corp.dom Port >1024 --> Host www2.quux-corp.dom Port 80DENY Host * Port * --> Host www2.quux-corp.dom Port 80

Just adjust it to your actual configuration syntax. Now we can establish the MOD REWRITE rules which requestthe missing data in the background through the proxy throughput feature:

RewriteRule ˆ/˜([ˆ/]+)/?(.*) /home/$1/.www/$2RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ˆ/home/([ˆ/]+)/.www/?(.*) http://www2.quux-corp.dom/˜$1/pub/$2 [P]

Page 106: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

98 CHAPTER 2. USING THE APACHE HTTP SERVER

Load Balancing

Description: Suppose we want to load balance the traffic to www.foo.com over www[0-5].foo.com (a total of6 servers). How can this be done?

Solution: There are a lot of possible solutions for this problem. We will discuss first a commonly known DNS-basedvariant and then the special one with MOD REWRITE:

1. DNS Round-RobinThe simplest method for load-balancing is to use the DNS round-robin feature of BIND. Here you justconfigure www[0-9].foo.com as usual in your DNS with A(address) records, e.g.

www0 IN A 1.2.3.1www1 IN A 1.2.3.2www2 IN A 1.2.3.3www3 IN A 1.2.3.4www4 IN A 1.2.3.5www5 IN A 1.2.3.6

Then you additionally add the following entry:

www IN CNAME www0.foo.com.IN CNAME www1.foo.com.IN CNAME www2.foo.com.IN CNAME www3.foo.com.IN CNAME www4.foo.com.IN CNAME www5.foo.com.IN CNAME www6.foo.com.

Notice that this seems wrong, but is actually an intended feature of BIND and can be used in this way.However, now when www.foo.com gets resolved, BIND gives out www0-www6 - but in a slightly per-mutated/rotated order every time. This way the clients are spread over the various servers. But noticethat this not a perfect load balancing scheme, because DNS resolve information gets cached by the othernameservers on the net, so once a client has resolved www.foo.com to a particular wwwN.foo.com, allsubsequent requests also go to this particular name wwwN.foo.com. But the final result is ok, becausethe total sum of the requests are really spread over the various webservers.

2. DNS Load-BalancingA sophisticated DNS-based method for load-balancing is to use the program lbnamedwhich can be foundat http://www.stanford.edu/˜schemers/docs/lbnamed/lbnamed.html23. It is a Perl 5 program in conjunctionwith auxilliary tools which provides a real load-balancing for DNS.

3. Proxy Throughput Round-RobinIn this variant we use MOD REWRITE and its proxy throughput feature. First we dedicate www0.foo.comto be actually www.foo.com by using a single

www IN CNAME www0.foo.com.

entry in the DNS. Then we convert www0.foo.com to a proxy-only server, i.e. we configure this machineso all arriving URLs are just pushed through the internal proxy to one of the 5 other servers (www1-www5).To accomplish this we first establish a ruleset which contacts a load balancing script lb.pl for all URLs.

RewriteEngine onRewriteMap lb prg:/path/to/lb.plRewriteRule ˆ/(.+)$ ${lb:$1} [P,L]

23http://www.stanford.edu/˜schemers/docs/lbnamed/lbnamed.html

Page 107: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.20. URL REWRITING GUIDE 99

Then we write lb.pl:

#!/path/to/perl#### lb.pl -- load balancing script##

$| = 1;

$name = "www"; # the hostname base$first = 1; # the first server (not 0 here, because 0 is myself)$last = 5; # the last server in the round-robin$domain = "foo.dom"; # the domainname

$cnt = 0;while (<STDIN>) {

$cnt = (($cnt+1) % ($last+1-$first));$server = sprintf("%s%d.%s", $name, $cnt+$first, $domain);print "http://$server/$_";

}

##EOF##

=⇒A last notice: Why is this useful? Seems like www0.foo.com still is overloaded? The answeris yes, it is overloaded, but with plain proxy throughput requests, only! All SSI, CGI, ePerl,etc. processing is completely done on the other machines. This is the essential point.

4. Hardware/TCP Round-RobinThere is a hardware solution available, too. Cisco has a beast called LocalDirector which does a loadbalancing at the TCP/IP level. Actually this is some sort of a circuit level gateway in front of a webcluster.If you have enough money and really need a solution with high performance, use this one.

New MIME-type, New Service

Description: On the net there are a lot of nifty CGI programs. But their usage is usually boring, so a lot of webmasterdon’t use them. Even Apache’s Action handler feature for MIME-types is only appropriate when the CGIprograms don’t need special URLs (actually PATH INFO and QUERY STRINGS) as their input. First, letus configure a new file type with extension .scgi (for secure CGI) which will be processed by the popularcgiwrap program. The problem here is that for instance we use a Homogeneous URL Layout (see above) afile inside the user homedirs has the URL /u/user/foo/bar.scgi. But cgiwrap needs the URL in theform /˜user/foo/bar.scgi/. The following rule solves the problem:

RewriteRule ˆ/[uge]/([ˆ/]+)/\.www/(.+)\.scgi(.*) ...... /internal/cgi/user/cgiwrap/˜$1/$2.scgi$3 [NS,T=application/x-http-cgi]

Or assume we have some more nifty programs: wwwlog (which displays the access.log for a URL subtreeand wwwidx (which runs Glimpse on a URL subtree). We have to provide the URL area to these programs sothey know on which area they have to act on. But usually this ugly, because they are all the times still requestedfrom that areas, i.e. typically we would run the swwidx program from within /u/user/foo/ via hyperlinkto

/internal/cgi/user/swwidx?i=/u/user/foo/

Page 108: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

100 CHAPTER 2. USING THE APACHE HTTP SERVER

which is ugly. Because we have to hard-code both the location of the area and the location of the CGI insidethe hyperlink. When we have to reorganize the area, we spend a lot of time changing the various hyperlinks.

Solution: The solution here is to provide a special new URL format which automatically leads to the proper CGIinvocation. We configure the following:

RewriteRule ˆ/([uge])/([ˆ/]+)(/?.*)/\* /internal/cgi/user/wwwidx?i=/$1/$2$3/RewriteRule ˆ/([uge])/([ˆ/]+)(/?.*):log /internal/cgi/user/wwwlog?f=/$1/$2$3

Now the hyperlink to search at /u/user/foo/ reads only

HREF="*"

which internally gets automatically transformed to

/internal/cgi/user/wwwidx?i=/u/user/foo/

The same approach leads to an invocation for the access log CGI program when the hyperlink :log gets used.

From Static to Dynamic

Description: How can we transform a static page foo.html into a dynamic variant foo.cgi in a seamless way,i.e. without notice by the browser/user.

Solution: We just rewrite the URL to the CGI-script and force the correct MIME-type so it gets really run as a CGI-script. This way a request to /˜quux/foo.html internally leads to the invocation of /˜quux/foo.cgi.

RewriteEngine onRewriteBase /˜quux/RewriteRule ˆfoo\.html$ foo.cgi [T=application/x-httpd-cgi]

On-the-fly Content-Regeneration

Description: Here comes a really esoteric feature: Dynamically generated but statically served pages, i.e. pagesshould be delivered as pure static pages (read from the filesystem and just passed through), but they have tobe generated dynamically by the webserver if missing. This way you can have CGI-generated pages which arestatically served unless one (or a cronjob) removes the static contents. Then the contents gets refreshed.

Solution: This is done via the following ruleset:

RewriteCond %{REQUEST_FILENAME} !-sRewriteRule ˆpage\.html$ page.cgi [T=application/x-httpd-cgi,L]

Here a request to page.html leads to a internal run of a corresponding page.cgi if page.html is stillmissing or has filesize null. The trick here is that page.cgi is a usual CGI script which (additionally toits STDOUT) writes its output to the file page.html. Once it was run, the server sends out the data ofpage.html. When the webmaster wants to force a refresh the contents, he just removes page.html (usuallydone by a cronjob).

Page 109: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.20. URL REWRITING GUIDE 101

Document With Autorefresh

Description: Wouldn’t it be nice while creating a complex webpage if the webbrowser would automatically refreshthe page every time we write a new version from within our editor? Impossible?

Solution: No! We just combine the MIME multipart feature, the webserver NPH feature and the URL manipulationpower of MOD REWRITE. First, we establish a new URL feature: Adding just :refresh to any URL causesthis to be refreshed every time it gets updated on the filesystem.

RewriteRule ˆ(/[uge]/[ˆ/]+/?.*):refresh /internal/cgi/apache/nph-refresh?f=$1

Now when we reference the URL

/u/foo/bar/page.html:refresh

this leads to the internal invocation of the URL

/internal/cgi/apache/nph-refresh?f=/u/foo/bar/page.html

The only missing part is the NPH-CGI script. Although one would usually say "left as an exercise to the reader";-) I will provide this, too.

Page 110: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

102 CHAPTER 2. USING THE APACHE HTTP SERVER

#!/sw/bin/perl#### nph-refresh -- NPH/CGI script for auto refreshing pages## Copyright (c) 1997 Ralf S. Engelschall, All Rights Reserved.##$| = 1;

# split the QUERY_STRING variable@pairs = split(/&/, $ENV{’QUERY_STRING’});foreach $pair (@pairs) {

($name, $value) = split(/=/, $pair);$name =˜ tr/A-Z/a-z/;$name = ’QS_’ . $name;$value =˜ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;eval "\$$name = \"$value\"";

}$QS_s = 1 if ($QS_s eq ’’);$QS_n = 3600 if ($QS_n eq ’’);if ($QS_f eq ’’) {

print "HTTP/1.0 200 OK\n";print "Content-type: text/html\n\n";print "&lt;b&gt;ERROR&lt;/b&gt;: No file given\n";exit(0);

}if (! -f $QS_f) {

print "HTTP/1.0 200 OK\n";print "Content-type: text/html\n\n";print "&lt;b&gt;ERROR&lt;/b&gt;: File $QS_f not found\n";exit(0);

}

sub print_http_headers_multipart_begin {print "HTTP/1.0 200 OK\n";$bound = "ThisRandomString12345";print "Content-type: multipart/x-mixed-replace;boundary=$bound\n";&print_http_headers_multipart_next;

}

sub print_http_headers_multipart_next {print "\n--$bound\n";

}

sub print_http_headers_multipart_end {print "\n--$bound--\n";

}

sub displayhtml {local($buffer) = @_;$len = length($buffer);print "Content-type: text/html\n";print "Content-length: $len\n\n";print $buffer;

}

sub readfile {local($file) = @_;local(*FP, $size, $buffer, $bytes);($x, $x, $x, $x, $x, $x, $x, $size) = stat($file);$size = sprintf("%d", $size);open(FP, "&lt;$file");$bytes = sysread(FP, $buffer, $size);close(FP);return $buffer;

}

$buffer = &readfile($QS_f);&print_http_headers_multipart_begin;&displayhtml($buffer);

sub mystat {local($file) = $_[0];local($time);

($x, $x, $x, $x, $x, $x, $x, $x, $x, $mtime) = stat($file);return $mtime;

}

$mtimeL = &mystat($QS_f);$mtime = $mtime;for ($n = 0; $n &lt; $QS_n; $n++) {

while (1) {$mtime = &mystat($QS_f);if ($mtime ne $mtimeL) {

$mtimeL = $mtime;sleep(2);$buffer = &readfile($QS_f);&print_http_headers_multipart_next;&displayhtml($buffer);sleep(5);$mtimeL = &mystat($QS_f);last;

}sleep($QS_s);

}}

&print_http_headers_multipart_end;

exit(0);

##EOF##

Page 111: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.20. URL REWRITING GUIDE 103

Mass Virtual Hosting

Description: The <VIRTUALHOST> feature of Apache is nice and works great when you just have a few dozensvirtual hosts. But when you are an ISP and have hundreds of virtual hosts to provide this feature is not the bestchoice.

Solution: To provide this feature we map the remote webpage or even the complete remote webarea to our namespaceby the use of the Proxy Throughput feature (flag [P]):

#### vhost.map##www.vhost1.dom:80 /path/to/docroot/vhost1www.vhost2.dom:80 /path/to/docroot/vhost2

:www.vhostN.dom:80 /path/to/docroot/vhostN

Page 112: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

104 CHAPTER 2. USING THE APACHE HTTP SERVER

#### httpd.conf##

:# use the canonical hostname on redirects, etc.UseCanonicalName on

:# add the virtual host in front of the CLF-formatCustomLog /path/to/access_log "%{VHOST}e %h %l %u %t \"%r\" %>s %b"

:

# enable the rewriting engine in the main serverRewriteEngine on

# define two maps: one for fixing the URL and one which defines# the available virtual hosts with their corresponding# DocumentRoot.RewriteMap lowercase int:tolowerRewriteMap vhost txt:/path/to/vhost.map

# Now do the actual virtual host mapping# via a huge and complicated single rule:## 1. make sure we don’t map for common locationsRewriteCond %{REQUEST_URI} !ˆ/commonurl1/.*RewriteCond %{REQUEST_URI} !ˆ/commonurl2/.*

:RewriteCond %{REQUEST_URI} !ˆ/commonurlN/.*## 2. make sure we have a Host header, because# currently our approach only supports# virtual hosting through this headerRewriteCond %{HTTP_HOST} !ˆ$## 3. lowercase the hostnameRewriteCond ${lowercase:%{HTTP_HOST}|NONE} ˆ(.+)$## 4. lookup this hostname in vhost.map and# remember it only when it is a path# (and not "NONE" from above)RewriteCond ${vhost:%1} ˆ(/.*)$## 5. finally we can map the URL to its docroot location# and remember the virtual host for logging puposesRewriteRule ˆ/(.*)$ %1/$1 [E=VHOST:${lowercase:%{HTTP_HOST}}]

:

Access Restriction

Blocking of Robots

Description: How can we block a really annoying robot from retrieving pages of a specific webarea? A/robots.txt file containing entries of the "Robot Exclusion Protocol" is typically not enough to get ridof such a robot.

Page 113: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.20. URL REWRITING GUIDE 105

Solution: We use a ruleset which forbids the URLs of the webarea /˜quux/foo/arc/ (perhaps a very deep direc-tory indexed area where the robot traversal would create big server load). We have to make sure that we forbidaccess only to the particular robot, i.e. just forbidding the host where the robot runs is not enough. This wouldblock users from this host, too. We accomplish this by also matching the User-Agent HTTP header information.

RewriteCond %{HTTP_USER_AGENT} ˆNameOfBadRobot.*RewriteCond %{REMOTE_ADDR} ˆ123\.45\.67\.[8-9]$RewriteRule ˆ/˜quux/foo/arc/.+ - [F]

Blocked Inline-Images

Description: Assume we have under http://www.quux-corp.de/˜quux/ some pages with inlined GIFgraphics. These graphics are nice, so others directly incorporate them via hyperlinks to their pages. We don’tlike this practice because it adds useless traffic to our server.

Solution: While we cannot 100% protect the images from inclusion, we can at least restrict the cases where thebrowser sends a HTTP Referer header.

RewriteCond %{HTTP_REFERER} !ˆ$RewriteCond %{HTTP_REFERER} !ˆhttp://www.quux-corp.de/˜quux/.*$ [NC]RewriteRule .*\.gif$ - [F]

RewriteCond %{HTTP_REFERER} !ˆ$RewriteCond %{HTTP_REFERER} !.*/foo-with-gif\.html$RewriteRule ˆinlined-in-foo\.gif$ - [F]

Host Deny

Description: How can we forbid a list of externally configured hosts from using our server?

Solution: For Apache >= 1.3b6:

RewriteEngine onRewriteMap hosts-deny txt:/path/to/hosts.denyRewriteCond ${hosts-deny:%{REMOTE_HOST}|NOT-FOUND} !=NOT-FOUND [OR]RewriteCond ${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND} !=NOT-FOUNDRewriteRule ˆ/.* - [F]

For Apache <= 1.3b6:

RewriteEngine onRewriteMap hosts-deny txt:/path/to/hosts.denyRewriteRule ˆ/(.*)$ ${hosts-deny:%{REMOTE_HOST}|NOT-FOUND}/$1RewriteRule !ˆNOT-FOUND/.* - [F]RewriteRule ˆNOT-FOUND/(.*)$ ${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND}/$1RewriteRule !ˆNOT-FOUND/.* - [F]RewriteRule ˆNOT-FOUND/(.*)$ /$1

Page 114: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

106 CHAPTER 2. USING THE APACHE HTTP SERVER

#### hosts.deny#### ATTENTION! This is a map, not a list, even when we treat it as such.## mod_rewrite parses it for key/value pairs, so at least a## dummy value "-" must be present for each entry.##

193.102.180.41 -bsdti1.sdm.de -192.76.162.40 -

Proxy Deny

Description: How can we forbid a certain host or even a user of a special host from using the Apache proxy?

Solution: We first have to make sure MOD REWRITE is below(!) MOD PROXY in the Configuration file when com-piling the Apache webserver. This way it gets called before MOD PROXY. Then we configure the following fora host-dependent deny...

RewriteCond %{REMOTE_HOST} ˆbadhost\.mydomain\.com$RewriteRule !ˆhttp://[ˆ/.]\.mydomain.com.* - [F]

...and this one for a user@host-dependent deny:

RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} ˆbadguy@badhost\.mydomain\.com$RewriteRule !ˆhttp://[ˆ/.]\.mydomain.com.* - [F]

Special Authentication Variant

Description: Sometimes a very special authentication is needed, for instance a authentication which checks for a setof explicitly configured users. Only these should receive access and without explicit prompting (which wouldoccur when using the Basic Auth via MOD AUTH).

Solution: We use a list of rewrite conditions to exclude all except our friends:

RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} !ˆ[email protected]\.com$RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} !ˆ[email protected]\.com$RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} !ˆ[email protected]\.com$RewriteRule ˆ/˜quux/only-for-friends/ - [F]

Referer-based Deflector

Description: How can we program a flexible URL Deflector which acts on the "Referer" HTTP header and can beconfigured with as many referring pages as we like?

Solution: Use the following really tricky ruleset...

Page 115: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

2.20. URL REWRITING GUIDE 107

RewriteMap deflector txt:/path/to/deflector.map

RewriteCond %{HTTP_REFERER} !=""RewriteCond ${deflector:%{HTTP_REFERER}} ˆ-$RewriteRule ˆ.* %{HTTP_REFERER} [R,L]

RewriteCond %{HTTP_REFERER} !=""RewriteCond ${deflector:%{HTTP_REFERER}|NOT-FOUND} !=NOT-FOUNDRewriteRule ˆ.* ${deflector:%{HTTP_REFERER}} [R,L]

... in conjunction with a corresponding rewrite map:

#### deflector.map##

http://www.badguys.com/bad/index.html -http://www.badguys.com/bad/index2.html -http://www.badguys.com/bad/index3.html http://somewhere.com/

This automatically redirects the request back to the referring page (when "-" is used as the value in the map)or to a specific URL (when an URL is specified in the map as the second argument).

Other

External Rewriting Engine

Description: A FAQ: How can we solve the FOO/BAR/QUUX/etc. problem? There seems no solution by the use ofMOD REWRITE...

Solution: Use an external REWRITEMAP, i.e. a program which acts like a REWRITEMAP. It is run once on startupof Apache receives the requested URLs on STDIN and has to put the resulting (usually rewritten) URL onSTDOUT (same order!).

RewriteEngine onRewriteMap quux-map prg:/path/to/map.quux.plRewriteRule ˆ/˜quux/(.*)$ /˜quux/${quux-map:$1}

#!/path/to/perl

# disable buffered I/O which would lead# to deadloops for the Apache server$| = 1;

# read URLs one per line from stdin and# generate substitution URL on stdoutwhile (<>) {

s|ˆfoo/|bar/|;print $_;

}

Page 116: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

108 CHAPTER 2. USING THE APACHE HTTP SERVER

This is a demonstration-only example and just rewrites all URLs /˜quux/foo/... to /˜quux/bar/....Actually you can program whatever you like. But notice that while such maps can be used also by an averageuser, only the system administrator can define it.

Page 117: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

Chapter 3

Apache Virtual Host documentation

109

Page 118: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

110 CHAPTER 3. APACHE VIRTUAL HOST DOCUMENTATION

3.1 Apache Virtual Host documentation

The term Virtual Host refers to the practice of running more than one web site (such as www.company1.com andwww.company2.com) on a single machine. Virtual hosts can be "IP-based (p. 114) ", meaning that you have adifferent IP address for every web site, or "name-based (p. 111) ", meaning that you have multiple names running oneach IP address. The fact that they are running on the same physical server is not apparent to the end user.

Apache was one of the first servers to support IP-based virtual hosts right out of the box. Versions 1.1 and later ofApache support both IP-based and name-based virtual hosts (vhosts). The latter variant of virtual hosts is sometimesalso called host-based or non-IP virtual hosts.

Below is a list of documentation pages which explain all details of virtual host support in Apache version 1.3 and later.

See also

• MOD VHOST ALIAS

• Name-based virtual hosts (p. 111)

• IP-based virtual hosts (p. 114)

• Virtual host examples (p. 121)

• File descriptor limits (p. 134)

• Mass virtual hosting (p. 116)

• Details of host matching (p. 129)

Virtual Host Support

• Name-based Virtual Hosts (p. 111) (More than one web site per IP address)

• IP-based Virtual Hosts (p. 114) (An IP address for each web site)

• Virtual Host examples for common setups (p. 121)

• File Descriptor Limits (p. 134) (or, Too many log files)

• Dynamically Configured Mass Virtual Hosting (p. 116)

• In-Depth Discussion of Virtual Host Matching (p. 129)

Configuration directives

• <VIRTUALHOST>

• NAMEVIRTUALHOST

• SERVERNAME

• SERVERALIAS

• SERVERPATH

If you are trying to debug your virtual host configuration, you may find the Apache -S command line switch useful.That is, type the following command:

/usr/local/apache2/bin/httpd -S

This command will dump out a description of how Apache parsed the configuration file. Careful examination of theIP addresses and server names may help uncover configuration mistakes. (See the docs for the httpd program forother command line options)

Page 119: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

3.2. NAME-BASED VIRTUAL HOST SUPPORT 111

3.2 Name-based Virtual Host Support

This document describes when and how to use name-based virtual hosts.

See also

• IP-based Virtual Host Support (p. 114)

• An In-Depth Discussion of Virtual Host Matching (p. 129)

• Dynamically configured mass virtual hosting (p. 116)

• Virtual Host examples for common setups (p. 121)

• ServerPath configuration example (p. 121)

Name-based vs. IP-based Virtual Hosts

IP-based virtual hosts use the IP address of the connection to determine the correct virtual host to serve. Thereforeyou need to have a separate IP address for each host. With name-based virtual hosting, the server relies on the clientto report the hostname as part of the HTTP headers. Using this technique, many different hosts can share the same IPaddress.

Name-based virtual hosting is usually simpler, since you need only configure your DNS server to map each hostnameto the correct IP address and then configure the Apache HTTP Server to recognize the different hostnames. Name-based virtual hosting also eases the demand for scarce IP addresses. Therefore you should use name-based virtualhosting unless there is a specific reason to choose IP-based virtual hosting. Some reasons why you might considerusing IP-based virtual hosting:

• Some ancient clients are not compatible with name-based virtual hosting. For name-based virtual hosting towork, the client must send the HTTP Host header. This is required by HTTP/1.1, and is implemented by allmodern HTTP/1.0 browsers as an extension. If you need to support obsolete clients and still use name-basedvirtual hosting, a possible technique is discussed at the end of this document.

• Name-based virtual hosting cannot be used with SSL secure servers because of the nature of the SSL protocol.

• Some operating systems and network equipment implement bandwidth management techniques that cannotdifferentiate between hosts unless they are on separate IP addresses.

Using Name-based Virtual Hosts

Related ModulesCORE

Related DirectivesDOCUMENTROOTNAMEVIRTUALHOSTSERVERALIASSERVERNAMESERVERPATH<VIRTUALHOST>

To use name-based virtual hosting, you must designate the IP address (and possibly port) on the server that will beaccepting requests for the hosts. This is configured using the NAMEVIRTUALHOST directive. In the normal casewhere any and all IP addresses on the server should be used, you can use * as the argument to NAMEVIRTUALHOST.If you’re planning to use multiple ports (e.g. running SSL) you should add a Port to the argument, such as *:80.Note that mentioning an IP address in a NAMEVIRTUALHOST directive does not automatically make the server listento that IP address. See Setting which addresses and ports Apache uses (p. 57) for more details. In addition, any IPaddress specified here must be associated with a network interface on the server.

Page 120: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

112 CHAPTER 3. APACHE VIRTUAL HOST DOCUMENTATION

The next step is to create a <VIRTUALHOST> block for each different host that you would like to serve. The argumentto the <VIRTUALHOST> directive should be the same as the argument to the NAMEVIRTUALHOST directive (ie, anIP address, or * for all addresses). Inside each <VIRTUALHOST> block, you will need at minimum a SERVERNAMEdirective to designate which host is served and a DOCUMENTROOT directive to show where in the filesystem thecontent for that host lives.

=⇒Main host goes awayIf you are adding virtual hosts to an existing web server, you must also create a <VIRTUAL-HOST> block for the existing host. The SERVERNAME and DOCUMENTROOT included inthis virtual host should be the same as the global SERVERNAME and DOCUMENTROOT. Listthis virtual host first in the configuration file so that it will act as the default host.

For example, suppose that you are serving the domain www.domain.tld and you wish to add the virtualhost www.otherdomain.tld, which points at the same IP address. Then you simply add the following tohttpd.conf:

NameVirtualHost *:80

<VirtualHost *:80>

ServerName www.domain.tldServerAlias domain.tld *.domain.tldDocumentRoot /www/domain

</VirtualHost>

<VirtualHost *:80>

ServerName www.otherdomain.tldDocumentRoot /www/otherdomain

</VirtualHost>

You can alternatively specify an explicit IP address in place of the * in both the NAMEVIRTUALHOST and <VIRTU-ALHOST> directives. For example, you might want to do this in order to run some name-based virtual hosts on oneIP address, and either IP-based, or another set of name-based virtual hosts on another address.

Many servers want to be accessible by more than one name. This is possible with the SERVERALIAS directive, placedinside the <VIRTUALHOST> section. For example in the first <VIRTUALHOST> block above, the SERVERALIASdirective indicates that the listed names are other names which people can use to see that same web site:

ServerAlias domain.tld *.domain.tld

then requests for all hosts in the domain.tld domain will be served by the www.domain.tld virtual host. Thewildcard characters * and ? can be used to match names. Of course, you can’t just make up names and place them inSERVERNAME or ServerAlias. You must first have your DNS server properly configured to map those names toan IP address associated with your server.

Finally, you can fine-tune the configuration of the virtual hosts by placing other directives inside the <VIRTUAL-HOST> containers. Most directives can be placed in these containers and will then change the configuration only ofthe relevant virtual host. To find out if a particular directive is allowed, check the Context (p. 299) of the directive.Configuration directives set in the main server context (outside any <VIRTUALHOST> container) will be used only ifthey are not overridden by the virtual host settings.

Now when a request arrives, the server will first check if it is using an IP address that matches the NAMEVIRTUAL-HOST. If it is, then it will look at each <VIRTUALHOST> section with a matching IP address and try to find one wherethe SERVERNAME or ServerAlias matches the requested hostname. If it finds one, then it uses the configurationfor that server. If no matching virtual host is found, then the first listed virtual host that matches the IP address willbe used.

Page 121: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

3.2. NAME-BASED VIRTUAL HOST SUPPORT 113

As a consequence, the first listed virtual host is the default virtual host. The DOCUMENTROOT from the main serverwill never be used when an IP address matches the NAMEVIRTUALHOST directive. If you would like to have aspecial configuration for requests that do not match any particular virtual host, simply put that configuration in a<VIRTUALHOST> container and list it first in the configuration file.

Compatibility with Older Browsers

As mentioned earlier, there are some clients who do not send the required data for the name-based virtual hosts towork properly. These clients will always be sent the pages from the first virtual host listed for that IP address (theprimary name-based virtual host).

=⇒How much older?Please note that when we say older, we really do mean older. You are very unlikely to encounterone of these browsers in use today. All current versions of any browser send the Host headeras required for name-based virtual hosts.

There is a possible workaround with the SERVERPATH directive, albeit a slightly cumbersome one:

Example configuration:

NameVirtualHost 111.22.33.44

<VirtualHost 111.22.33.44>

ServerName www.domain.tldServerPath /domainDocumentRoot /web/domain

</VirtualHost>

What does this mean? It means that a request for any URI beginning with "/domain" will be served from the virtualhost www.domain.tld. This means that the pages can be accessed as http://www.domain.tld/domain/for all clients, although clients sending a Host: header can also access it as http://www.domain.tld/.

In order to make this work, put a link on your primary virtual host’s page tohttp://www.domain.tld/domain/. Then, in the virtual host’s pages, be sure to use either purelyrelative links (e.g., "file.html" or "../icons/image.gif") or links containing the prefacing /domain/(e.g., "http://www.domain.tld/domain/misc/file.html" or "/domain/misc/file.html").

This requires a bit of discipline, but adherence to these guidelines will, for the most part, ensure that your pages willwork with all browsers, new and old.

Page 122: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

114 CHAPTER 3. APACHE VIRTUAL HOST DOCUMENTATION

3.3 Apache IP-based Virtual Host Support

See also

• Name-based Virtual Hosts Support (p. 111)

System requirements

As the term IP-based indicates, the server must have a different IP address for each IP-based virtual host. Thiscan be achieved by the machine having several physical network connections, or by use of virtual interfaces which aresupported by most modern operating systems (see system documentation for details, these are frequently called "ipaliases", and the "ifconfig" command is most commonly used to set them up).

How to set up Apache

There are two ways of configuring apache to support multiple hosts. Either by running a separate httpd daemon foreach hostname, or by running a single daemon which supports all the virtual hosts.

Use multiple daemons when:

• There are security partitioning issues, such as company1 does not want anyone at company2 to be able to readtheir data except via the web. In this case you would need two daemons, each running with different USER,GROUP, LISTEN, and SERVERROOT settings.

• You can afford the memory and file descriptor requirements (p. 291) of listening to every IP alias on the machine.It’s only possible to LISTEN to the "wildcard" address, or to specific addresses. So if you have a need to listento a specific address for whatever reason, then you will need to listen to all specific addresses. (Although onehttpd could listen to N-1 of the addresses, and another could listen to the remaining address.)

Use a single daemon when:

• Sharing of the httpd configuration between virtual hosts is acceptable.

• The machine services a large number of requests, and so the performance loss in running separate daemons maybe significant.

Setting up multiple daemons

Create a separate httpd installation for each virtual host. For each installation, use the LISTEN directive in theconfiguration file to select which IP address (or virtual host) that daemon services. e.g.

Listen www.smallco.com:80

It is recommended that you use an IP address instead of a hostname (see DNS caveats (p. 136) ).

Setting up a single daemon with virtual hosts

For this case, a single httpd will service requests for the main server and all the virtual hosts. The VIRTUALHOSTdirective in the configuration file is used to set the values of SERVERADMIN, SERVERNAME, DOCUMENTROOT,ERRORLOG and TRANSFERLOG or CUSTOMLOG configuration directives to different values for each virtual host.e.g.

Page 123: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

3.3. APACHE IP-BASED VIRTUAL HOST SUPPORT 115

<VirtualHost www.smallco.com>ServerAdmin [email protected] /groups/smallco/wwwServerName www.smallco.comErrorLog /groups/smallco/logs/error logTransferLog /groups/smallco/logs/access log</VirtualHost>

<VirtualHost www.baygroup.org>ServerAdmin [email protected] /groups/baygroup/wwwServerName www.baygroup.orgErrorLog /groups/baygroup/logs/error logTransferLog /groups/baygroup/logs/access log

</VirtualHost>

It is recommended that you use an IP address instead of a hostname (see DNS caveats (p. 136) ).

Almost any configuration directive can be put in the VirtualHost directive, with the exception of directives that controlprocess creation and a few other directives. To find out if a directive can be used in the VirtualHost directive, checkthe Context (p. 299) using the directive index (p. 663) .

SUEXECUSERGROUP may be used inside a VirtualHost directive if the suEXEC wrapper (p. 68) is used.

SECURITY: When specifying where to write log files, be aware of some security risks which are present if anyoneother than the user that starts Apache has write access to the directory where they are written. See the security tips (p.40) document for details.

Page 124: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

116 CHAPTER 3. APACHE VIRTUAL HOST DOCUMENTATION

3.4 Dynamically Configured Mass Virtual Hosting

This document describes how to efficiently serve an arbitrary number of virtual hosts with the Apache httpd webserver.

Motivation

The techniques described here are of interest if your httpd.conf contains many <VirtualHost> sections thatare substantially the same, for example:

NameVirtualHost 111.22.33.44<VirtualHost 111.22.33.44>

ServerName www.customer-1.comDocumentRoot /www/hosts/www.customer-1.com/docsScriptAlias /cgi-bin/ /www/hosts/www.customer-1.com/cgi-bin

</VirtualHost><VirtualHost 111.22.33.44>

ServerName www.customer-2.comDocumentRoot /www/hosts/www.customer-2.com/docsScriptAlias /cgi-bin/ /www/hosts/www.customer-2.com/cgi-bin

</VirtualHost># blah blah blah<VirtualHost 111.22.33.44>

ServerName www.customer-N.comDocumentRoot /www/hosts/www.customer-N.com/docsScriptAlias /cgi-bin/ /www/hosts/www.customer-N.com/cgi-bin

</VirtualHost>

The basic idea is to replace all of the static <VirtualHost> configurations with a mechanism that works them outdynamically. This has a number of advantages:

1. Your configuration file is smaller, so Apache starts more quickly and uses less memory.

2. Adding virtual hosts is simply a matter of creating the appropriate directories in the filesystem and entries in theDNS - you don’t need to reconfigure or restart Apache.

The main disadvantage is that you cannot have a different log file for each virtual host; however, if you have manyvirtual hosts, doing this can be a bad idea anyway, because of the number of file descriptors needed. It is better to logto a pipe or a fifo, and arrange for the process at the other end to distribute the logs to the customers. (This can also beused to accumulate statistics, etc.).

Overview

A virtual host is defined by two pieces of information: its IP address, and the contents of the Host: header inthe HTTP request. The dynamic mass virtual hosting technique used here is based on automatically inserting thisinformation into the pathname of the file that is used to satisfy the request. This can be most easily done by usingMOD VHOST ALIAS with Apache 2.0. Alternatively, MOD REWRITE can be used. Both of these modules are disabledby default; you must enable one of them when configuring and building Apache if you want to use this technique.

A couple of things need to be ‘faked’ to make the dynamic virtual host look like a normal one. The most impor-tant is the server name, which is used by Apache to generate self-referential URLs etc. It is configured with theServerName directive, and it is available to CGIs via the SERVER NAME environment variable. The actual value

Page 125: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

3.4. DYNAMICALLY CONFIGURED MASS VIRTUAL HOSTING 117

used at run time is controlled by the USECANONICALNAME setting. With UseCanonicalName Off, the servername is taken from the contents of the Host: header in the request. With UseCanonicalName DNS, it is takenfrom a reverse DNS lookup of the virtual host’s IP address. The former setting is used for name-based dynamic virtualhosting, and the latter is used for IP-based hosting. If Apache cannot work out the server name because there is noHost: header, or the DNS lookup fails, then the value configured with ServerName is used instead.

The other thing to ‘fake’ is the document root (configured with DocumentRoot and available to CGIs via theDOCUMENT ROOT environment variable). In a normal configuration, this is used by the core module when mappingURIs to filenames, but when the server is configured to do dynamic virtual hosting, that job must be taken over byanother module (either mod vhost alias or mod rewrite), which has a different way of doing the mapping.Neither of these modules is responsible for setting the DOCUMENT ROOT environment variable so if any CGIs or SSIdocuments make use of it, they will get a misleading value.

Simple Dynamic Virtual Hosts

This extract from httpd.conf implements the virtual host arrangement outlined in the Motivation section above,but in a generic fashion using mod vhost alias.

# get the server name from the Host: headerUseCanonicalName Off

# this log format can be split per-virtual-host based on the firstfieldLogFormat "%V %h %l %u %t \"%r\" %s %b" vcommonCustomLog logs/access log vcommon

# include the server name in the filenames used to satisfy requestsVirtualDocumentRoot /www/hosts/%0/docs

VirtualScriptAlias /www/hosts/%0/cgi-bin

This configuration can be changed into an IP-based virtual hosting solution by just turning UseCanonicalNameOff into UseCanonicalName DNS. The server name that is inserted into the filename is then derived from the IPaddress of the virtual host.

A Virtually Hosted Homepages System

This is an adjustment of the above system, tailored for an ISP’s homepages server. Using a slightly more complicatedconfiguration, we can select substrings of the server name to use in the filename so that, for example, the documents forwww.user.isp.com are found in /home/user/. It uses a single cgi-bin directory instead of one per virtualhost.

# all the preliminary stuff is the same as above, then

# include part of the server name in the filenamesVirtualDocumentRoot /www/hosts/%2/docs

# single cgi-bin directory

ScriptAlias /cgi-bin/ /www/std-cgi/

There are examples of more complicated VirtualDocumentRoot settings in the MOD VHOST ALIAS documen-tation.

Page 126: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

118 CHAPTER 3. APACHE VIRTUAL HOST DOCUMENTATION

Using Multiple Virtual Hosting Systems on the Same Server

With more complicated setups, you can use Apache’s normal <VirtualHost> directives to control the scope of thevarious virtual hosting configurations. For example, you could have one IP address for general customers’ homepages,and another for commercial customers, with the following setup. This can, of course, be combined with conventional<VirtualHost> configuration sections.

UseCanonicalName Off

LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon

<Directory /www/commercial>

Options FollowSymLinksAllowOverride All

</Directory>

<Directory /www/homepages>

Options FollowSymLinksAllowOverride None

</Directory>

<VirtualHost 111.22.33.44>

ServerName www.commercial.isp.com

CustomLog logs/access log.commercial vcommon

VirtualDocumentRoot /www/commercial/%0/docsVirtualScriptAlias /www/commercial/%0/cgi-bin

</VirtualHost>

<VirtualHost 111.22.33.45>

ServerName www.homepages.isp.com

CustomLog logs/access log.homepages vcommon

VirtualDocumentRoot /www/homepages/%0/docsScriptAlias /cgi-bin/ /www/std-cgi/

</VirtualHost>

More Efficient IP-Based Virtual Hosting

The configuration changes suggested to turn the first example into an IP-based virtual hosting setup result in a ratherinefficient setup. A new DNS lookup is required for every request. To avoid this overhead, the filesystem can bearranged to correspond to the IP addresses, instead of to the host names, thereby negating the need for a DNS lookup.Logging will also have to be adjusted to fit this system.

# get the server name from the reverse DNS of the IP addressUseCanonicalName DNS

# include the IP address in the logs so they may be splitLogFormat "%A %h %l %u %t \"%r\" %s %b" vcommonCustomLog logs/access log vcommon

# include the IP address in the filenamesVirtualDocumentRootIP /www/hosts/%0/docs

VirtualScriptAliasIP /www/hosts/%0/cgi-bin

Page 127: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

3.4. DYNAMICALLY CONFIGURED MASS VIRTUAL HOSTING 119

Simple Dynamic Virtual Hosts Using MOD REWRITE

This extract from httpd.conf does the same thing as the first example. The first half is very similar to the corre-sponding part above, except for some changes, required for backward compatibility and to make the mod rewritepart work properly; the second half configures mod rewrite to do the actual work.

There are a couple of especially tricky bits: by default, mod rewrite runs before other URI translation modules(mod alias etc.) - so if you wish to use these modules, mod rewrite must be configured to accommodate them.Also, some magic is required to do a per-dynamic-virtual-host equivalent of ScriptAlias.

# get the server name from the Host: headerUseCanonicalName Off

# splittable logsLogFormat "%{Host}i %h %l %u %t \"%r\" %s %b" vcommonCustomLog logs/access log vcommon

<Directory /www/hosts>

# ExecCGI is needed here because we can’t force# CGI execution in the way that ScriptAlias doesOptions FollowSymLinks ExecCGI

</Directory>

# now for the hard bit

RewriteEngine On

# a ServerName derived from a Host: header may be any case at allRewriteMap lowercase int:tolower

## deal with normal documents first:# allow Alias /icons/ to work - repeat for other aliasesRewriteCond %{REQUEST URI} !ˆ/icons/# allow CGIs to workRewriteCond %{REQUEST URI} !ˆ/cgi-bin/# do the magicRewriteRule ˆ/(.*)$ /www/hosts/${lowercase:%{SERVER NAME}}/docs/$1## and now deal with CGIs - we have to force a MIME typeRewriteCond %{REQUEST URI} ˆ/cgi-bin/RewriteRule ˆ/(.*)$ /www/hosts/${lowercase:%{SERVER NAME}}/cgi-bin/$1[T=application/x-httpd-cgi]

# that’s it!

A Homepages System Using mod rewrite

This does the same thing as the second example.

Page 128: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

120 CHAPTER 3. APACHE VIRTUAL HOST DOCUMENTATION

RewriteEngine on

RewriteMap lowercase int:tolower

# allow CGIs to workRewriteCond %{REQUEST URI} !ˆ/cgi-bin/

# check the hostname is right so that the RewriteRule worksRewriteCond ${lowercase:%{SERVER NAME}} ˆwww\.[a-z-]+\.isp\.com$# concatenate the virtual host name onto the start of the URI# the [C] means do the next rewrite on the result of this oneRewriteRule ˆ(.+) ${lowercase:%{SERVER NAME}}$1 [C]

# now create the real file nameRewriteRule ˆwww\.([a-z-]+)\.isp\.com/(.*) /home/$1/$2

# define the global CGI directory

ScriptAlias /cgi-bin/ /www/std-cgi/

Using a Separate Virtual Host Configuration File

This arrangement uses more advanced MOD REWRITE features to work out the translation from virtual host to docu-ment root, from a separate configuration file. This provides more flexibility, but requires more complicated configura-tion.

The vhost.map file should look something like this:

www.customer-1.com /www/customers/1www.customer-2.com /www/customers/2# ...

www.customer-N.com /www/customers/N

The httpd.conf should contain the following:

RewriteEngine on

RewriteMap lowercase int:tolower

# define the map fileRewriteMap vhost txt:/www/conf/vhost.map

# deal with aliases as aboveRewriteCond %{REQUEST URI} !ˆ/icons/RewriteCond %{REQUEST URI} !ˆ/cgi-bin/RewriteCond ${lowercase:%{SERVER NAME}} ˆ(.+)$# this does the file-based remapRewriteCond ${vhost:%1} ˆ(/.*)$RewriteRule ˆ/(.*)$ %1/docs/$1

RewriteCond %{REQUEST URI} ˆ/cgi-bin/RewriteCond ${lowercase:%{SERVER NAME}} ˆ(.+)$RewriteCond ${vhost:%1} ˆ(/.*)$

RewriteRule ˆ/(.*)$ %1/cgi-bin/$1 [T=application/x-httpd-cgi]

Page 129: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

3.5. VIRTUALHOST EXAMPLES 121

3.5 VirtualHost Examples

This document attempts to answer the commonly-asked questions about setting up virtual hosts. These scenarios arethose involving multiple web sites running on a single server, via name-based (p. 111) or IP-based (p. 114) virtualhosts.

Running several name-based web sites on a single IP address.

Your server has a single IP address, and multiple aliases (CNAMES) point to this machine in DNS. You want to run aweb server for www.example1.com and www.example2.org on this machine.

=⇒NoteCreating virtual host configurations on your Apache server does not magically cause DNSentries to be created for those host names. You must have the names in DNS, resolving to yourIP address, or nobody else will be able to see your web site. You can put entries in your hostsfile for local testing, but that will work only from the machine with those hosts entries.

Server configuration# Ensure that Apache listens on port 80Listen 80

# Listen for virtual host requests on all IP addressesNameVirtualHost *:80

<VirtualHost *:80>

DocumentRoot /www/example1ServerName www.example1.com

# Other directives here

</VirtualHost>

<VirtualHost *:80>

DocumentRoot /www/example2ServerName www.example2.org

# Other directives here

</VirtualHost>

The asterisks match all addresses, so the main server serves no requests. Due to the fact that www.example1.comis first in the configuration file, it has the highest priority and can be seen as the default or primary server. That meansthat if a request is received that does not match one of the specified ServerName directives, it will be served by thisfirst VirtualHost.

=⇒Note

You can, if you wish, replace * with the actual IP address of the system. In that case, theargument to VirtualHost must match the argument to NameVirtualHost:

NameVirtualHost 172.20.30.40

<VirtualHost 172.20.30.40>

# etc ...

However, it is additionally useful to use * on systems where the IP address is not predictable- for example if you have a dynamic IP address with your ISP, and you are using some varietyof dynamic DNS solution. Since * matches any IP address, this configuration would workwithout changes whenever your IP address changes.

Page 130: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

122 CHAPTER 3. APACHE VIRTUAL HOST DOCUMENTATION

The above configuration is what you will want to use in almost all name-based virtual hosting situations. The onlything that this configuration will not work for, in fact, is when you are serving different content based on differing IPaddresses or ports.

Name-based hosts on more than one IP address.

=⇒NoteAny of the techniques discussed here can be extended to any number of IP addresses.

The server has two IP addresses. On one (172.20.30.40), we will serve the "main" server,server.domain.com and on the other (172.20.30.50), we will serve two or more virtual hosts.

Server configurationListen 80

# This is the "main" server running on 172.20.30.40ServerName server.domain.comDocumentRoot /www/mainserver

# This is the other addressNameVirtualHost 172.20.30.50

<VirtualHost 172.20.30.50>

DocumentRoot /www/example1ServerName www.example1.com

# Other directives here ...

</VirtualHost>

<VirtualHost 172.20.30.50>

DocumentRoot /www/example2ServerName www.example2.org

# Other directives here ...

</VirtualHost>

Any request to an address other than 172.20.30.50 will be served from the main server. A request to172.20.30.50 with an unknown hostname, or no Host: header, will be served from www.example1.com.

Serving the same content on different IP addresses (such as an internal and external address).

The server machine has two IP addresses (192.168.1.1 and 172.20.30.40). The machine is sitting be-tween an internal (intranet) network and an external (internet) network. Outside of the network, the nameserver.example.com resolves to the external address (172.20.30.40), but inside the network, that samename resolves to the internal address (192.168.1.1).

The server can be made to respond to internal and external requests with the same content, with just oneVirtualHost section.

Server configurationNameVirtualHost 192.168.1.1NameVirtualHost 172.20.30.40

<VirtualHost 192.168.1.1 172.20.30.40>

DocumentRoot /www/server1ServerName server.example.comServerAlias server

</VirtualHost>

Page 131: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

3.5. VIRTUALHOST EXAMPLES 123

Now requests from both networks will be served from the same VirtualHost.

=⇒Note:On the internal network, one can just use the name server rather than the fully qualified hostname server.example.com.Note also that, in the above example, you can replace the list of IP addresses with *, whichwill cause the server to respond the same on all addresses.

Running different sites on different ports.

You have multiple domains going to the same IP and also want to serve multiple ports. By defining the ports inthe "NameVirtualHost" tag, you can allow this to work. If you try using <VirtualHost name:port> without theNameVirtualHost name:port or you try to use the Listen directive, your configuration will not work.

Server configurationListen 80Listen 8080

NameVirtualHost 172.20.30.40:80NameVirtualHost 172.20.30.40:8080

<VirtualHost 172.20.30.40:80>

ServerName www.example1.comDocumentRoot /www/domain-80

</VirtualHost>

<VirtualHost 172.20.30.40:8080>

ServerName www.example1.comDocumentRoot /www/domain-8080

</VirtualHost>

<VirtualHost 172.20.30.40:80>

ServerName www.example2.orgDocumentRoot /www/otherdomain-80

</VirtualHost>

<VirtualHost 172.20.30.40:8080>

ServerName www.example2.orgDocumentRoot /www/otherdomain-8080

</VirtualHost>

IP-based virtual hosting

The server has two IP addresses (172.20.30.40 and 172.20.30.50) which resolve to the nameswww.example1.com and www.example2.org respectively.

Page 132: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

124 CHAPTER 3. APACHE VIRTUAL HOST DOCUMENTATION

Server configurationListen 80

<VirtualHost 172.20.30.40>

DocumentRoot /www/example1ServerName www.example1.com

</VirtualHost>

<VirtualHost 172.20.30.50>

DocumentRoot /www/example2ServerName www.example2.org

</VirtualHost>

Requests for any address not specified in one of the <VirtualHost> directives (such as localhost, for example)will go to the main server, if there is one.

Mixed port-based and ip-based virtual hosts

The server machine has two IP addresses (172.20.30.40 and 172.20.30.50) which resolve to the nameswww.example1.com and www.example2.org respectively. In each case, we want to run hosts on ports 80and 8080.

Server configurationListen 172.20.30.40:80Listen 172.20.30.40:8080Listen 172.20.30.50:80Listen 172.20.30.50:8080

<VirtualHost 172.20.30.40:80>

DocumentRoot /www/example1-80ServerName www.example1.com

</VirtualHost>

<VirtualHost 172.20.30.40:8080>

DocumentRoot /www/example1-8080ServerName www.example1.com

</VirtualHost>

<VirtualHost 172.20.30.50:80>

DocumentRoot /www/example2-80ServerName www.example1.org

</VirtualHost>

<VirtualHost 172.20.30.50:8080>

DocumentRoot /www/example2-8080ServerName www.example2.org

</VirtualHost>

Mixed name-based and IP-based vhosts

On some of my addresses, I want to do name-based virtual hosts, and on others, IP-based hosts.

Page 133: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

3.5. VIRTUALHOST EXAMPLES 125

Server configurationListen 80

NameVirtualHost 172.20.30.40

<VirtualHost 172.20.30.40>

DocumentRoot /www/example1ServerName www.example1.com

</VirtualHost>

<VirtualHost 172.20.30.40>

DocumentRoot /www/example2ServerName www.example2.org

</VirtualHost>

<VirtualHost 172.20.30.40>

DocumentRoot /www/example3ServerName www.example3.net

</VirtualHost>

# IP-based<VirtualHost 172.20.30.50>

DocumentRoot /www/example4ServerName www.example4.edu

</VirtualHost>

<VirtualHost 172.20.30.60>

DocumentRoot /www/example5ServerName www.example5.gov

</VirtualHost>

Using Virtual host and mod proxy together

The following example allows a front-end machine to proxy a virtual host through to a server running on anothermachine. In the example, a virtual host of the same name is configured on a machine at 192.168.111.2. ThePROXYPRESERVEHOST ON directive is used so that the desired hostname is passed through, in case we are proxyingmultiple hostnames to a single machine.

<VirtualHost *:*>ProxyPreserveHost OnProxyPass / http://192.168.111.2/ProxyPassReverse / http://192.168.111.2/ServerName hostname.example.com

</VirtualHost>

Using default vhosts

default vhosts for all ports

Catching every request to any unspecified IP address and port, i.e., an address/port combination that is not used forany other virtual host.

Page 134: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

126 CHAPTER 3. APACHE VIRTUAL HOST DOCUMENTATION

Server configuration<VirtualHost default :*>

DocumentRoot /www/default

</VirtualHost>

Using such a default vhost with a wildcard port effectively prevents any request going to the main server.

A default vhost never serves a request that was sent to an address/port that is used for name-based vhosts. If the requestcontained an unknown or no Host: header it is always served from the primary name-based vhost (the vhost for thataddress/port appearing first in the configuration file).

You can use ALIASMATCH or REWRITERULE to rewrite any request to a single information page (or script).

default vhosts for different ports

Same as setup 1, but the server listens on several ports and we want to use a second default vhost for port 80.

Server configuration<VirtualHost default :80>

DocumentRoot /www/default80# ...

</VirtualHost>

<VirtualHost default :*>

DocumentRoot /www/default# ...

</VirtualHost>

The default vhost for port 80 (which must appear before any default vhost with a wildcard port) catches all requeststhat were sent to an unspecified IP address. The main server is never used to serve a request.

default vhosts for one port

We want to have a default vhost for port 80, but no other default vhosts.

Server configuration<VirtualHost default :80>DocumentRoot /www/default...

</VirtualHost>

A request to an unspecified address on port 80 is served from the default vhost any other request to an unspecifiedaddress and port is served from the main server.

Migrating a name-based vhost to an IP-based vhost

The name-based vhost with the hostname www.example2.org (from our name-based example, setup 2) should getits own IP address. To avoid problems with name servers or proxies who cached the old IP address for the name-basedvhost we want to provide both variants during a migration phase.The solution is easy, because we can simply add the new IP address (172.20.30.50) to the VirtualHost direc-tive.

Page 135: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

3.5. VIRTUALHOST EXAMPLES 127

Server configurationListen 80ServerName www.example1.comDocumentRoot /www/example1

NameVirtualHost 172.20.30.40

<VirtualHost 172.20.30.40 172.20.30.50>

DocumentRoot /www/example2ServerName www.example2.org# ...

</VirtualHost>

<VirtualHost 172.20.30.40>

DocumentRoot /www/example3ServerName www.example3.netServerAlias *.example3.net# ...

</VirtualHost>

The vhost can now be accessed through the new address (as an IP-based vhost) and through the old address (as aname-based vhost).

Using the ServerPath directive

We have a server with two name-based vhosts. In order to match the correct virtual host a client must send the correctHost: header. Old HTTP/1.0 clients do not send such a header and Apache has no clue what vhost the client triedto reach (and serves the request from the primary vhost). To provide as much backward compatibility as possiblewe create a primary vhost which returns a single page containing links with an URL prefix to the name-based virtualhosts.

Server configurationNameVirtualHost 172.20.30.40

<VirtualHost 172.20.30.40>

# primary vhostDocumentRoot /www/subdomainRewriteEngine OnRewriteRule ˆ/.* /www/subdomain/index.html# ...

</VirtualHost>

<VirtualHost 172.20.30.40>DocumentRoot /www/subdomain/sub1

ServerName www.sub1.domain.tldServerPath /sub1/RewriteEngine OnRewriteRule ˆ(/sub1/.*) /www/subdomain$1# ...

</VirtualHost>

<VirtualHost 172.20.30.40>

DocumentRoot /www/subdomain/sub2ServerName www.sub2.domain.tldServerPath /sub2/RewriteEngine OnRewriteRule ˆ(/sub2/.*) /www/subdomain$1# ...

</VirtualHost>

Page 136: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

128 CHAPTER 3. APACHE VIRTUAL HOST DOCUMENTATION

Due to the SERVERPATH directive a request to the URL http://www.sub1.domain.tld/sub1/ is alwaysserved from the sub1-vhost.A request to the URL http://www.sub1.domain.tld/ is only served from the sub1-vhost if the client sent acorrect Host: header. If no Host: header is sent the client gets the information page from the primary host.Please note that there is one oddity: A request to http://www.sub2.domain.tld/sub1/ is also served fromthe sub1-vhost if the client sent no Host: header.The REWRITERULE directives are used to make sure that a client which sent a correct Host: header can use bothURL variants, i.e., with or without URL prefix.

Page 137: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

3.6. AN IN-DEPTH DISCUSSION OF VIRTUAL HOST MATCHING 129

3.6 An In-Depth Discussion of Virtual Host Matching

The virtual host code was completely rewritten in Apache 1.3. This document attempts to explain exactly what Apachedoes when deciding what virtual host to serve a hit from. With the help of the new NAMEVIRTUALHOST directivevirtual host configuration should be a lot easier and safer than with versions prior to 1.3.

If you just want to make it work without understanding how, here are some examples (p. 121) .

Config File Parsing

There is a main server which consists of all the definitions appearing outside of <VirtualHost> sections. Thereare virtual servers, called vhosts, which are defined by <VIRTUALHOST> sections.

The directives LISTEN, SERVERNAME, SERVERPATH, and SERVERALIAS can appear anywhere within the definitionof a server. However, each appearance overrides the previous appearance (within that server).

The default value of the Listen field for main server is 80. The main server has no default ServerPath, orServerAlias. The default ServerName is deduced from the server’s IP address.

The main server Listen directive has two functions. One function is to determine the default network port Apache willbind to. The second function is to specify the port number which is used in absolute URIs during redirects.

Unlike the main server, vhost ports do not affect what ports Apache listens for connections on.

Each address appearing in the VirtualHost directive can have an optional port. If the port is unspecified it defaultsto the value of the main server’s most recent Listen statement. The special port * indicates a wildcard that matchesany port. Collectively the entire set of addresses (including multiple A record results from DNS lookups) are calledthe vhost’s address set.

Unless a NAMEVIRTUALHOST directive is used for a specific IP address the first vhost with that address is treated asan IP-based vhost. The IP address can also be the wildcard *.

If name-based vhosts should be used a NameVirtualHost directive must appear with the IP address set to be usedfor the name-based vhosts. In other words, you must specify the IP address that holds the hostname aliases (CNAMEs)for your name-based vhosts via a NameVirtualHost directive in your configuration file.

Multiple NameVirtualHost directives can be used each with a set of VirtualHost directives but only oneNameVirtualHost directive should be used for each specific IP:port pair.

The ordering of NameVirtualHost and VirtualHost directives is not important which makes the followingtwo examples identical (only the order of the VirtualHost directives for one address set is important, see below):

Page 138: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

130 CHAPTER 3. APACHE VIRTUAL HOST DOCUMENTATION

NameVirtualHost 111.22.33.44<VirtualHost 111.22.33.44># server A...</VirtualHost><VirtualHost 111.22.33.44># server B...</VirtualHost>

NameVirtualHost 111.22.33.55<VirtualHost 111.22.33.55># server C...</VirtualHost><VirtualHost 111.22.33.55># server D...</VirtualHost>

<VirtualHost 111.22.33.44># server A</VirtualHost><VirtualHost 111.22.33.55># server C...</VirtualHost><VirtualHost 111.22.33.44># server B...</VirtualHost><VirtualHost 111.22.33.55># server D...</VirtualHost>

NameVirtualHost 111.22.33.44NameVirtualHost 111.22.33.55

(To aid the readability of your configuration you should prefer the left variant.)

After parsing the VirtualHost directive, the vhost server is given a default Listen equal to the port assigned tothe first name in its VirtualHost directive.

The complete list of names in the VirtualHost directive are treated just like a ServerAlias (but are not over-ridden by any ServerAlias statement) if all names resolve to the same address set. Note that subsequent Listenstatements for this vhost will not affect the ports assigned in the address set.

During initialization a list for each IP address is generated and inserted into an hash table. If the IP address is used in aNameVirtualHost directive the list contains all name-based vhosts for the given IP address. If there are no vhostsdefined for that address the NameVirtualHost directive is ignored and an error is logged. For an IP-based vhostthe list in the hash table is empty.

Due to a fast hashing function the overhead of hashing an IP address during a request is minimal and almost notexistent. Additionally the table is optimized for IP addresses which vary in the last octet.

For every vhost various default values are set. In particular:

1. If a vhost has no SERVERADMIN, TIMEOUT, KEEPALIVETIMEOUT, KEEPALIVE, MAXKEEPALIV-EREQUESTS, RECEIVEBUFFERSIZE, or SENDBUFFERSIZE directive then the respective value is inherited fromthe main server. (That is, inherited from whatever the final setting of that value is in the main server.)

2. The "lookup defaults" that define the default directory permissions for a vhost are merged with those of themain server. This includes any per-directory configuration information for any module.

3. The per-server configs for each module from the main server are merged into the vhost server.

Essentially, the main server is treated as "defaults" or a "base" on which to build each vhost. But the positioningof these main server definitions in the config file is largely irrelevant – the entire config of the main server has beenparsed when this final merging occurs. So even if a main server definition appears after a vhost definition it mightaffect the vhost definition.

If the main server has no ServerName at this point, then the hostname of the machine that httpd is runningon is used instead. We will call the main server address set those IP addresses returned by a DNS lookup on theServerName of the main server.

For any undefined ServerName fields, a name-based vhost defaults to the address given first in the VirtualHoststatement defining the vhost.

Page 139: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

3.6. AN IN-DEPTH DISCUSSION OF VIRTUAL HOST MATCHING 131

Any vhost that includes the magic default wildcard is given the same ServerName as the main server.

Virtual Host Matching

The server determines which vhost to use for a request as follows:

Hash table lookup

When the connection is first made by a client, the IP address to which the client connected is looked up in the internalIP hash table.

If the lookup fails (the IP address wasn’t found) the request is served from the default vhost if there is such avhost for the port to which the client sent the request. If there is no matching default vhost the request is servedfrom the main server.

If the IP address is not found in the hash table then the match against the port number may also result in an entrycorresponding to a NameVirtualHost *, which is subsequently handled like other name-based vhosts.

If the lookup succeeded (a corresponding list for the IP address was found) the next step is to decide if we have to dealwith an IP-based or a name-base vhost.

IP-based vhost

If the entry we found has an empty name list then we have found an IP-based vhost, no further actions are performedand the request is served from that vhost.

Name-based vhost

If the entry corresponds to a name-based vhost the name list contains one or more vhost structures. This list containsthe vhosts in the same order as the VirtualHost directives appear in the config file.

The first vhost on this list (the first vhost in the config file with the specified IP address) has the highest priority andcatches any request to an unknown server name or a request without a Host: header field.

If the client provided a Host: header field the list is searched for a matching vhost and the first hit on a ServerNameor ServerAlias is taken and the request is served from that vhost. A Host: header field can contain a port number,but Apache always matches against the real port to which the client sent the request.

If the client submitted a HTTP/1.0 request without Host: header field we don’t know to what server the client triedto connect and any existing ServerPath is matched against the URI from the request. The first matching path onthe list is used and the request is served from that vhost.

If no matching vhost could be found the request is served from the first vhost with a matching port number that is onthe list for the IP to which the client connected (as already mentioned before).

Persistent connections

The IP lookup described above is only done once for a particular TCP/IP session while the name lookup is done onevery request during a KeepAlive/persistent connection. In other words a client may request pages from differentname-based vhosts during a single persistent connection.

Page 140: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

132 CHAPTER 3. APACHE VIRTUAL HOST DOCUMENTATION

Absolute URI

If the URI from the request is an absolute URI, and its hostname and port match the main server or one of the configuredvirtual hosts and match the address and port to which the client sent the request, then the scheme/hostname/port prefixis stripped off and the remaining relative URI is served by the corresponding main server or virtual host. If it does notmatch, then the URI remains untouched and the request is taken to be a proxy request.

Observations

• A name-based vhost can never interfere with an IP-base vhost and vice versa. IP-based vhosts can only bereached through an IP address of its own address set and never through any other address. The same appliesto name-based vhosts, they can only be reached through an IP address of the corresponding address set whichmust be defined with a NameVirtualHost directive.

• ServerAlias and ServerPath checks are never performed for an IP-based vhost.

• The order of name-/IP-based, the default vhost and the NameVirtualHost directive within the configfile is not important. Only the ordering of name-based vhosts for a specific address set is significant. The onename-based vhosts that comes first in the configuration file has the highest priority for its corresponding addressset.

• For security reasons the port number given in a Host: header field is never used during the matching process.Apache always uses the real port to which the client sent the request.

• If a ServerPath directive exists which is a prefix of another ServerPath directive that appears later inthe configuration file, then the former will always be matched and the latter will never be matched. (That isassuming that no Host: header field was available to disambiguate the two.)

• If two IP-based vhosts have an address in common, the vhost appearing first in the config file is always matched.Such a thing might happen inadvertently. The server will give a warning in the error logfile when it detects this.

• A default vhost catches a request only if there is no other vhost with a matching IP address and a match-ing port number for the request. The request is only caught if the port number to which the client sent therequest matches the port number of your default vhost which is your standard Listen by default. Awildcard port can be specified (i.e., default :*) to catch requests to any available port. This also applies toNameVirtualHost * vhosts.

• The main server is only used to serve a request if the IP address and port number to which the client connected isunspecified and does not match any other vhost (including a default vhost). In other words the main serveronly catches a request for an unspecified address/port combination (unless there is a default vhost whichmatches that port).

• A default vhost or the main server is never matched for a request with an unknown or missing Host:header field if the client connected to an address (and port) which is used for name-based vhosts, e.g., in aNameVirtualHost directive.

• You should never specify DNS names in VirtualHost directives because it will force your server to rely onDNS to boot. Furthermore it poses a security threat if you do not control the DNS for all the domains listed.There’s more information (p. 136) available on this and the next two topics.

• ServerName should always be set for each vhost. Otherwise A DNS lookup is required for each vhost.

Tips

In addition to the tips on the DNS Issues (p. 136) page, here are some further tips:

• Place all main server definitions before any VirtualHost definitions. (This is to aid the readability of theconfiguration – the post-config merging process makes it non-obvious that definitions mixed in around virtualhosts might affect all virtual hosts.)

Page 141: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

3.6. AN IN-DEPTH DISCUSSION OF VIRTUAL HOST MATCHING 133

• Group corresponding NameVirtualHost and VirtualHost definitions in your configuration to ensurebetter readability.

• Avoid ServerPaths which are prefixes of other ServerPaths. If you cannot avoid this then you have toensure that the longer (more specific) prefix vhost appears earlier in the configuration file than the shorter (lessspecific) prefix (i.e., "ServerPath /abc" should appear after "ServerPath /abc/def").

Page 142: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

134 CHAPTER 3. APACHE VIRTUAL HOST DOCUMENTATION

3.7 File Descriptor Limits

When using a large number of Virtual Hosts, Apache may run out of available file descriptors (sometimes called filehandles) if each Virtual Host specifies different log files. The total number of file descriptors used by Apache isone for each distinct error log file, one for every other log file directive, plus 10-20 for internal use. Unix operatingsystems limit the number of file descriptors that may be used by a process; the limit is typically 64, and may usuallybe increased up to a large hard-limit.

Although Apache attempts to increase the limit as required, this may not work if:

1. Your system does not provide the setrlimit() system call.

2. The setrlimit(RLIMIT NOFILE) call does not function on your system (such as Solaris 2.3)

3. The number of file descriptors required exceeds the hard limit.

4. Your system imposes other limits on file descriptors, such as a limit on stdio streams only using file descriptorsbelow 256. (Solaris 2)

In the event of problems you can:

• Reduce the number of log files; don’t specify log files in the <VIRTUALHOST> sections, but only log to themain log files. (See Splitting up your log files, below, for more information on doing this.)

• If you system falls into 1 or 2 (above), then increase the file descriptor limit before starting Apache, using ascript like

#!/bin/shulimit -S -n 100

exec httpd

Please see the Descriptors and Apache (p. 291) document containing further details about file descriptor problems andhow they can be solved on your operating system.

Splitting up your log files

If you want to log multiple virtual hosts to the same log file, you may want to split up the log files afterwards in orderto run statistical analysis of the various virtual hosts. This can be accomplished in the following manner.

First, you will need to add the virtual host information to the log entries. This can be done using the LOGFORMATdirective, and the %v variable. Add this to the beginning of your log format string:

LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost

CustomLog logs/multiple vhost log vhost

This will create a log file in the common log format, but with the canonical virtual host (whatever appears in theSERVERNAME directive) prepended to each line. (See CUSTOM LOG FORMATS for more about customizing your logfiles.)

When you wish to split your log file into its component parts (one file per virtual host) you can use the programsplit-logfile (p. 269) to accomplish this. You’ll find this program in the support directory of theApache distribution.

Run this program with the command:

Page 143: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

3.7. FILE DESCRIPTOR LIMITS 135

split-logfile < /logs/multiple vhost log

This program, when run with the name of your vhost log file, will generate one file for each virtual host that appearsin your log file. Each file will be called hostname.log.

Page 144: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

136 CHAPTER 3. APACHE VIRTUAL HOST DOCUMENTATION

3.8 Issues Regarding DNS and Apache

This page could be summarized with the statement: don’t configure Apache in such a way that it relies on DNSresolution for parsing of the configuration files. If Apache requires DNS resolution to parse the configuration filesthen your server may be subject to reliability problems (ie. it might not boot), or denial and theft of service attacks(including users able to steal hits from other users).

A Simple Example

<VirtualHost www.abc.dom>ServerAdmin [email protected] /www/abc

</VirtualHost>

In order for Apache to function properly, it absolutely needs to have two pieces of information about each virtual host:the SERVERNAME and at least one IP address that the server will bind and respond to. The above example does notinclude the IP address, so Apache must use DNS to find the address of www.abc.dom. If for some reason DNS isnot available at the time your server is parsing its config file, then this virtual host will not be configured. It won’t beable to respond to any hits to this virtual host (prior to Apache version 1.2 the server would not even boot).

Suppose that www.abc.dom has address 10.0.0.1. Then consider this configuration snippet:

<VirtualHost 10.0.0.1>ServerAdmin [email protected] /www/abc

</VirtualHost>

This time Apache needs to use reverse DNS to find the ServerName for this virtualhost. If that reverse lookup failsthen it will partially disable the virtualhost (prior to Apache version 1.2 the server would not even boot). If the virtualhost is name-based then it will effectively be totally disabled, but if it is IP-based then it will mostly work. However,if Apache should ever have to generate a full URL for the server which includes the server name, then it will fail togenerate a valid URL.

Here is a snippet that avoids both of these problems:

<VirtualHost 10.0.0.1>ServerName www.abc.domServerAdmin [email protected] /www/abc

</VirtualHost>

Denial of Service

There are (at least) two forms that denial of service can come in. If you are running a version of Apache prior toversion 1.2 then your server will not even boot if one of the two DNS lookups mentioned above fails for any of yourvirtual hosts. In some cases this DNS lookup may not even be under your control; for example, if abc.dom is one ofyour customers and they control their own DNS, they can force your (pre-1.2) server to fail while booting simply bydeleting the www.abc.dom record.

Another form is far more insidious. Consider this configuration snippet:

Page 145: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

3.8. ISSUES REGARDING DNS AND APACHE 137

<VirtualHost www.abc.dom>ServerAdmin [email protected] /www/abc</VirtualHost>

<VirtualHost www.def.dom>ServerAdmin [email protected] /www/def

</VirtualHost>

Suppose that you’ve assigned 10.0.0.1 to www.abc.dom and 10.0.0.2 to www.def.dom. Furthermore, suppose thatdef.dom has control of their own DNS. With this config you have put def.dom into a position where they can stealall traffic destined to abc.dom. To do so, all they have to do is set www.def.dom to 10.0.0.1. Since they controltheir own DNS you can’t stop them from pointing the www.def.dom record wherever they wish.

Requests coming in to 10.0.0.1 (including all those where users typed in URLs of the formhttp://www.abc.dom/whatever) will all be served by the def.dom virtual host. To better under-stand why this happens requires a more in-depth discussion of how Apache matches up incoming requests with thevirtual host that will serve it. A rough document describing this is available (p. 129) .

The "main server" Address

The addition of name-based virtual host support (p. 111) in Apache 1.1 requires Apache to know the IP address(es) ofthe host that httpd is running on. To get this address it uses either the global SERVERNAME (if present) or calls theC function gethostname (which should return the same as typing "hostname" at the command prompt). Then itperforms a DNS lookup on this address. At present there is no way to avoid this lookup.

If you fear that this lookup might fail because your DNS server is down then you can insert the hostname in/etc/hosts (where you probably already have it so that the machine can boot properly). Then ensure that yourmachine is configured to use /etc/hosts in the event that DNS fails. Depending on what OS you are using thismight be accomplished by editing /etc/resolv.conf, or maybe /etc/nsswitch.conf.

If your server doesn’t have to perform DNS for any other reason then you might be able to get away with runningApache with the HOSTRESORDER environment variable set to "local". This all depends on what OS and resolverlibraries you are using. It also affects CGIs unless you use MOD ENV to control the environment. It’s best to consultthe man pages or FAQs for your OS.

Tips to Avoid These Problems

• use IP addresses in VIRTUALHOST

• use IP addresses in LISTEN

• ensure all virtual hosts have an explicit SERVERNAME

• create a <VirtualHost default :*> server that has no pages to serve

Appendix: Future Directions

The situation regarding DNS is highly undesirable. For Apache 1.2 we’ve attempted to make the server at leastcontinue booting in the event of failed DNS, but it might not be the best we can do. In any event, requiring the use ofexplicit IP addresses in configuration files is highly undesirable in today’s Internet where renumbering is a necessity.

A possible work around to the theft of service attack described above would be to perform a reverse DNS lookup onthe IP address returned by the forward lookup and compare the two names – in the event of a mismatch, the virtualhost

Page 146: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

138 CHAPTER 3. APACHE VIRTUAL HOST DOCUMENTATION

would be disabled. This would require reverse DNS to be configured properly (which is something that most adminsare familiar with because of the common use of "double-reverse" DNS lookups by FTP servers and TCP wrappers).

In any event, it doesn’t seem possible to reliably boot a virtual-hosted web server when DNS has failed unless IPaddresses are used. Partial solutions such as disabling portions of the configuration might be worse than not bootingat all depending on what the webserver is supposed to accomplish.

As HTTP/1.1 is deployed and browsers and proxies start issuing the Host header it will become possible to avoidthe use of IP-based virtual hosts entirely. In this case, a webserver has no requirement to do DNS lookups duringconfiguration. But as of March 1997 these features have not been deployed widely enough to be put into use oncritical webservers.

Page 147: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

Chapter 4

Apache Server Frequently Asked Questions

139

Page 148: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

140 CHAPTER 4. APACHE SERVER FREQUENTLY ASKED QUESTIONS

4.1 Frequently Asked Questions

The latest version of this FAQ is always available from the main Apache web site, at<http://httpd.apache.org/docs/2.0/faq/>. In addition, you can view this FAQ all in one page (p. ??) foreasy searching and printing.

Since Apache 2.0 is quite new, we don’t yet know what the Frequently Asked Questions will be. While this sectionfills up, you should also consult the Apache 1.3 FAQ1 to see if your question is answered there.

1http://httpd.apache.org/docs/misc/FAQ.html

Page 149: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

4.2. SUPPORT - FREQUENTLY ASKED QUESTIONS 141

4.2 Support - Frequently Asked Questions

Support

• "Why can’t I ...? Why won’t ... work?" What to do in case of problems

• Whom do I contact for support?

"Why can’t I ...? Why won’t ... work?" What to do in case of problems

If you are having trouble with your Apache server software, you should take the following steps:

Check the errorlog! Apache tries to be helpful when it encounters a problem. In many cases, it will provide somedetails by writing one or messages to the server error log. Sometimes this is enough for you to diagnose& fix the problem yourself (such as file permissions or the like). The default location of the error log is/usr/local/apache2/logs/error log, but see the ERRORLOG directive in your config files for thelocation on your server.

Check the FAQ2! The latest version of the Apache Frequently-Asked Questions list can always be found at the mainApache web site.

Check the Apache bug database Most problems that get reported to The Apache Group are recorded in the bugdatabase3. Please check the existing reports, open and closed, before adding one. If you find that your issue hasalready been reported, please don’t add a "me, too" report. If the original report isn’t closed yet, we suggestthat you check it periodically. You might also consider contacting the original submitter, because there may bean email exchange going on about the issue that isn’t getting recorded in the database.

Ask in a user support forum Apache has an active community of users who are willing to share their knowledge.Participating in this community is usually the best and fastest way to get answers to your questions and problems.

Users mailing list4

#httpd (p. ??) on Freenode IRC5 is available for user support issues.

USENET newsgroups:

• comp.infosystems.www.servers.unix [news6] [google7]• comp.infosystems.www.servers.ms-windows [news8] [google9]• comp.infosystems.www.authoring.cgi [news10] [google11]

If all else fails, report the problem in the bug database If you’ve gone through those steps above that are appropri-ate and have obtained no relief, then please do let the httpd developers know about the problem by logging abug report12.

If your problem involves the server crashing and generating a core dump, please include a backtrace (if possible).As an example,

3http://httpd.apache.org/bug report.html4http://httpd.apache.org/userslist.html5http://freenode.net6news:comp.infosystems.www.servers.unix7http://groups.google.com/groups?group=comp.infosystems.www.servers.unix8news:comp.infosystems.www.servers.ms-windows9http://groups.google.com/groups?group=comp.infosystems.www.servers.ms-windows

10news:comp.infosystems.www.authoring.cgi11http://groups.google.com/groups?group=comp.infosystems.www.authoring.cgi12http://httpd.apache.org/bug report.html

Page 150: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

142 CHAPTER 4. APACHE SERVER FREQUENTLY ASKED QUESTIONS

# cd ServerRoot# dbx httpd core

(dbx) where

(Substitute the appropriate locations for your ServerRoot and your httpd and core files. You may have to usegdb instead of dbx.)

Whom do I contact for support?

With several million users and fewer than forty volunteer developers, we cannot provide personal support for Apache.For free support, we suggest participating in a user forum.

Page 151: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

4.3. ERROR MESSAGES - FREQUENTLY ASKED QUESTIONS 143

4.3 Error Messages - Frequently Asked Questions

Error Messages

• Invalid argument: core output filter: writing data to the network

• AcceptEx failed

• Premature end of script headers

Invalid argument: core output filter: writing data to the network

Apache uses the sendfile syscall on platforms where it is available in order to speed sending of responses. Un-fortunately, on some systems, Apache will detect the presence of sendfile at compile-time, even when it does notwork properly. This happens most frequently when using network or other non-standard file-system.

Symptoms of this problem include the above message in the error log and zero-length responses to non-zero-sized files.The problem generally occurs only for static files, since dynamic content usually does not make use of sendfile.

To fix this problem, simply use the ENABLESENDFILE directive to disable sendfile for all or part of your server.Also see the ENABLEMMAP, which can help with similar problems.

AcceptEx Failed

If you get error messages related to the AcceptEx syscall on win32, see the WIN32DISABLEACCEPTEX directive.

Premature end of script headers

Most problems with CGI scripts result in this message written in the error log together with an Internal ServerError delivered to the browser. A guide to helping debug this type of problem is available in the CGI tutorial (p.185) .

Page 152: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

144 CHAPTER 4. APACHE SERVER FREQUENTLY ASKED QUESTIONS

Page 153: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

Chapter 5

Apache SSL/TLS Encryption

145

Page 154: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

146 CHAPTER 5. APACHE SSL/TLS ENCRYPTION

5.1 Apache SSL/TLS Encryption

The Apache HTTP Server module MOD SSL provides an interface to the OpenSSL1 library, which provides Strong En-cryption using the Secure Sockets Layer and Transport Layer Security protocols. The module and this documentationare based on Ralf S. Engelschall’s mod ssl project.

Documentation

• Introduction (p. 147)

• Compatibility (p. 156)

• How-To (p. 160)

• Frequently Asked Questions (p. 165)

• Glossary (p. 656)

mod ssl

Extensive documentation on the directives and environment variables provided by this module is provided in themod ssl reference documentation (p. 549) .

1http://www.openssl.org/

Page 155: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

5.2. SSL/TLS STRONG ENCRYPTION: AN INTRODUCTION 147

5.2 SSL/TLS Strong Encryption: An Introduction

The nice thing about standards is that there are so many to choose from. And if you really don’t likeall the standards you just have to wait another year until the one arises you are looking for.

– A. Tanenbaum, "Introduction to Computer Networks"

As an introduction this chapter is aimed at readers who are familiar with the Web, HTTP, and Apache, but are notsecurity experts. It is not intended to be a definitive guide to the SSL protocol, nor does it discuss specific techniquesfor managing certificates in an organization, or the important legal issues of patents and import and export restric-tions. Rather, it is intended to provide a common background to mod ssl users by pulling together various concepts,definitions, and examples as a starting point for further exploration.

The presented content is mainly derived, with permission by the author, from the article Introducing SSL and Cer-tificates using SSLeay2 from Frederick J. Hirsch3, of The Open Group Research Institute, which was published inWeb Security: A Matter of Trust4, World Wide Web Journal, Volume 2, Issue 3, Summer 1997. Please send anypositive feedback to Frederick Hirsch5 (the original article author) and all negative feedback to Ralf S. Engelschall6

(the MOD SSL author).

Cryptographic Techniques

Understanding SSL requires an understanding of cryptographic algorithms, message digest functions (aka. one-wayor hash functions), and digital signatures. These techniques are the subject of entire books (see for instance [AC96])and provide the basis for privacy, integrity, and authentication.

Cryptographic Algorithms

Suppose Alice wants to send a message to her bank to transfer some money. Alice would like the message to beprivate, since it will include information such as her account number and transfer amount. One solution is to use acryptographic algorithm, a technique that would transform her message into an encrypted form, unreadable exceptby those it is intended for. Once in this form, the message may only be interpreted through the use of a secret key.Without the key the message is useless: good cryptographic algorithms make it so difficult for intruders to decode theoriginal text that it isn’t worth their effort.

There are two categories of cryptographic algorithms: conventional and public key.

Conventional cryptography also known as symmetric cryptography, requires the sender and receiver to share a key:a secret piece of information that may be used to encrypt or decrypt a message. If this key is secret, then nobodyother than the sender or receiver may read the message. If Alice and the bank know a secret key, then they maysend each other private messages. The task of privately choosing a key before communicating, however, can beproblematic.

Public key cryptography also known as asymmetric cryptography, solves the key exchange problem by defining analgorithm which uses two keys, each of which may be used to encrypt a message. If one key is used to encrypt amessage then the other must be used to decrypt it. This makes it possible to receive secure messages by simplypublishing one key (the public key) and keeping the other secret (the private key).

Anyone may encrypt a message using the public key, but only the owner of the private key will be able to read it. Inthis way, Alice may send private messages to the owner of a key-pair (the bank), by encrypting it using their publickey. Only the bank will be able to decrypt it.

2http://home.earthlink.net/˜fjhirsch/Papers/wwwj/article.html3http://home.earthlink.net/˜fjhirsch/4http://www.ora.com/catalog/wjsum97/5mailto:[email protected]:[email protected]

Page 156: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

148 CHAPTER 5. APACHE SSL/TLS ENCRYPTION

Message Digests

Although Alice may encrypt her message to make it private, there is still a concern that someone might modify heroriginal message or substitute it with a different one, in order to transfer the money to themselves, for instance. Oneway of guaranteeing the integrity of Alice’s message is to create a concise summary of her message and send this tothe bank as well. Upon receipt of the message, the bank creates its own summary and compares it with the one Alicesent. If they agree then the message was received intact.

A summary such as this is called a message digest, one-way function or hash function. Message digests are usedto create short, fixed-length representations of longer, variable-length messages. Digest algorithms are designed toproduce unique digests for different messages. Message digests are designed to make it too difficult to determinethe message from the digest, and also impossible to find two different messages which create the same digest – thuseliminating the possibility of substituting one message for another while maintaining the same digest.

Another challenge that Alice faces is finding a way to send the digest to the bank securely; when this is achieved, theintegrity of the associated message is assured. One way to do this is to include the digest in a digital signature.

Digital Signatures

When Alice sends a message to the bank, the bank needs to ensure that the message is really from her, so an intruderdoes not request a transaction involving her account. A digital signature, created by Alice and included with themessage, serves this purpose.

Digital signatures are created by encrypting a digest of the message, and other information (such as a sequence number)with the sender’s private key. Though anyone may decrypt the signature using the public key, only the signer knowsthe private key. This means that only they may have signed it. Including the digest in the signature means the signatureis only good for that message; it also ensures the integrity of the message since no one can change the digest and stillsign it.

To guard against interception and reuse of the signature by an intruder at a later date, the signature contains a uniquesequence number. This protects the bank from a fraudulent claim from Alice that she did not send the message – onlyshe could have signed it (non-repudiation).

Certificates

Although Alice could have sent a private message to the bank, signed it, and ensured the integrity of the message, shestill needs to be sure that she is really communicating with the bank. This means that she needs to be sure that thepublic key she is using corresponds to the bank’s private key. Similarly, the bank also needs to verify that the messagesignature really corresponds to Alice’s signature.

If each party has a certificate which validates the other’s identity, confirms the public key, and is signed by a trustedagency, then they both will be assured that they are communicating with whom they think they are. Such a trustedagency is called a Certificate Authority, and certificates are used for authentication.

Certificate Contents

A certificate associates a public key with the real identity of an individual, server, or other entity, known as the subject.As shown in Table 1, information about the subject includes identifying information (the distinguished name), and thepublic key. It also includes the identification and signature of the Certificate Authority that issued the certificate, andthe period of time during which the certificate is valid. It may have additional information (or extensions) as well asadministrative information for the Certificate Authority’s use, such as a serial number.

Page 157: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

5.2. SSL/TLS STRONG ENCRYPTION: AN INTRODUCTION 149

Table 1: Certificate Information

Subject Distinguished Name, Public KeyIssuer Distinguished Name, SignaturePeriod of Validity Not Before Date, Not After DateAdministrative Information Version, Serial NumberExtended Information Basic Constraints, Netscape Flags, etc.

A distinguished name is used to provide an identity in a specific context – for instance, an individual might have apersonal certificate as well as one for their identity as an employee. Distinguished names are defined by the X.509standard [X509], which defines the fields, field names, and abbreviations used to refer to the fields (see Table 2).

Table 2: Distinguished Name Information

DN Field Abbrev. Description ExampleCommon Name CN Name being certified CN=Joe AverageOrganization or Company O Name is associated with this

organizationO=Snake Oil, Ltd.

Organizational Unit OU Name is associated with thisorganization unit, such as a department

OU=Research Institute

City/Locality L Name is located in this City L=Snake CityState/Province ST Name is located in this State/Province ST=DesertCountry C Name is located in this Country (ISO

code)C=XZ

A Certificate Authority may define a policy specifying which distinguished field names are optional, and which arerequired. It may also place requirements upon the field contents, as may users of certificates. As an example, aNetscape browser requires that the Common Name for a certificate representing a server has a name which matches awildcard pattern for the domain name of that server, such as *.snakeoil.com.

The binary format of a certificate is defined using the ASN.1 notation [X208] [PKCS]. This notation defines howto specify the contents, and encoding rules define how this information is translated into binary form. The binaryencoding of the certificate is defined using Distinguished Encoding Rules (DER), which are based on the more generalBasic Encoding Rules (BER). For those transmissions which cannot handle binary, the binary form may be translatedinto an ASCII form by using Base64 encoding [MIME]. This encoded version is called PEM encoded (the name comesfrom "Privacy Enhanced Mail"), when placed between begin and end delimiter lines as illustrated in the followingexample.

Page 158: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

150 CHAPTER 5. APACHE SSL/TLS ENCRYPTION

Example of a PEM-encoded certificate (snakeoil.crt)

-----BEGIN CERTIFICATE-----MIIC7jCCAlegAwIBAgIBATANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCWFkxFTATBgNVBAgTDFNuYWtlIERlc2VydDETMBEGA1UEBxMKU25ha2UgVG93bjEXMBUGA1UEChMOU25ha2UgT2lsLCBMdGQxHjAcBgNVBAsTFUNlcnRpZmljYXRlIEF1dGhvcml0eTEVMBMGA1UEAxMMU25ha2UgT2lsIENBMR4wHAYJKoZIhvcNAQkBFg9jYUBzbmFrZW9pbC5kb20wHhcNOTgxMDIxMDg1ODM2WhcNOTkxMDIxMDg1ODM2WjCBpzELMAkGA1UEBhMCWFkxFTATBgNVBAgTDFNuYWtlIERlc2VydDETMBEGA1UEBxMKU25ha2UgVG93bjEXMBUGA1UEChMOU25ha2UgT2lsLCBMdGQxFzAVBgNVBAsTDldlYnNlcnZlciBUZWFtMRkwFwYDVQQDExB3d3cuc25ha2VvaWwuZG9tMR8wHQYJKoZIhvcNAQkBFhB3d3dAc25ha2VvaWwuZG9tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDH9Ge/s2zcH+da+rPTx/DPRp3xGjHZ4GG6pCmvADIEtBtKBFAcZ64n+Dy7Np8bvKR+yy5DGQiijsH1D/j8HlGE+q4TZ8OFk7BNBFazHxFbYI4OKMiCxdKzdif1yfaalWoANFlAzlSdbxeGVHoT0K+gT5w3UxwZKv2DLbCTzLZyPwIDAQABoyYwJDAPBgNVHRMECDAGAQH/AgEAMBEGCWCGSAGG+EIBAQQEAwIAQDANBgkqhkiG9w0BAQQFAAOBgQAZUIHAL4D09oE6Lv2k56Gp38OBDuILvwLg1v1KL8mQR+KFjghCrtpqaztZqcDt2q2QoyulCgSzHbEGmi0EsdkPfg6mp0penssIFePYNI+/8u9HT4LuKMJX15hxBam7dUHzICxBVC1lnHyYGjDuAMhe396lYAn8bCld1/L4NMGBCQ==-----END CERTIFICATE-----

Certificate Authorities

By first verifying the information in a certificate request before granting the certificate, the Certificate Authority assuresthe identity of the private key owner of a key-pair. For instance, if Alice requests a personal certificate, the CertificateAuthority must first make sure that Alice really is the person the certificate request claims.

Certificate Chains

A Certificate Authority may also issue a certificate for another Certificate Authority. When examining a certificate,Alice may need to examine the certificate of the issuer, for each parent Certificate Authority, until reaching one whichshe has confidence in. She may decide to trust only certificates with a limited chain of issuers, to reduce her risk of a"bad" certificate in the chain.

Creating a Root-Level CA

As noted earlier, each certificate requires an issuer to assert the validity of the identity of the certificate subject, upto the top-level Certificate Authority (CA). This presents a problem: Since this is who vouches for the certificate ofthe top-level authority, which has no issuer? In this unique case, the certificate is "self-signed", so the issuer of thecertificate is the same as the subject. As a result, one must exercise extra care in trusting a self-signed certificate. Thewide publication of a public key by the root authority reduces the risk in trusting this key – it would be obvious ifsomeone else publicized a key claiming to be the authority. Browsers are preconfigured to trust well-known certificateauthorities.

A number of companies, such as Thawte7 and VeriSign8 have established themselves as Certificate Authorities. Thesecompanies provide the following services:

• Verifying certificate requests

• Processing certificate requests

• Issuing and managing certificates

7http://www.thawte.com/8http://www.verisign.com/

Page 159: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

5.2. SSL/TLS STRONG ENCRYPTION: AN INTRODUCTION 151

It is also possible to create your own Certificate Authority. Although risky in the Internet environment, it may beuseful within an Intranet where the organization can easily verify the identities of individuals and servers.

Certificate Management

Establishing a Certificate Authority is a responsibility which requires a solid administrative, technical, and manage-ment framework. Certificate Authorities not only issue certificates, they also manage them – that is, they determinehow long certificates are valid, they renew them, and they keep lists of certificates that have already been issued butare no longer valid (Certificate Revocation Lists, or CRLs). Say Alice is entitled to a certificate as an employee of acompany. Say too, that the certificate needs to be revoked when Alice leaves the company. Since certificates are ob-jects that get passed around, it is impossible to tell from the certificate alone that it has been revoked. When examiningcertificates for validity, therefore, it is necessary to contact the issuing Certificate Authority to check CRLs – this isnot usually an automated part of the process.

=⇒NoteIf you use a Certificate Authority that is not configured into browsers by default, it is necessaryto load the Certificate Authority certificate into the browser, enabling the browser to validateserver certificates signed by that Certificate Authority. Doing so may be dangerous, since onceloaded, the browser will accept all certificates signed by that Certificate Authority.

Secure Sockets Layer (SSL)

The Secure Sockets Layer protocol is a protocol layer which may be placed between a reliable connection-orientednetwork layer protocol (e.g. TCP/IP) and the application protocol layer (e.g. HTTP). SSL provides for secure com-munication between client and server by allowing mutual authentication, the use of digital signatures for integrity, andencryption for privacy.

The protocol is designed to support a range of choices for specific algorithms used for cryptography, digests, andsignatures. This allows algorithm selection for specific servers to be made based on legal, export or other concerns,and also enables the protocol to take advantage of new algorithms. Choices are negotiated between client and serverat the start of establishing a protocol session.

Table 4: Versions of the SSL protocol

Version Source Description Browser SupportSSL v2.0 Vendor Standard (from

Netscape Corp.) [SSL2]First SSL protocol for which imple-mentations exists

- NS Navigator 1.x/2.x- MS IE 3.x- Lynx/2.8+OpenSSL

SSL v3.0 Expired Internet Draft(from Netscape Corp.)[SSL3]

Revisions to prevent specific securityattacks, add non-RSA ciphers, and sup-port for certificate chains

- NS Navigator 2.x/3.x/4.x- MS IE 3.x/4.x- Lynx/2.8+OpenSSL

TLS v1.0 Proposed Internet Stan-dard (from IETF) [TLS1]

Revision of SSL 3.0 to update the MAClayer to HMAC, add block padding forblock ciphers, message order standard-ization and more alert messages.

- Lynx/2.8+OpenSSL

There are a number of versions of the SSL protocol, as shown in Table 4. As noted there, one of the benefits in SSL3.0 is that it adds support of certificate chain loading. This feature allows a server to pass a server certificate alongwith issuer certificates to the browser. Chain loading also permits the browser to validate the server certificate, even ifCertificate Authority certificates are not installed for the intermediate issuers, since they are included in the certificatechain. SSL 3.0 is the basis for the Transport Layer Security [TLS] protocol standard, currently in development by theInternet Engineering Task Force (IETF).

Page 160: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

152 CHAPTER 5. APACHE SSL/TLS ENCRYPTION

Session Establishment

The SSL session is established by following a handshake sequence between client and server, as shown in Figure 1.This sequence may vary, depending on whether the server is configured to provide a server certificate or request a clientcertificate. Though cases exist where additional handshake steps are required for management of cipher information,this article summarizes one common scenario: see the SSL specification for the full range of possibilities.

=⇒NoteOnce an SSL session has been established it may be reused, thus avoiding the performancepenalty of repeating the many steps needed to start a session. For this the server assigns eachSSL session a unique session identifier which is cached in the server and which the client canuse on forthcoming connections to reduce the handshake (until the session identifer expires inthe cache of the server).

Figure 1: Simplified SSL Handshake Sequence

The elements of the handshake sequence, as used by the client and server, are listed below:

1. Negotiate the Cipher Suite to be used during data transfer

2. Establish and share a session key between client and server

3. Optionally authenticate the server to the client

4. Optionally authenticate the client to the server

The first step, Cipher Suite Negotiation, allows the client and server to choose a Cipher Suite supportable by bothof them. The SSL3.0 protocol specification defines 31 Cipher Suites. A Cipher Suite is defined by the followingcomponents:

• Key Exchange Method

• Cipher for Data Transfer

• Message Digest for creating the Message Authentication Code (MAC)

These three elements are described in the sections that follow.

Page 161: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

5.2. SSL/TLS STRONG ENCRYPTION: AN INTRODUCTION 153

Key Exchange Method

The key exchange method defines how the shared secret symmetric cryptography key used for application data transferwill be agreed upon by client and server. SSL 2.0 uses RSA key exchange only, while SSL 3.0 supports a choice of keyexchange algorithms including the RSA key exchange when certificates are used, and Diffie-Hellman key exchangefor exchanging keys without certificates and without prior communication between client and server.

One variable in the choice of key exchange methods is digital signatures – whether or not to use them, and if so, whatkind of signatures to use. Signing with a private key provides assurance against a man-in-the-middle-attack during theinformation exchange used in generating the shared key [AC96, p516].

Cipher for Data Transfer

SSL uses the conventional cryptography algorithm (symmetric cryptography) described earlier for encrypting mes-sages in a session. There are nine choices, including the choice to perform no encryption:

• No encryption

• Stream Ciphers

– RC4 with 40-bit keys– RC4 with 128-bit keys

• CBC Block Ciphers

– RC2 with 40 bit key– DES with 40 bit key– DES with 56 bit key– Triple-DES with 168 bit key– Idea (128 bit key)– Fortezza (96 bit key)

Here "CBC" refers to Cipher Block Chaining, which means that a portion of the previously encrypted cipher text isused in the encryption of the current block. "DES" refers to the Data Encryption Standard [AC96, ch12], which hasa number of variants (including DES40 and 3DES EDE). "Idea" is one of the best and cryptographically strongestavailable algorithms, and "RC2" is a proprietary algorithm from RSA DSI [AC96, ch13].

Digest Function

The choice of digest function determines how a digest is created from a record unit. SSL supports the following:

• No digest (Null choice)

• MD5, a 128-bit hash

• Secure Hash Algorithm (SHA-1), a 160-bit hash

The message digest is used to create a Message Authentication Code (MAC) which is encrypted with the message toprovide integrity and to prevent against replay attacks.

Page 162: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

154 CHAPTER 5. APACHE SSL/TLS ENCRYPTION

Handshake Sequence Protocol

The handshake sequence uses three protocols:

• The SSL Handshake Protocol for performing the client and server SSL session establishment.

• The SSL Change Cipher Spec Protocol for actually establishing agreement on the Cipher Suite for the session.

• The SSL Alert Protocol for conveying SSL error messages between client and server.

These protocols, as well as application protocol data, are encapsulated in the SSL Record Protocol, as shown in Figure2. An encapsulated protocol is transferred as data by the lower layer protocol, which does not examine the data. Theencapsulated protocol has no knowledge of the underlying protocol.

Figure 2: SSL Protocol Stack

The encapsulation of SSL control protocols by the record protocol means that if an active session is renegotiated thecontrol protocols will be transmitted securely. If there were no session before, then the Null cipher suite is used, whichmeans there is no encryption and messages have no integrity digests until the session has been established.

Data Transfer

The SSL Record Protocol, shown in Figure 3, is used to transfer application and SSL Control data between the clientand server, possibly fragmenting this data into smaller units, or combining multiple higher level protocol data messagesinto single units. It may compress, attach digest signatures, and encrypt these units before transmitting them using theunderlying reliable transport protocol (Note: currently all major SSL implementations lack support for compression).

Page 163: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

5.2. SSL/TLS STRONG ENCRYPTION: AN INTRODUCTION 155

Figure 3: SSL Record Protocol

Securing HTTP Communication

One common use of SSL is to secure Web HTTP communication between a browser and a webserver. This case doesnot preclude the use of non-secured HTTP. The secure version is mainly plain HTTP over SSL (named HTTPS), butwith one major difference: it uses the URL scheme https rather than http and a different server port (by default443). This mainly is what MOD SSL provides to you for the Apache webserver...

References

[AC96] Bruce Schneier, Applied Cryptography, 2nd Edition, Wiley, 1996. See http://www.counterpane.com/ forvarious other materials by Bruce Schneier.

[X208] ITU-T Recommendation X.208, Specification of Abstract Syntax Notation One (ASN.1), 1988. See for in-stance http://www.itu.int/rec/recommendation.asp?type=items&lang=e&parent=T-REC-X.208-198811-I.

[X509] ITU-T Recommendation X.509, The Directory - Authentication Framework. See for instancehttp://www.itu.int/rec/recommendation.asp?type=folders&lang=e&parent=T-REC-X.509.

[PKCS] Public Key Cryptography Standards (PKCS), RSA Laboratories Technical Notes, Seehttp://www.rsasecurity.com/rsalabs/pkcs/.

[MIME] N. Freed, N. Borenstein, Multipurpose Internet Mail Extensions (MIME) Part One: Format of InternetMessage Bodies, RFC2045. See for instance http://ietf.org/rfc/rfc2045.txt.

[SSL2] Kipp E.B. Hickman, The SSL Protocol, 1995. See http://www.netscape.com/eng/security/SSL 2.html.

[SSL3] Alan O. Freier, Philip Karlton, Paul C. Kocher, The SSL Protocol Version 3.0, 1996. Seehttp://www.netscape.com/eng/ssl3/draft302.txt.

[TLS1] Tim Dierks, Christopher Allen, The TLS Protocol Version 1.0, 1999. See http://ietf.org/rfc/rfc2246.txt.

Page 164: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

156 CHAPTER 5. APACHE SSL/TLS ENCRYPTION

5.3 SSL/TLS Strong Encryption: Compatibility

All PCs are compatible. But some of them are more compatible than others.– Unknown

Here we talk about backward compatibility to other SSL solutions. As you perhaps know, mod ssl is not the onlyexisting SSL solution for Apache. Actually there are four additional major products available on the market: BenLaurie’s freely available Apache-SSL9 (from where mod ssl were originally derived in 1998), Red Hat’s commer-cial Secure Web Server10 (which is based on mod ssl), Covalent’s commercial Raven SSL Module11 (also based onmod ssl) and finally C2Net’s commercial product Stronghold12 (based on a different evolution branch named Siouxup to Stronghold 2.x and based on mod ssl since Stronghold 3.x).

The idea in mod ssl is mainly the following: because mod ssl provides mostly a superset of the functionality ofall other solutions we can easily provide backward compatibility for most of the cases. Actually there are threecompatibility areas we currently address: configuration directives, environment variables and custom log functions.

Configuration Directives

For backward compatibility to the configuration directives of other SSL solutions we do an on-the-fly mapping: direc-tives which have a direct counterpart in mod ssl are mapped silently while other directives lead to a warning messagein the logfiles. The currently implemented directive mapping is listed in Table 1. Currently full backward compati-bility is provided only for Apache-SSL 1.x and mod ssl 2.0.x. Compatibility to Sioux 1.x and Stronghold 2.x is onlypartial because of special functionality in these interfaces which mod ssl (still) doesn’t provide.

Table 1: Configuration Directive Mapping

Old Directive mod ssl Directive CommentApache-SSL 1.x & mod ssl 2.0.xcompatibility:SSLEnable SSLEngine on compactifiedSSLDisable SSLEngine off compactifiedSSLLogFile file SSLLog file compactifiedSSLRequiredCiphers spec SSLCipherSuite spec renamedSSLRequireCipher c1 ... SSLRequire %{SSL CIPHER} in

{"c1", ...}generalized

SSLBanCipher c1 ... SSLRequire not(%{SSL CIPHER} in {"c1",...})

generalized

SSLFakeBasicAuth SSLOptions +FakeBasicAuth mergedSSLCacheServerPath dir - functionality removedSSLCacheServerPort integer - functionality removedApache-SSL 1.x compatibility:SSLExportClientCertificates SSLOptions +ExportCertData mergedSSLCacheServerRunDir dir - functionality not supportedSioux 1.x compatibility:SSL CertFile file SSLCertificateFile file renamedSSL KeyFile file SSLCertificateKeyFile file renamedSSL CipherSuite arg SSLCipherSuite arg renamed

9http://www.apache-ssl.org/10http://www.redhat.com/products/product-details.phtml?id=rhsa11http://raven.covalent.net/12http://www.c2.net/products/stronghold/

Page 165: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

5.3. SSL/TLS STRONG ENCRYPTION: COMPATIBILITY 157

SSL X509VerifyDir arg SSLCACertificatePath arg renamedSSL Log file SSLLogFile file renamedSSL Connect flag SSLEngine flag renamedSSL ClientAuth arg SSLVerifyClient arg renamedSSL X509VerifyDepth arg SSLVerifyDepth arg renamedSSL FetchKeyPhraseFrom arg - not directly mappable; use

SSLPassPhraseDialogSSL SessionDir dir - not directly mappable; use SSLSession-

CacheSSL Require expr - not directly mappable; use SSLRequireSSL CertFileType arg - functionality not supportedSSL KeyFileType arg - functionality not supportedSSL X509VerifyPolicy arg - functionality not supportedSSL LogX509Attributes arg - functionality not supportedStronghold 2.x compatibility:StrongholdAccelerator dir - functionality not supportedStrongholdKey dir - functionality not supportedStrongholdLicenseFile dir - functionality not supportedSSLFlag flag SSLEngine flag renamedSSLSessionLockFile file SSLMutex file renamedSSLCipherList spec SSLCipherSuite spec renamedRequireSSL SSLRequireSSL renamedSSLErrorFile file - functionality not supportedSSLRoot dir - functionality not supportedSSL CertificateLogDir dir - functionality not supportedAuthCertDir dir - functionality not supportedSSL Group name - functionality not supportedSSLProxyMachineCertPath dir - functionality not supportedSSLProxyMachineCertFile file - functionality not supportedSSLProxyCACertificatePath dir - functionality not supportedSSLProxyCACertificateFile file - functionality not supportedSSLProxyVerifyDepth number - functionality not supportedSSLProxyCipherList spec - functionality not supported

Environment Variables

When you use “SSLOptions +CompatEnvVars” additional environment variables are generated. They all cor-respond to existing official mod ssl variables. The currently implemented variable derivation is listed in Table 2.

Table 2: Environment Variable Derivation

Old Variable mod ssl Variable CommentSSL PROTOCOL VERSION SSL PROTOCOL renamedSSLEAY VERSION SSL VERSION LIBRARY renamedHTTPS SECRETKEYSIZE SSL CIPHER USEKEYSIZE renamedHTTPS KEYSIZE SSL CIPHER ALGKEYSIZE renamedHTTPS CIPHER SSL CIPHER renamedHTTPS EXPORT SSL CIPHER EXPORT renamedSSL SERVER KEY SIZE SSL CIPHER ALGKEYSIZE renamedSSL SERVER CERTIFICATE SSL SERVER CERT renamedSSL SERVER CERT START SSL SERVER V START renamedSSL SERVER CERT END SSL SERVER V END renamed

Page 166: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

158 CHAPTER 5. APACHE SSL/TLS ENCRYPTION

SSL SERVER CERT SERIAL SSL SERVER M SERIAL renamedSSL SERVER SIGNATURE ALGORITHM SSL SERVER A SIG renamedSSL SERVER DN SSL SERVER S DN renamedSSL SERVER CN SSL SERVER S DN CN renamedSSL SERVER EMAIL SSL SERVER S DN Email renamedSSL SERVER O SSL SERVER S DN O renamedSSL SERVER OU SSL SERVER S DN OU renamedSSL SERVER C SSL SERVER S DN C renamedSSL SERVER SP SSL SERVER S DN SP renamedSSL SERVER L SSL SERVER S DN L renamedSSL SERVER IDN SSL SERVER I DN renamedSSL SERVER ICN SSL SERVER I DN CN renamedSSL SERVER IEMAIL SSL SERVER I DN Email renamedSSL SERVER IO SSL SERVER I DN O renamedSSL SERVER IOU SSL SERVER I DN OU renamedSSL SERVER IC SSL SERVER I DN C renamedSSL SERVER ISP SSL SERVER I DN SP renamedSSL SERVER IL SSL SERVER I DN L renamedSSL CLIENT CERTIFICATE SSL CLIENT CERT renamedSSL CLIENT CERT START SSL CLIENT V START renamedSSL CLIENT CERT END SSL CLIENT V END renamedSSL CLIENT CERT SERIAL SSL CLIENT M SERIAL renamedSSL CLIENT SIGNATURE ALGORITHM SSL CLIENT A SIG renamedSSL CLIENT DN SSL CLIENT S DN renamedSSL CLIENT CN SSL CLIENT S DN CN renamedSSL CLIENT EMAIL SSL CLIENT S DN Email renamedSSL CLIENT O SSL CLIENT S DN O renamedSSL CLIENT OU SSL CLIENT S DN OU renamedSSL CLIENT C SSL CLIENT S DN C renamedSSL CLIENT SP SSL CLIENT S DN SP renamedSSL CLIENT L SSL CLIENT S DN L renamedSSL CLIENT IDN SSL CLIENT I DN renamedSSL CLIENT ICN SSL CLIENT I DN CN renamedSSL CLIENT IEMAIL SSL CLIENT I DN Email renamedSSL CLIENT IO SSL CLIENT I DN O renamedSSL CLIENT IOU SSL CLIENT I DN OU renamedSSL CLIENT IC SSL CLIENT I DN C renamedSSL CLIENT ISP SSL CLIENT I DN SP renamedSSL CLIENT IL SSL CLIENT I DN L renamedSSL EXPORT SSL CIPHER EXPORT renamedSSL KEYSIZE SSL CIPHER ALGKEYSIZE renamedSSL SECKEYSIZE SSL CIPHER USEKEYSIZE renamedSSL SSLEAY VERSION SSL VERSION LIBRARY renamedSSL STRONG CRYPTO - Not supported by mod sslSSL SERVER KEY EXP - Not supported by mod sslSSL SERVER KEY ALGORITHM - Not supported by mod sslSSL SERVER KEY SIZE - Not supported by mod sslSSL SERVER SESSIONDIR - Not supported by mod sslSSL SERVER CERTIFICATELOGDIR - Not supported by mod sslSSL SERVER CERTFILE - Not supported by mod sslSSL SERVER KEYFILE - Not supported by mod sslSSL SERVER KEYFILETYPE - Not supported by mod sslSSL CLIENT KEY EXP - Not supported by mod ssl

Page 167: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

5.3. SSL/TLS STRONG ENCRYPTION: COMPATIBILITY 159

SSL CLIENT KEY ALGORITHM - Not supported by mod sslSSL CLIENT KEY SIZE - Not supported by mod ssl

Custom Log Functions

When mod ssl is built into Apache or at least loaded (under DSO situation) additional functions exist for the CustomLog Format (p. 471) of MOD LOG CONFIG as documented in the Reference Chapter. Beside the “%{varname}x”eXtension format function which can be used to expand any variables provided by any module, an additional Cryp-tography “%{name}c” cryptography format function exists for backward compatibility. The currently implementedfunction calls are listed in Table 3.

Table 3: Custom Log Cryptography Function

Function Call Description%...{version}c SSL protocol version%...{cipher}c SSL cipher%...{subjectdn}c Client Certificate Subject Distinguished Name%...{issuerdn}c Client Certificate Issuer Distinguished Name%...{errcode}c Certificate Verification Error (numerical)%...{errstr}c Certificate Verification Error (string)

Page 168: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

160 CHAPTER 5. APACHE SSL/TLS ENCRYPTION

5.4 SSL/TLS Strong Encryption: How-To

The solution of this problem is trivial and is left as an exercise for the reader.– Standard textbook cookie

How to solve particular security constraints for an SSL-aware webserver is not always obvious because of the coher-ences between SSL, HTTP and Apache’s way of processing requests. This chapter gives instructions on how to solvesuch typical situations. Treat it as a first step to find out the final solution, but always try to understand the stuff beforeyou use it. Nothing is worse than using a security solution without knowing its restrictions and coherences.

Cipher Suites and Enforced Strong Security

• SSLv2 only server

• strong encryption only server

• server gated cryptography

• stronger per-directory requirements

How can I create a real SSLv2-only server?

The following creates an SSL server which speaks only the SSLv2 protocol and its ciphers.

httpd.confSSLProtocol -all +SSLv2

SSLCipherSuite SSLv2:+HIGH:+MEDIUM:+LOW:+EXP

How can I create an SSL server which accepts strong encryption only?

The following enables only the strongest ciphers:

httpd.confSSLProtocol all -SSLv2

SSLCipherSuite HIGH:!aNULL:!MD5

How can I create an SSL server which accepts strong encryption only, but allows export browsers to upgradeto stronger encryption?

This facility is called Server Gated Cryptography (SGC) and details you can find in the README.GlobalID doc-ument in the mod ssl distribution. In short: The server has a Global ID server certificate, signed by a special CAcertificate from Verisign which enables strong encryption in export browsers. This works as following: The browserconnects with an export cipher, the server sends its Global ID certificate, the browser verifies it and subsequentlyupgrades the cipher suite before any HTTP communication takes place. The question now is: How can we allowthis upgrade, but enforce strong encryption. Or in other words: Browser either have to initially connect with strongencryption or have to upgrade to strong encryption, but are not allowed to keep the export ciphers. The following doesthe trick:

Page 169: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

5.4. SSL/TLS STRONG ENCRYPTION: HOW-TO 161

httpd.conf# allow all ciphers for the initial handshake,# so export browsers can upgrade via SGC facilitySSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL

<Directory /usr/local/apache2/htdocs># but finally deny all browsers which haven’t upgradedSSLRequire %{SSL CIPHER USEKEYSIZE} >= 128

</Directory>

How can I create an SSL server which accepts all types of ciphers in general, but requires a strong ciphers foraccess to a particular URL?

Obviously you cannot just use a server-wide SSLCIPHERSUITE which restricts the ciphers to the strong variants. Butmod ssl allows you to reconfigure the cipher suite in per-directory context and automatically forces a renegotiation ofthe SSL parameters to meet the new configuration. So, the solution is:

# be liberal in generalSSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL

<Location /strong/area># but https://hostname/strong/area/ and below# requires strong ciphersSSLCipherSuite HIGH:!aNULL:!MD5

</Location>

Client Authentication and Access Control

• simple certificate-based client authentication

• selective certificate-based client authentication

• particular certificate-based client authentication

• intranet vs. internet authentication

How can I authenticate clients based on certificates when I know all my clients?

When you know your user community (i.e. a closed user group situation), as it’s the case for instance in an Intranet,you can use plain certificate authentication. All you have to do is to create client certificates signed by your own CAcertificate ca.crt and then verify the clients against this certificate.

httpd.conf# require a client certificate which has to be directly# signed by our CA certificate in ca.crtSSLVerifyClient requireSSLVerifyDepth 1

SSLCACertificateFile conf/ssl.crt/ca.crt

Page 170: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

162 CHAPTER 5. APACHE SSL/TLS ENCRYPTION

How can I authenticate my clients for a particular URL based on certificates but still allow arbitrary clients toaccess the remaining parts of the server?

For this we again use the per-directory reconfiguration feature of MOD SSL:

httpd.confSSLVerifyClient noneSSLCACertificateFile conf/ssl.crt/ca.crt

<Location /secure/area>SSLVerifyClient requireSSLVerifyDepth 1

</Location>

How can I authenticate only particular clients for a some URLs based on certificates but still allow arbitraryclients to access the remaining parts of the server?

The key is to check for various ingredients of the client certificate. Usually this means to check the whole or partof the Distinguished Name (DN) of the Subject. For this two methods exists: The MOD AUTH based variant and theSSLREQUIRE variant. The first method is good when the clients are of totally different type, i.e. when their DNs haveno common fields (usually the organisation, etc.). In this case you’ve to establish a password database containing allclients. The second method is better when your clients are all part of a common hierarchy which is encoded into theDN. Then you can match them more easily.

The first method:

httpd.conf

SSLVerifyClient none<Directory /usr/local/apache2/htdocs/secure/area>

SSLVerifyClient requireSSLVerifyDepth 5SSLCACertificateFile conf/ssl.crt/ca.crtSSLCACertificatePath conf/ssl.crtSSLOptions +FakeBasicAuthSSLRequireSSLAuthName "Snake Oil Authentication"AuthType BasicAuthUserFile /usr/local/apache2/conf/httpd.passwdrequire valid-user</Directory>

The password used in this example is the DES encrypted string "password". See the SSLOPTIONS docs for moreinformation.

httpd.passwd

/C=DE/L=Munich/O=Snake Oil, Ltd./OU=Staff/CN=Foo:xxj31ZMTZzkVA/C=US/L=S.F./O=Snake Oil, Ltd./OU=CA/CN=Bar:xxj31ZMTZzkVA/C=US/L=L.A./O=Snake Oil, Ltd./OU=Dev/CN=Quux:xxj31ZMTZzkVA

The second method:

Page 171: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

5.4. SSL/TLS STRONG ENCRYPTION: HOW-TO 163

httpd.conf

SSLVerifyClient none<Directory /usr/local/apache2/htdocs/secure/area>

SSLVerifyClient requireSSLVerifyDepth 5SSLCACertificateFile conf/ssl.crt/ca.crtSSLCACertificatePath conf/ssl.crtSSLOptions +FakeBasicAuthSSLRequireSSLSSLRequire %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \

and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"}</Directory>

How can I require HTTPS with strong ciphers and either basic authentication or client certificates for accessto a subarea on the Intranet website for clients coming from the Internet but still allow plain HTTP access forclients on the Intranet?

Let us assume the Intranet can be distinguished through the IP network 192.168.1.0/24 and the subarea on the Intranetwebsite has the URL /subarea. Then configure the following outside your HTTPS virtual host (so it applies to bothHTTPS and HTTP):

Page 172: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

164 CHAPTER 5. APACHE SSL/TLS ENCRYPTION

httpd.conf

SSLCACertificateFile conf/ssl.crt/company-ca.crt

<Directory /usr/local/apache2/htdocs># Outside the subarea only Intranet access is grantedOrder deny,allowDeny from allAllow from 192.168.1.0/24</Directory>

<Directory /usr/local/apache2/htdocs/subarea># Inside the subarea any Intranet access is allowed# but from the Internet only HTTPS + Strong-Cipher + Password# or the alternative HTTPS + Strong-Cipher + Client-Certificate

# If HTTPS is used, make sure a strong cipher is used.# Additionally allow client certs as alternative to basic auth.SSLVerifyClient optionalSSLVerifyDepth 1SSLOptions +FakeBasicAuth +StrictRequireSSLRequire %{SSL_CIPHER_USEKEYSIZE} >= 128

# Force clients from the Internet to use HTTPSRewriteEngine onRewriteCond %{REMOTE_ADDR} !ˆ192\.168\.1\.[0-9]+$RewriteCond %{HTTPS} !=onRewriteRule .* - [F]

# Allow Network Access and/or Basic AuthSatisfy any

# Network Access ControlOrder deny,allowDeny from allAllow 192.168.1.0/24

# HTTP Basic AuthenticationAuthType basicAuthName "Protected Intranet Area"AuthUserFile conf/protected.passwdRequire valid-user</Directory>

Page 173: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

5.5. SSL/TLS STRONG ENCRYPTION: FAQ 165

5.5 SSL/TLS Strong Encryption: FAQ

The wise man doesn’t give the right answers, he poses the right questions.– Claude Levi-Strauss

This chapter is a collection of frequently asked questions (FAQ) and corresponding answersfollowing the popular USENET tradition. Most of these questions occurred on the News-group comp.infosystems.www.servers.unix13 or the mod ssl Support Mailing [email protected]. They are collected at this place to avoid answering the same ques-tions over and over.

Please read this chapter at least once when installing mod ssl or at least search for your problem here before submittinga problem report to the author.

About The Module

• What is the history of mod ssl?

• mod ssl and Wassenaar Arrangement?

What is the history of mod ssl?

The mod ssl v1 package was initially created in April 1998 by Ralf S. Engelschall15 via porting Ben Laurie16’s Apache-SSL17 1.17 source patches for Apache 1.2.6 to Apache 1.3b6. Because of conflicts with Ben Laurie’s developmentcycle it then was re-assembled from scratch for Apache 1.3.0 by merging the old mod ssl 1.x with the newer Apache-SSL 1.18. From this point on mod ssl lived its own life as mod ssl v2. The first publicly released version was mod ssl2.0.0 from August 10th, 1998.

After US export restrictions on cryptographic software were loosened, MOD SSL became part of the Apache HTTPServer with the release of Apache httpd 2.

Is mod ssl affected by the Wassenaar Arrangement?

First, let us explain what Wassenaar and its Arrangement on Export Controls for Conventional Arms and Dual-UseGoods and Technologies is: This is a international regime, established in 1995, to control trade in conventional armsand dual-use goods and technology. It replaced the previous CoCom regime. Further details on both the Arrangementand its signatories are available at http://www.wassenaar.org/.

In short, the aim of the Wassenaar Arrangement is to prevent the build up of military capabilities that threaten regionaland international security and stability. The Wassenaar Arrangement controls the export of cryptography as a dual-usegood, that is, something that has both military and civilian applications. However, the Wassenaar Arrangement alsoprovides an exemption from export controls for mass-market software and free software.

In the current Wassenaar List of Dual Use Goods and Technologies And Munitions, under GENERAL SOFTWARENOTE (GSN) it says The Lists do not control "software" which is either: 1. [...] 2. "in the public domain". Andunder DEFINITIONS OF TERMS USED IN THESE LISTS we find In the public domain defined as "technology"or "software" which has been made available without restrictions upon its further dissemination. Note: Copyrightrestrictions do not remove "technology" or "software" from being "in the public domain".

13news:comp.infosystems.www.servers.unix14mailto:[email protected]:[email protected]:[email protected]://www.apache-ssl.org/

Page 174: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

166 CHAPTER 5. APACHE SSL/TLS ENCRYPTION

So, both mod ssl and OpenSSL are in the public domain for the purposes of the Wassenaar Arrangement and its Listof Dual Use Goods and Technologies And Munitions List, and thus not affected by its provisions.

Installation

• Why do I get permission errors related to SSLMutex when I start Apache?

• Why does mod ssl stop with the error "Failed to generate temporary 512 bit RSA private key" when I startApache?

Why do I get permission errors related to SSLMutex when I start Apache?

Errors such as “mod ssl: Child could not open SSLMutex lockfile/opt/apache/logs/ssl mutex.18332 (System error follows) [...] System:Permission denied (errno: 13)” are usually caused by overly restrictive permissions on the parentdirectories. Make sure that all parent directories (here /opt, /opt/apache and /opt/apache/logs) have thex-bit set for, at minimum, the UID under which Apache’s children are running (see the USER directive).

Why does mod ssl stop with the error "Failed to generate temporary 512 bit RSA private key" when I startApache?

Cryptographic software needs a source of unpredictable data to work correctly. Many open source operating sys-tems provide a "randomness device" that serves this purpose (usually named /dev/random). On other systems,applications have to seed the OpenSSL Pseudo Random Number Generator (PRNG) manually with appropriate databefore generating keys or performing public key encryption. As of version 0.9.5, the OpenSSL functions that needrandomness report an error if the PRNG has not been seeded with at least 128 bits of randomness.

To prevent this error, MOD SSL has to provide enough entropy to the PRNG to allow it to work correctly. This can bedone via the SSLRANDOMSEED directive.

Configuration

• Is it possible to provide HTTP and HTTPS from the same server?

• Which port does HTTPS use?

• How do I speak HTTPS manually for testing purposes?

• Why does the connection hang when I connect to my SSL-aware Apache server?

• Why do I get “Connection Refused” errors, when trying to access my newly installed Apache+mod ssl servervia HTTPS?

• Why are the SSL XXX variables not available to my CGI & SSI scripts?

• How can I switch between HTTP and HTTPS in relative hyperlinks?

Is it possible to provide HTTP and HTTPS from the same server?

Yes. HTTP and HTTPS use different server ports (HTTP binds to port 80, HTTPS to port 443), so there is no directconflict between them. You can either run two separate server instances bound to these ports, or use Apache’s elegantvirtual hosting facility to create two virtual servers, both served by the same instance of Apache - one responding overHTTP to requests on port 80, and the other responding over HTTPS to requests on port 443.

Page 175: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

5.5. SSL/TLS STRONG ENCRYPTION: FAQ 167

Which port does HTTPS use?

You can run HTTPS on any port, but the standards specify port 443, which is where any HTTPS compliant browser willlook by default. You can force your browser to look on a different port by specifying it in the URL. For example, if yourserver is set up to serve pages over HTTPS on port 8080, you can access them at https://example.com:8080/

How do I speak HTTPS manually for testing purposes?

While you usually just use

$ telnet localhost 80

GET / HTTP/1.0

for simple testing of Apache via HTTP, it’s not so easy for HTTPS because of the SSL protocol between TCP andHTTP. With the help of OpenSSL’s s client command, however, you can do a similar check via HTTPS:

$ openssl s client -connect localhost:443 -state -debug

GET / HTTP/1.0

Before the actual HTTP response you will receive detailed information about the SSL handshake. For a more generalcommand line client which directly understands both HTTP and HTTPS, can perform GET and POST operations, canuse a proxy, supports byte ranges, etc. you should have a look at the nifty cURL18 tool. Using this, you can check thatApache is responding correctly to requests via HTTP and HTTPS as follows:

$ curl http://localhost/

$ curl https://localhost/

Why does the connection hang when I connect to my SSL-aware Apache server?

This can happen when you try to connect to a HTTPS server (or virtual server) via HTTP (eg, usinghttp://example.com/ instead of https://example.com). It can also happen when trying to connect viaHTTPS to a HTTP server (eg, using https://example.com/ on a server which doesn’t support HTTPS, or whichsupports it on a non-standard port). Make sure that you’re connecting to a (virtual) server that supports SSL.

Why do I get “Connection Refused” messages, when trying to access my newly installed Apache+mod ssl servervia HTTPS?

This error can be caused by an incorrect configuration. Please make sure that your LISTEN directives match your<VIRTUALHOST> directives. If all else fails, please start afresh, using the default configuration provided byMOD SSL.

Why are the SSL XXX variables not available to my CGI & SSI scripts?

Please make sure you have “SSLOptions +StdEnvVars” enabled for the context of your CGI/SSI requests.

18http://curl.haxx.se/

Page 176: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

168 CHAPTER 5. APACHE SSL/TLS ENCRYPTION

How can I switch between HTTP and HTTPS in relative hyperlinks?

Usually, to switch between HTTP and HTTPS, you have to use fully-qualified hyperlinks (because you have to changethe URL scheme). Using MOD REWRITE however, you can manipulate relative hyperlinks, to achieve the same effect.

RewriteEngine onRewriteRule ˆ/(.*):SSL$ https://%{SERVER NAME}/$1 [R,L]

RewriteRule ˆ/(.*):NOSSL$ http://%{SERVER NAME}/$1 [R,L]

This rewrite ruleset lets you use hyperlinks of the form <a href="document.html:SSL">, to switch toHTTPS in a relative link. (Replace SSL with NOSSL to switch to HTTP.)

Certificates

• What are RSA Private Keys, CSRs and Certificates?

• Is there a difference on startup between a non-SSL-aware Apache and an SSL-aware Apache?

• How do I create a self-signed SSL Certificate for testing purposes?

• How do I create a real SSL Certificate?

• How do I create and use my own Certificate Authority (CA)?

• How can I change the pass-phrase on my private key file?

• How can I get rid of the pass-phrase dialog at Apache startup time?

• How do I verify that a private key matches its Certificate?

• Why do connections fail with an "alert bad certificate" error?

• Why does my 2048-bit private key not work?

• Why is client authentication broken after upgrading from SSLeay version 0.8 to 0.9?

• How can I convert a certificate from PEM to DER format?

• Why can’t I find the getca or getverisign programs mentioned by Verisign, for installing my Verisigncertificate?

• Can I use the Server Gated Cryptography (SGC) facility (aka Verisign Global ID) with mod ssl?

• Why do browsers complain that they cannot verify my Verisign Global ID server certificate?

What are RSA Private Keys, CSRs and Certificates?

An RSA private key file is a digital file that you can use to decrypt messages sent to you. It has a public componentwhich you distribute (via your Certificate file) which allows people to encrypt those messages to you.

A Certificate Signing Request (CSR) is a digital file which contains your public key and your name. You send theCSR to a Certifying Authority (CA), who will convert it into a real Certificate, by signing it.

A Certificate contains your RSA public key, your name, the name of the CA, and is digitally signed by the CA.Browsers that know the CA can verify the signature on that Certificate, thereby obtaining your RSA public key. Thatenables them to send messages which only you can decrypt.

See the Introduction (p. 147) chapter for a general description of the SSL protocol.

Page 177: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

5.5. SSL/TLS STRONG ENCRYPTION: FAQ 169

Is there a difference on startup between a non-SSL-aware Apache and an SSL-aware Apache?

Yes. In general, starting Apache with MOD SSL built-in is just like starting Apache without it. However, if you have apassphrase on your SSL private key file, a startup dialog will pop up which asks you to enter the pass phrase.

Having to manually enter the passphrase when starting the server can be problematic - for example, when starting theserver from the system boot scripts. In this case, you can follow the steps below to remove the passphrase from yourprivate key. Bear in mind that doing so brings additional security risks - proceed with caution!

How do I create a self-signed SSL Certificate for testing purposes?

1. Make sure OpenSSL is installed and in your PATH.

2. Run the following command, to create server.key and server.crt files:$ openssl req -new -x509 -nodes -out server.crt -keyout server.keyThese can be used as follows in your httpd.conf file:

SSLCertificateFile /path/to/this/server.crtSSLCertificateKeyFile /path/to/this/server.key

3. It is important that you are aware that this server.key does not have any passphrase. To add a passphrase tothe key, you should run the following command, and enter & verify the passphrase as requested.$ openssl rsa -des3 -in server.key -out server.key.new$ mv server.key.new server.key

Please backup the server.key file, and the passphrase you entered, in a secure location.

How do I create a real SSL Certificate?

Here is a step-by-step description:

1. Make sure OpenSSL is installed and in your PATH.

2. Create a RSA private key for your Apache server (will be Triple-DES encrypted and PEM formatted):$ openssl genrsa -des3 -out server.key 1024

Please backup this server.key file and the pass-phrase you entered in a secure location. You can see thedetails of this RSA private key by using the command:

$ openssl rsa -noout -text -in server.keyIf necessary, you can also create a decrypted PEM version (not recommended) of this RSA private key with:$ openssl rsa -in server.key -out server.key.unsecure

3. Create a Certificate Signing Request (CSR) with the server RSA private key (output will be PEM formatted):$ openssl req -new -key server.key -out server.csr

Make sure you enter the FQDN ("Fully Qualified Domain Name") of the server when OpenSSL promptsyou for the "CommonName", i.e. when you generate a CSR for a website which will be later accessed viahttps://www.foo.dom/, enter "www.foo.dom" here. You can see the details of this CSR by using

$ openssl req -noout -text -in server.csr

Page 178: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

170 CHAPTER 5. APACHE SSL/TLS ENCRYPTION

4. You now have to send this Certificate Signing Request (CSR) to a Certifying Authority (CA) to be signed. Oncethe CSR has been signed, you will have a real Certificate, which can be used by Apache. You can have a CSRsigned by a commercial CA, or you can create your own CA to sign it.Commercial CAs usually ask you to post the CSR into a web form, pay for the signing, and then send a signedCertificate, which you can store in a server.crt file. For more information about commercial CAs see the follow-ing locations:

(a) Verisign

http://digitalid.verisign.com/server/apacheNotice.htm 19

(b) Thawtehttp://www.thawte.com/

(c) CertiSign Certificadora Digital Ltda.

http://www.certisign.com.br 20

(d) IKS GmbH

http://www.iks-jena.de/leistungen/ca/ 21

(e) Uptime Commerce Ltd.

http://www.uptimecommerce.com 22

(f) BelSign NV/SA

http://www.belsign.be 23

For details on how to create your own CA, and use this to sign a CSR, see below.

Once your CSR has been signed, you can see the details of the Certificate as follows:$ openssl x509 -noout -text -in server.crt

5. You should now have two files: server.key and server.crt. These can be used as follows in yourhttpd.conf file:

SSLCertificateFile /path/to/this/server.crtSSLCertificateKeyFile /path/to/this/server.key

The server.csr file is no longer needed.

How do I create and use my own Certificate Authority (CA)?

The short answer is to use the CA.sh or CA.pl script provided by OpenSSL. Unless you have a good reason not to,you should use these for preference. If you cannot, you can create a self-signed Certificate as follows:

19http://digitalid.verisign.com/server/apacheNotice.htm20http://www.certisign.com.br21http://www.iks-jena.de/leistungen/ca/22http://www.uptimecommerce.com23http://www.belsign.be

Page 179: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

5.5. SSL/TLS STRONG ENCRYPTION: FAQ 171

1. Create a RSA private key for your server (will be Triple-DES encrypted and PEM formatted):$ openssl genrsa -des3 -out server.key 1024

Please backup this host.key file and the pass-phrase you entered in a secure location. You can see the detailsof this RSA private key by using the command:$ openssl rsa -noout -text -in server.keyIf necessary, you can also create a decrypted PEM version (not recommended) of this RSA private key with:$ openssl rsa -in server.key -out server.key.unsecure

2. Create a self-signed Certificate (X509 structure) with the RSA key you just created (output will be PEMformatted):$ openssl req -new -x509 -nodes -sha1 -days 365 -key server.key -out

server.crtThis signs the server CSR and results in a server.crt file.You can see the details of this Certificate using:$ openssl x509 -noout -text -in server.crt

How can I change the pass-phrase on my private key file?

You simply have to read it with the old pass-phrase and write it again, specifying the new pass-phrase. You canaccomplish this with the following commands:

$ openssl rsa -des3 -in server.key -out server.key.new$ mv server.key.new server.key

The first time you’re asked for a PEM pass-phrase, you should enter the old pass-phrase. After that, you’ll be askedagain to enter a pass-phrase - this time, use the new pass-phrase. If you are asked to verify the pass-phrase, you’ll needto enter the new pass-phrase a second time.

How can I get rid of the pass-phrase dialog at Apache startup time?

The reason this dialog pops up at startup and every re-start is that the RSA private key inside your server.key file isstored in encrypted format for security reasons. The pass-phrase is needed to decrypt this file, so it can be read andparsed. Removing the pass-phrase removes a layer of security from your server - proceed with caution!

1. Remove the encryption from the RSA private key (while keeping a backup copy of the original file):$ cp server.key server.key.org

$ openssl rsa -in server.key.org -out server.key

2. Make sure the server.key file is only readable by root:$ chmod 400 server.key

Now server.key contains an unencrypted copy of the key. If you point your server at this file, it will not promptyou for a pass-phrase. HOWEVER, if anyone gets this key they will be able to impersonate you on the net. PLEASEmake sure that the permissions on this file are such that only root or the web server user can read it (preferably getyour web server to start as root but run as another user, and have the key readable only by root).

As an alternative approach you can use the “SSLPassPhraseDialog exec:/path/to/program” facility.Bear in mind that this is neither more nor less secure, of course.

Page 180: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

172 CHAPTER 5. APACHE SSL/TLS ENCRYPTION

How do I verify that a private key matches its Certificate?

A private key contains a series of numbers. Two of these numbers form the "public key", the others are part of the"private key". The "public key" bits are included when you generate a CSR, and subsequently form part of theassociated Certificate.

To check that the public key in your Certificate matches the public portion of your private key, you simply need tocompare these numbers. To view the Certificate and the key run the commands:

$ openssl x509 -noout -text -in server.crt$ openssl rsa -noout -text -in server.key

The ‘modulus’ and the ‘public exponent’ portions in the key and the Certificate must match. As the public exponentis usually 65537 and it’s difficult to visually check that the long modulus numbers are the same, you can use thefollowing approach:

$ openssl x509 -noout -modulus -in server.crt | openssl md5$ openssl rsa -noout -modulus -in server.key | openssl md5

This leaves you with two rather shorter numbers to compare. It is, in theory, possible that these numbers may be thesame, without the modulus numbers being the same, but the chances of this are overwhelmingly remote.

Should you wish to check to which key or certificate a particular CSR belongs you can perform the same calculationon the CSR as follows:

$ openssl req -noout -modulus -in server.csr | openssl md5

Why do connections fail with an "alert bad certificate" error?

Errors such as OpenSSL: error:14094412: SSL routines:SSL3 READ BYTES:sslv3 alertbad certificate in the SSL logfile, are usually caused by a browser which is unable to handle the servercertificate/private-key. For example, Netscape Navigator 3.x is unable to handle RSA key lengths not equal to 1024bits.

Why does my 2048-bit private key not work?

The private key sizes for SSL must be either 512 or 1024 bits, for compatibility with certain web browsers. A keysizeof 1024 bits is recommended because keys larger than 1024 bits are incompatible with some versions of NetscapeNavigator and Microsoft Internet Explorer, and with other browsers that use RSA’s BSAFE cryptography toolkit.

Why is client authentication broken after upgrading from SSLeay version 0.8 to 0.9?

The CA certificates under the path you configured with SSLCACertificatePath are found by SSLeay throughhash symlinks. These hash values are generated by the ‘openssl x509 -noout -hash’ command. However,the algorithm used to calculate the hash for a certificate changed between SSLeay 0.8 and 0.9. You will need to removeall old hash symlinks and create new ones after upgrading. Use the Makefile provided by MOD SSL.

How can I convert a certificate from PEM to DER format?

The default certificate format for SSLeay/OpenSSL is PEM, which is simply Base64 encoded DER, with header andfooter lines. For some applications (e.g. Microsoft Internet Explorer) you need the certificate in plain DER format.You can convert a PEM file cert.pem into the corresponding DER file cert.der using the following command:$ openssl x509 -in cert.pem -out cert.der -outform DER

Page 181: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

5.5. SSL/TLS STRONG ENCRYPTION: FAQ 173

Why can’t I find the getca or getverisign programs mentioned by Verisign, for installing my Verisigncertificate?

Verisign has never provided specific instructions for Apache+mod ssl. The instructions provided are for C2Net’sStronghold (a commercial Apache based server with SSL support).

To install your certificate, all you need to do is to save the certificate to a file, and give the name of that file to theSSLCERTIFICATEFILE directive. You will also need to give it the key file. For more information, see the SSLCER-TIFICATEKEYFILE directive.

Can I use the Server Gated Cryptography (SGC) facility (aka Verisign Global ID) with mod ssl?

Yes. MOD SSL has included support for the SGC facility since version 2.1. No special configuration is required - justuse the Global ID as your server certificate. The step up of the clients is then automatically handled by MOD SSL atrun-time.

Why do browsers complain that they cannot verify my Verisign Global ID server certificate?

Verisign uses an intermediate CA certificate between the root CA certificate (which is installed in the browsers) andthe server certificate (which you installed on the server). You should have received this additional CA certificate fromVerisign. If not, complain to them. Then, configure this certificate with the SSLCERTIFICATECHAINFILE directive.This ensures that the intermediate CA certificate is sent to the browser, filling the gap in the certificate chain.

The SSL Protocol

• Why do I get lots of random SSL protocol errors under heavy server load?

• Why does my webserver have a higher load, now that it serves SSL encrypted traffic?

• Why do HTTPS connections to my server sometimes take up to 30 seconds to establish a connection?

• What SSL Ciphers are supported by mod ssl?

• Why do I get “no shared cipher” errors, when trying to use Anonymous Diffie-Hellman (ADH) ciphers?

• Why do I get a ’no shared ciphers’ error when connecting to my newly installed server?

• Why can’t I use SSL with name-based/non-IP-based virtual hosts?

• Why is it not possible to use Name-Based Virtual Hosting to identify different SSL virtual hosts?

• How do I get SSL compression working?

• When I use Basic Authentication over HTTPS the lock icon in Netscape browsers stays unlocked when thedialog pops up. Does this mean the username/password is being sent unencrypted?

• Why do I get I/O errors when connecting via HTTPS to an Apache+mod ssl server with Microsoft InternetExplorer (MSIE)?

• Why do I get I/O errors, or the message "Netscape has encountered bad data from the server", when connectingvia HTTPS to an Apache+mod ssl server with Netscape Navigator?

Why do I get lots of random SSL protocol errors under heavy server load?

There can be a number of reasons for this, but the main one is problems with the SSL session Cache specified by theSSLSESSIONCACHE directive. The DBM session cache is the most likely source of the problem, so using the SHMsession cache (or no cache at all) may help.

Page 182: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

174 CHAPTER 5. APACHE SSL/TLS ENCRYPTION

Why does my webserver have a higher load, now that it serves SSL encrypted traffic?

SSL uses strong cryptographic encryption, which necessitates a lot of number crunching. When you request a webpagevia HTTPS, everything (even the images) is encrypted before it is transferred. So increased HTTPS traffic leads toload increases.

Why do HTTPS connections to my server sometimes take up to 30 seconds to establish a connection?

This is usually caused by a /dev/random device for SSLRANDOMSEED which blocks the read(2) call until enoughentropy is available to service the request. More information is available in the reference manual for the SSLRAN-DOMSEED directive.

What SSL Ciphers are supported by mod ssl?

Usually, any SSL ciphers supported by the version of OpenSSL in use, are also supported by MOD SSL. Which ciphersare available can depend on the way you built OpenSSL. Typically, at least the following ciphers are supported:

1. RC4 with MD5

2. RC4 with MD5 (export version restricted to 40-bit key)

3. RC2 with MD5

4. RC2 with MD5 (export version restricted to 40-bit key)

5. IDEA with MD5

6. DES with MD5

7. Triple-DES with MD5

To determine the actual list of ciphers available, you should run the following:

$ openssl ciphers -v

Why do I get “no shared cipher” errors, when trying to use Anonymous Diffie-Hellman (ADH) ciphers?

By default, OpenSSL does not allow ADH ciphers, for security reasons. Please be sure you are aware of the potentialside-effects if you choose to enable these ciphers.

In order to use Anonymous Diffie-Hellman (ADH) ciphers, you must build OpenSSL with “-DSSL ALLOW ADH”,and then add “ADH” into your SSLCIPHERSUITE.

Why do I get a ’no shared ciphers’ error when connecting to my newly installed server?

Either you have made a mistake with your SSLCIPHERSUITE directive (compare it with the pre-configured examplein httpd.conf-dist) or you chose to use DSA/DH algorithms instead of RSA when you generated your privatekey and ignored or overlooked the warnings. If you have chosen DSA/DH, then your server cannot communicate usingRSA-based SSL ciphers (at least until you configure an additional RSA-based certificate/key pair). Modern browserslike NS or IE can only communicate over SSL using RSA ciphers. The result is the "no shared ciphers" error. To fixthis, regenerate your server certificate/key pair, using the RSA algorithm.

Page 183: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

5.5. SSL/TLS STRONG ENCRYPTION: FAQ 175

Why can’t I use SSL with name-based/non-IP-based virtual hosts?

The reason is very technical, and a somewhat "chicken and egg" problem. The SSL protocol layer stays below theHTTP protocol layer and encapsulates HTTP. When an SSL connection (HTTPS) is established Apache/mod ssl hasto negotiate the SSL protocol parameters with the client. For this, mod ssl has to consult the configuration of thevirtual server (for instance it has to look for the cipher suite, the server certificate, etc.). But in order to go to thecorrect virtual server Apache has to know the Host HTTP header field. To do this, the HTTP request header has tobe read. This cannot be done before the SSL handshake is finished, but the information is needed in order to completethe SSL handshake phase. Bingo!

Why is it not possible to use Name-Based Virtual Hosting to identify different SSL virtual hosts?

Name-Based Virtual Hosting is a very popular method of identifying different virtual hosts. It allows you to use thesame IP address and the same port number for many different sites. When people move on to SSL, it seems natural toassume that the same method can be used to have lots of different SSL virtual hosts on the same server.

It comes as rather a shock to learn that it is impossible.

The reason is that the SSL protocol is a separate layer which encapsulates the HTTP protocol. So the SSL session isa separate transaction, that takes place before the HTTP session has begun. The server receives an SSL request on IPaddress X and port Y (usually 443). Since the SSL request does not contain any Host: field, the server has no wayto decide which SSL virtual host to use. Usually, it will just use the first one it finds, which matches the port and IPaddress specified.

You can, of course, use Name-Based Virtual Hosting to identify many non-SSL virtual hosts (all on port 80, forexample) and then have a single SSL virtual host (on port 443). But if you do this, you must make sure to put thenon-SSL port number on the NameVirtualHost directive, e.g.

NameVirtualHost 192.168.1.1:80

Other workaround solutions include:

Using separate IP addresses for different SSL hosts. Using different port numbers for different SSL hosts.

How do I get SSL compression working?

Although SSL compression negotiation was defined in the specification of SSLv2 and TLS, it took until May 2004 forRFC 3749 to define DEFLATE as a negotiable standard compression method.

OpenSSL 0.9.8 started to support this by default when compiled with the zlib option. If both the client and theserver support compression, it will be used. However, most clients still try to initially connect with an SSLv2 Hello.As SSLv2 did not include an array of prefered compression algorithms in its handshake, compression cannot benegotiated with these clients. If the client disables support for SSLv2, either an SSLv3 or TLS Hello may be sent,depending on which SSL library is used, and compression may be set up. You can verify whether clients make use ofSSL compression by logging the %{SSL COMPRESS METHOD}x variable.

When I use Basic Authentication over HTTPS the lock icon in Netscape browsers stays unlocked when thedialog pops up. Does this mean the username/password is being sent unencrypted?

No, the username/password is transmitted encrypted. The icon in Netscape browsers is not actually synchronized withthe SSL/TLS layer. It only toggles to the locked state when the first part of the actual webpage data is transferred, whichmay confuse people. The Basic Authentication facility is part of the HTTP layer, which is above the SSL/TLS layerin HTTPS. Before any HTTP data communication takes place in HTTPS, the SSL/TLS layer has already completedits handshake phase, and switched to encrypted communication. So don’t be confused by this icon.

Page 184: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

176 CHAPTER 5. APACHE SSL/TLS ENCRYPTION

Why do I get I/O errors when connecting via HTTPS to an Apache+mod ssl server with Microsoft InternetExplorer (MSIE)?

The first reason is that the SSL implementation in some MSIE versions has some subtle bugs related to the HTTPkeep-alive facility and the SSL close notify alerts on socket connection close. Additionally the interaction betweenSSL and HTTP/1.1 features are problematic in some MSIE versions. You can work around these problems by forcingApache not to use HTTP/1.1, keep-alive connections or send the SSL close notify messages to MSIE clients. This canbe done by using the following directive in your SSL-aware virtual host section:

SetEnvIf User-Agent ".*MSIE.*" \nokeepalive ssl-unclean-shutdown \downgrade-1.0 force-response-1.0

Further, some MSIE versions have problems with particular ciphers. Unfortunately, it is not possible to implement aMSIE-specific workaround for this, because the ciphers are needed as early as the SSL handshake phase. So a MSIE-specific SETENVIF won’t solve these problems. Instead, you will have to make more drastic adjustments to the globalparameters. Before you decide to do this, make sure your clients really have problems. If not, do not make thesechanges - they will affect all your clients, MSIE or otherwise.

The next problem is that 56bit export versions of MSIE 5.x browsers have a broken SSLv3 implementation, whichinteracts badly with OpenSSL versions greater than 0.9.4. You can accept this and require your clients to upgradetheir browsers, you can downgrade to OpenSSL 0.9.4 (not advised), or you can work around this, accepting that yourworkaround will affect other browsers too:

SSLProtocol all -SSLv3

will completely disables the SSLv3 protocol and allow those browsers to work. A better workaround is to disable onlythose ciphers which cause trouble.

SSLCipherSuiteALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP

This also allows the broken MSIE versions to work, but only removes the newer 56bit TLS ciphers.

Another problem with MSIE 5.x clients is that they refuse to connect to URLs of the formhttps://12.34.56.78/ (where IP-addresses are used instead of the hostname), if the server is usingthe Server Gated Cryptography (SGC) facility. This can only be avoided by using the fully qualified domainname (FQDN) of the website in hyperlinks instead, because MSIE 5.x has an error in the way it handles the SGCnegotiation.

And finally there are versions of MSIE which seem to require that an SSL session can be reused (a totally non standard-conforming behaviour, of course). Connecting with those MSIE versions only work if a SSL session cache is used.So, as a work-around, make sure you are using a session cache (see the SSLSESSIONCACHE directive).

Why do I get I/O errors, or the message "Netscape has encountered bad data from the server", when connectingvia HTTPS to an Apache+mod ssl server with Netscape Navigator?

This usually occurs when you have created a new server certificate for a given domain, but had previously told yourbrowser to always accept the old server certificate. Once you clear the entry for the old certificate from your browser,everything should be fine. Netscape’s SSL implementation is correct, so when you encounter I/O errors with NetscapeNavigator it is usually caused by the configured certificates.

Page 185: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

5.5. SSL/TLS STRONG ENCRYPTION: FAQ 177

mod ssl Support

• What information resources are available in case of mod ssl problems?

• What support contacts are available in case of mod ssl problems?

• What information should I provide when writing a bug report?

• I had a core dump, can you help me?

• How do I get a backtrace, to help find the reason for my core dump?

What information resources are available in case of mod ssl problems?

The following information resources are available. In case of problems you should search here first.

Answers in the User Manual’s F.A.Q. List (this) http://httpd.apache.org/docs/2.0/ssl/ssl faq.html24

First check the F.A.Q. (this text). If your problem is a common one, it may have been answered several timesbefore, and been included in this doc.

Postings from the modssl-users Support Mailing List http://www.modssl.org/support/ Search for your problemin the archives of the modssl-users mailing list. You’re probably not the first person to have had this problem!

What support contacts are available in case of mod ssl problems?

The following lists all support possibilities for mod ssl, in order of preference. Please go through these possibilities inthis order - don’t just pick the one you like the look of.

1. Send a Problem Report to the modssl-users Support Mailing List

[email protected]

This is the preferred way of submitting your problem report, because this way, others can see the problem, andlearn from any answers. You must subscribe to the list first, but you can then easily discuss your problem withboth the author and the whole mod ssl user community.

2. Send a Problem Report to the Apache httpd Users Support Mailing List

[email protected]

This is the second way of submitting your problem report. Again, you must subscribe to the list first, but youcan then easily discuss your problem with the whole Apache httpd user community.

3. Write a Problem Report in the Bug Database

http://httpd.apache.org/bug report.html27

This is the last way of submitting your problem report. You should only do this if you’ve already posted to themailing lists, and had no success. Please follow the instructions on the above page carefully.

24http://httpd.apache.org/docs/2.0/ssl/ssl faq.html25mailto:[email protected]:[email protected]://httpd.apache.org/bug report.html

Page 186: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

178 CHAPTER 5. APACHE SSL/TLS ENCRYPTION

What information should I provide when writing a bug report?

You should always provide at least the following information:

Apache and OpenSSL version information The Apache version can be determined by running httpd -v. TheOpenSSL version can be determined by running openssl version. Alternatively, if you have Lynx in-stalled, you can run the command lynx -mime header http://localhost/ | grep Server togather this information in a single step.

The details on how you built and installed Apache+mod ssl+OpenSSL For this you can provide a logfile of yourterminal session which shows the configuration and install steps. If this is not possible, you should at leastprovide the configure command line you used.

In case of core dumps please include a Backtrace If your Apache+mod ssl+OpenSSL dumps its core, please attacha stack-frame “backtrace” (see below for information on how to get this). This information is required in orderto find a reason for your core dump.

A detailed description of your problem Don’t laugh, we really mean it! Many problem reports don’t include adescription of what the actual problem is. Without this, it’s very difficult for anyone to help you. So, it’s in yourown interest (you want the problem be solved, don’t you?) to include as much detail as possible, please. Ofcourse, you should still include all the essentials above too.

I had a core dump, can you help me?

In general no, at least not unless you provide more details about the code location where Apache dumped core. Whatis usually always required in order to help you is a backtrace (see next question). Without this information it is mostlyimpossible to find the problem and help you in fixing it.

How do I get a backtrace, to help find the reason for my core dump?

Following are the steps you will need to complete, to get a backtrace:

1. Make sure you have debugging symbols available, at least in Apache. On platforms where you use GCC/GDB,you will have to build Apache+mod ssl with “OPTIM="-g -ggdb3"” to get this. On other platforms at least“OPTIM="-g"” is needed.

2. Start the server and try to reproduce the core-dump. For this you may want to use a directive like“CoreDumpDirectory /tmp” to make sure that the core-dump file can be written. This should resultin a /tmp/core or /tmp/httpd.core file. If you don’t get one of these, try running your server under anon-root UID. Many modern kernels do not allow a process to dump core after it has done a setuid() (unlessit does an exec()) for security reasons (there can be privileged information left over in memory). If necessary,you can run /path/to/httpd -X manually to force Apache to not fork.

3. Analyze the core-dump. For this, run gdb /path/to/httpd /tmp/httpd.core or a similar command.In GDB, all you have to do then is to enter bt, and voila, you get the backtrace. For other debuggers consultyour local debugger manual.

Page 187: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

Chapter 6

Guides, Tutorials, and HowTos

179

Page 188: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

180 CHAPTER 6. GUIDES, TUTORIALS, AND HOWTOS

6.1 How-To / Tutorials

How-To / Tutorials

Authentication Authentication is any process by which you verify that someone is who they claim they are. Autho-rization is any process by which someone is allowed to be where they want to go, or to have information thatthey want to have.

See: Authentication, Authorization, and Access Control (p. 181)

Dynamic Content with CGI The CGI (Common Gateway Interface) defines a way for a web server to interact withexternal content-generating programs, which are often referred to as CGI programs or CGI scripts. It is the sim-plest, and most common, way to put dynamic content on your web site. This document will be an introductionto setting up CGI on your Apache web server, and getting started writing CGI programs.

See: CGI: Dynamic Content (p. 185)

.htaccess files .htaccess files provide a way to make configuration changes on a per-directory basis. A file,containing one or more configuration directives, is placed in a particular document directory, and the directivesapply to that directory, and all subdirectories thereof.

See: .htaccess files (p. 197)

Introduction to Server Side Includes SSI (Server Side Includes) are directives that are placed in HTML pages, andevaluated on the server while the pages are being served. They let you add dynamically generated content to anexisting HTML page, without having to serve the entire page via a CGI program, or other dynamic technology.

See: Server Side Includes (SSI) (p. 191)

Per-user web directories On systems with multiple users, each user can be permitted to have a web site in their homedirectory using the USERDIR directive. Visitors to a URL http://example.com/˜username/ will getcontent out of the home directory of the user "username", out of the subdirectory specified by the USERDIRdirective.

See: User web directories (public html) (p. 202)

Page 189: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

6.2. AUTHENTICATION, AUTHORIZATION AND ACCESS CONTROL 181

6.2 Authentication, Authorization and Access Control

Authentication is any process by which you verify that someone is who they claim they are. Authorization is anyprocess by which someone is allowed to be where they want to go, or to have information that they want to have.

Related Modules and Directives

Related ModulesMOD AUTHMOD ACCESS

Related DirectivesALLOWAUTHGROUPFILEAUTHNAMEAUTHTYPEAUTHUSERFILEDENYOPTIONSREQUIRE

Introduction

If you have information on your web site that is sensitive or intended for only a small group of people, the techniquesin this article will help you make sure that the people that see those pages are the people that you wanted to see them.

This article covers the "standard" way of protecting parts of your web site that most of you are going to use.

The Prerequisites

The directives discussed in this article will need to go either in your main server configuration file (typically in a<DIRECTORY> section), or in per-directory configuration files (.htaccess files).

If you plan to use .htaccess files, you will need to have a server configuration that permits putting authenticationdirectives in these files. This is done with the ALLOWOVERRIDE directive, which specifies which directives, if any,may be put in per-directory configuration files.

Since we’re talking here about authentication, you will need an ALLOWOVERRIDE directive like the following:

AllowOverride AuthConfig

Or, if you are just going to put the directives directly in your main server configuration file, you will of course need tohave write permission to that file.

And you’ll need to know a little bit about the directory structure of your server, in order to know where some files arekept. This should not be terribly difficult, and I’ll try to make this clear when we come to that point.

Getting it working

Here’s the basics of password protecting a directory on your server.

You’ll need to create a password file. This file should be placed somewhere not accessible from the web.This is so that folks cannot download the password file. For example, if your documents are served out of/usr/local/apache/htdocs you might want to put the password file(s) in /usr/local/apache/passwd.

Page 190: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

182 CHAPTER 6. GUIDES, TUTORIALS, AND HOWTOS

To create the file, use the htpasswd utility that came with Apache. This will be located in the bin directory ofwherever you installed Apache. To create the file, type:

htpasswd -c /usr/local/apache/passwd/passwords rbowen

htpasswd will ask you for the password, and then ask you to type it again to confirm it:

# htpasswd -c /usr/local/apache/passwd/passwords rbowenNew password: mypasswordRe-type new password: mypassword

Adding password for user rbowen

If htpasswd is not in your path, of course you’ll have to type the full path to the file to get it to run. On my server,it’s located at /usr/local/apache/bin/htpasswd

Next, you’ll need to configure the server to request a password and tell the server which users are allowed access.You can do this either by editing the httpd.conf file or using an .htaccess file. For example, if you wishto protect the directory /usr/local/apache/htdocs/secret, you can use the following directives, eitherplaced in the file /usr/local/apache/htdocs/secret/.htaccess, or placed in httpd.conf inside a<Directory /usr/local/apache/apache/htdocs/secret> section.

AuthType BasicAuthName "Restricted Files"AuthUserFile /usr/local/apache/passwd/passwords

Require user rbowen

Let’s examine each of those directives individually. The AUTHTYPE directive selects that method that is used toauthenticate the user. The most common method is Basic, and this is the method implemented by MOD AUTH. It isimportant to be aware, however, that Basic authentication sends the password from the client to the server unencrypted.This method should therefore not be used for highly sensitive data. Apache supports one other authentication method:AuthType Digest. This method is implemented by MOD AUTH DIGEST and is much more secure. Only the mostrecent versions of clients are known to support Digest authentication.

The AUTHNAME directive sets the Realm to be used in the authentication. The realm serves two major functions.First, the client often presents this information to the user as part of the password dialog box. Second, it is used by theclient to determine what password to send for a given authenticated area.

So, for example, once a client has authenticated in the "Restricted Files" area, it will automatically retry thesame password for any area on the same server that is marked with the "Restricted Files" Realm. Therefore,you can prevent a user from being prompted more than once for a password by letting multiple restricted areas sharethe same realm. Of course, for security reasons, the client will always need to ask again for the password wheneverthe hostname of the server changes.

The AUTHUSERFILE directive sets the path to the password file that we just created with htpasswd. If you have alarge number of users, it can be quite slow to search through a plain text file to authenticate the user on each request.Apache also has the ability to store user information in fast database files. The MOD AUTH DBM module provides theAUTHDBMUSERFILE directive. These files can be created and manipulated with the dbmmanage program. Manyother types of authentication options are available from third party modules in the Apache Modules Database1.

Finally, the REQUIRE directive provides the authorization part of the process by setting the user that is allowed toaccess this region of the server. In the next section, we discuss various ways to use the REQUIRE directive.

1http://modules.apache.org/

Page 191: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

6.2. AUTHENTICATION, AUTHORIZATION AND ACCESS CONTROL 183

Letting more than one person in

The directives above only let one person (specifically someone with a username of rbowen) into the directory. Inmost cases, you’ll want to let more than one person in. This is where the AUTHGROUPFILE comes in.

If you want to let more than one person in, you’ll need to create a group file that associates group names with a list ofusers in that group. The format of this file is pretty simple, and you can create it with your favorite editor. The contentsof the file will look like this:

GroupName: rbowen dpitts sungo rshersey

That’s just a list of the members of the group in a long line separated by spaces.

To add a user to your already existing password file, type:

htpasswd /usr/local/apache/passwd/passwords dpitts

You’ll get the same response as before, but it will be appended to the existing file, rather than creating a new file. (It’sthe -c that makes it create a new password file).

Now, you need to modify your .htaccess file to look like the following:

AuthType BasicAuthName "By Invitation Only"AuthUserFile /usr/local/apache/passwd/passwordsAuthGroupFile /usr/local/apache/passwd/groups

Require group GroupName

Now, anyone that is listed in the group GroupName, and has an entry in the password file, will be let in, if theytype the correct password.

There’s another way to let multiple users in that is less specific. Rather than creating a group file, you can just use thefollowing directive:

Require valid-user

Using that rather than the Require user rbowen line will allow anyone in that is listed in the password file,and who correctly enters their password. You can even emulate the group behavior here, by just keeping a separatepassword file for each group. The advantage of this approach is that Apache only has to check one file, rather thantwo. The disadvantage is that you have to maintain a bunch of password files, and remember to reference the right onein the AUTHUSERFILE directive.

Possible problems

Because of the way that Basic authentication is specified, your username and password must be verified every timeyou request a document from the server. This is even if you’re reloading the same page, and for every image on thepage (if they come from a protected directory). As you can imagine, this slows things down a little. The amount thatit slows things down is proportional to the size of the password file, because it has to open up that file, and go downthe list of users until it gets to your name. And it has to do this every time a page is loaded.

A consequence of this is that there’s a practical limit to how many users you can put in one password file. This limitwill vary depending on the performance of your particular server machine, but you can expect to see slowdowns onceyou get above a few hundred entries, and may wish to consider a different authentication method at that time.

Page 192: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

184 CHAPTER 6. GUIDES, TUTORIALS, AND HOWTOS

What other neat stuff can I do?

Authentication by username and password is only part of the story. Frequently you want to let people in based onsomething other than who they are. Something such as where they are coming from.

The ALLOW and DENY directives let you allow and deny access based on the host name, or host address, of themachine requesting a document. The ORDER directive goes hand-in-hand with these two, and tells Apache in whichorder to apply the filters.

The usage of these directives is:

Allow from address

where address is an IP address (or a partial IP address) or a fully qualified domain name (or a partial domain name);you may provide multiple addresses or domain names, if desired.

For example, if you have someone spamming your message board, and you want to keep them out, you could do thefollowing:

Deny from 10.252.46.165

Visitors coming from that address will not be able to see the content covered by this directive. If, instead, you have amachine name, rather than an IP address, you can use that.

Deny from host.example.com

And, if you’d like to block access from an entire domain, you can specify just part of an address or domain name:

Deny from 192.168.205Deny from phishers.example.com moreidiots.example

Deny from ke

Using ORDER will let you be sure that you are actually restricting things to the group that you want to let in, bycombining a DENY and an ALLOW directive:

Order deny,allowDeny from all

Allow from dev.example.com

Listing just the ALLOW directive would not do what you want, because it will let folks from that host in, in additionto letting everyone in. What you want is to let only those folks in.

More information

You should also read the documentation for MOD AUTH and MOD ACCESS which contain some more informationabout how this all works.

Page 193: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

6.3. APACHE TUTORIAL: DYNAMIC CONTENT WITH CGI 185

6.3 Apache Tutorial: Dynamic Content with CGI

Introduction

Related ModulesMOD ALIASMOD CGI

Related DirectivesADDHANDLEROPTIONSSCRIPTALIAS

The CGI (Common Gateway Interface) defines a way for a web server to interact with external content-generatingprograms, which are often referred to as CGI programs or CGI scripts. It is the simplest, and most common, way toput dynamic content on your web site. This document will be an introduction to setting up CGI on your Apache webserver, and getting started writing CGI programs.

Configuring Apache to permit CGI

In order to get your CGI programs to work properly, you’ll need to have Apache configured to permit CGI execution.There are several ways to do this.

ScriptAlias

The SCRIPTALIAS

directive tells Apache that a particular directory is set aside for CGI programs. Apache will assume that every file inthis directory is a CGI program, and will attempt to execute it, when that particular resource is requested by a client.

The SCRIPTALIAS directive looks like:

ScriptAlias /cgi-bin/ /usr/local/apache2/cgi-bin/

The example shown is from your default httpd.conf configuration file, if you installed Apache in the defaultlocation. The SCRIPTALIAS directive is much like the ALIAS directive, which defines a URL prefix that is tomapped to a particular directory. ALIAS and SCRIPTALIAS are usually used for directories that are outside ofthe DOCUMENTROOT directory. The difference between ALIAS and SCRIPTALIAS is that SCRIPTALIAS has theadded meaning that everything under that URL prefix will be considered a CGI program. So, the example abovetells Apache that any request for a resource beginning with /cgi-bin/ should be served from the directory/usr/local/apache2/cgi-bin/, and should be treated as a CGI program.

For example, if the URL http://www.example.com/cgi-bin/test.pl is requested, Apache will attemptto execute the file /usr/local/apache2/cgi-bin/test.pl and return the output. Of course, the file willhave to exist, and be executable, and return output in a particular way, or Apache will return an error message.

CGI outside of ScriptAlias directories

CGI programs are often restricted to SCRIPTALIAS’ed directories for security reasons. In this way, administrators cantightly control who is allowed to use CGI programs. However, if the proper security precautions are taken, there is noreason why CGI programs cannot be run from arbitrary directories. For example, you may wish to let users have webcontent in their home directories with the USERDIR directive. If they want to have their own CGI programs, but don’thave access to the main cgi-bin directory, they will need to be able to run CGI programs elsewhere.

There are two steps to allowing CGI execution in an arbitrary directory. First, the cgi-script handler must beactivated using the ADDHANDLER or SETHANDLER directive. Second, ExecCGI must be specified in the OPTIONSdirective.

Page 194: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

186 CHAPTER 6. GUIDES, TUTORIALS, AND HOWTOS

Explicitly using Options to permit CGI execution

You could explicitly use the OPTIONS directive, inside your main server configuration file, to specify that CGI execu-tion was permitted in a particular directory:

<Directory /usr/local/apache2/htdocs/somedir>

Options +ExecCGI

</Directory>

The above directive tells Apache to permit the execution of CGI files. You will also need to tell the server what filesare CGI files. The following ADDHANDLER directive tells the server to treat all files with the cgi or pl extension asCGI programs:

AddHandler cgi-script .cgi .pl

.htaccess files

The .htaccess tutorial (p. 197) shows how to activate CGI programs if you do not have access to httpd.conf.

User Directories

To allow CGI program execution for any file ending in .cgi in users’ directories, you can use the following configu-ration.

<Directory /home/*/public html>

Options +ExecCGIAddHandler cgi-script .cgi

</Directory>

If you wish designate a cgi-bin subdirectory of a user’s directory where everything will be treated as a CGI program,you can use the following.

<Directory /home/*/public html/cgi-bin>

Options ExecCGISetHandler cgi-script

</Directory>

Writing a CGI program

There are two main differences between “regular” programming, and CGI programming.

First, all output from your CGI program must be preceded by a MIME-type header. This is HTTP header that tells theclient what sort of content it is receiving. Most of the time, this will look like:

Content-type: text/html

Secondly, your output needs to be in HTML, or some other format that a browser will be able to display. Most ofthe time, this will be HTML, but occasionally you might write a CGI program that outputs a gif image, or othernon-HTML content.

Apart from those two things, writing a CGI program will look a lot like any other program that you might write.

Page 195: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

6.3. APACHE TUTORIAL: DYNAMIC CONTENT WITH CGI 187

Your first CGI program

The following is an example CGI program that prints one line to your browser. Type in the following, save it to a filecalled first.pl, and put it in your cgi-bin directory.

#!/usr/bin/perlprint "Content-type: text/html\n\n";print "Hello, World.";

Even if you are not familiar with Perl, you should be able to see what is happening here. The first line tells Apache (orwhatever shell you happen to be running under) that this program can be executed by feeding the file to the interpreterfound at the location /usr/bin/perl. The second line prints the content-type declaration we talked about, followedby two carriage-return newline pairs. This puts a blank line after the header, to indicate the end of the HTTP headers,and the beginning of the body. The third line prints the string "Hello, World.". And that’s the end of it.

If you open your favorite browser and tell it to get the address

http://www.example.com/cgi-bin/first.pl

or wherever you put your file, you will see the one line Hello, World. appear in your browser window. It’s notvery exciting, but once you get that working, you’ll have a good chance of getting just about anything working.

But it’s still not working!

There are four basic things that you may see in your browser when you try to access your CGI program from the web:

The output of your CGI program Great! That means everything worked fine. If the output is correct, but thebrowser is not processing it correctly, make sure you have the correct Content-Type set in your CGI pro-gram.

The source code of your CGI program or a "POST Method Not Allowed" message That means that you havenot properly configured Apache to process your CGI program. Reread the section on configuring Apache andtry to find what you missed.

A message starting with "Forbidden" That means that there is a permissions problem. Check the Apache error logand the section below on file permissions.

A message saying "Internal Server Error" If you check the Apache error log, you will probably find that it says"Premature end of script headers", possibly along with an error message generated by your CGI program. Inthis case, you will want to check each of the below sections to see what might be preventing your CGI programfrom emitting the proper HTTP headers.

File permissions

Remember that the server does not run as you. That is, when the server starts up, it is running with the permissions ofan unprivileged user - usually nobody, or www - and so it will need extra permissions to execute files that are ownedby you. Usually, the way to give a file sufficient permissions to be executed by nobody is to give everyone executepermission on the file:

chmod a+x first.pl

Also, if your program reads from, or writes to, any other files, those files will need to have the correct permissions topermit this.

Page 196: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

188 CHAPTER 6. GUIDES, TUTORIALS, AND HOWTOS

Path information and environment

When you run a program from your command line, you have certain information that is passed to the shell without youthinking about it. For example, you have a PATH, which tells the shell where it can look for files that you reference.

When a program runs through the web server as a CGI program, it may not have the same PATH. Any programs thatyou invoke in your CGI program (like sendmail, for example) will need to be specified by a full path, so that theshell can find them when it attempts to execute your CGI program.

A common manifestation of this is the path to the script interpreter (often perl) indicated in the first line of your CGIprogram, which will look something like:

#!/usr/bin/perl

Make sure that this is in fact the path to the interpreter.

In addition, if your CGI program depends on other environment variables, you will need to assure that those variablesare passed by Apache.

Program errors

Most of the time when a CGI program fails, it’s because of a problem with the program itself. This is particularly trueonce you get the hang of this CGI stuff, and no longer make the above two mistakes. The first thing to do is to makesure that your program runs from the command line before testing it via the web server. For example, try:

cd /usr/local/apache2/cgi-bin

./first.pl

(Do not call the perl interpreter. The shell and Apache should find the interpreter using the path information on thefirst line of the script.)

The first thing you see written by your program should be a set of HTTP headers, including the Content-Type, fol-lowed by a blank line. If you see anything else, Apache will return the Premature end of script headerserror if you try to run it through the server. See Writing a CGI program above for more details.

Error logs

The error logs are your friend. Anything that goes wrong generates message in the error log. You should always lookthere first. If the place where you are hosting your web site does not permit you access to the error log, you shouldprobably host your site somewhere else. Learn to read the error logs, and you’ll find that almost all of your problemsare quickly identified, and quickly solved.

Suexec

The suexec (p. 68) support program allows CGI programs to be run under different user permissions, depending onwhich virtual host or user home directory they are located in. Suexec has very strict permission checking, and anyfailure in that checking will result in your CGI programs failing with Premature end of script headers.

To check if you are using suexec, run apachectl -V and check for the location of SUEXEC BIN. If Apache findsan suexec binary there on startup, suexec will be activated.

Unless you fully understand suexec, you should not be using it. To disable suexec, simply remove (or rename) thesuexec binary pointed to by SUEXEC BIN and then restart the server. If, after reading about suexec (p. 68) , youstill wish to use it, then run suexec -V to find the location of the suexec log file, and use that log file to find whatpolicy you are violating.

Page 197: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

6.3. APACHE TUTORIAL: DYNAMIC CONTENT WITH CGI 189

What’s going on behind the scenes?

As you become more advanced in CGI programming, it will become useful to understand more about what’s happeningbehind the scenes. Specifically, how the browser and server communicate with one another. Because although it’s allvery well to write a program that prints "Hello, World.", it’s not particularly useful.

Environment variables

Environment variables are values that float around you as you use your computer. They are useful things like yourpath (where the computer searches for the actual file implementing a command when you type it), your username,your terminal type, and so on. For a full list of your normal, every day environment variables, type env at a commandprompt.

During the CGI transaction, the server and the browser also set environment variables, so that they can communicatewith one another. These are things like the browser type (Netscape, IE, Lynx), the server type (Apache, IIS, WebSite),the name of the CGI program that is being run, and so on.

These variables are available to the CGI programmer, and are half of the story of the client-server communication.The complete list of required variables is at http://hoohoo.ncsa.uiuc.edu/cgi/env.html.

This simple Perl CGI program will display all of the environment variables that are being passed around. Two similarprograms are included in the cgi-bin

directory of the Apache distribution. Note that some variables are required, while others are optional, so you may seesome variables listed that were not in the official list. In addition, Apache provides many different ways for you to addyour own environment variables (p. 60) to the basic ones provided by default.

#!/usr/bin/perlprint "Content-type: text/html\n\n";foreach $key (keys %ENV) {

print "$key --> $ENV{$key}<br>";}

STDIN and STDOUT

Other communication between the server and the client happens over standard input (STDIN) and standard output(STDOUT). In normal everyday context, STDIN means the keyboard, or a file that a program is given to act on, andSTDOUT usually means the console or screen.

When you POST a web form to a CGI program, the data in that form is bundled up into a special format and getsdelivered to your CGI program over STDIN. The program then can process that data as though it was coming in fromthe keyboard, or from a file

The "special format" is very simple. A field name and its value are joined together with an equals (=) sign, and pairsof values are joined together with an ampersand (&). Inconvenient characters like spaces, ampersands, and equalssigns, are converted into their hex equivalent so that they don’t gum up the works. The whole data string might looksomething like:

name=Rich%20Bowen&city=Lexington&state=KY&sidekick=Squirrel%20Monkey

You’ll sometimes also see this type of string appended to a URL. When that is done, the server puts that string intothe environment variable called QUERY STRING. That’s called a GET request. Your HTML form specifies whether aGET or a POST is used to deliver the data, by setting the METHOD attribute in the FORM tag.

Page 198: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

190 CHAPTER 6. GUIDES, TUTORIALS, AND HOWTOS

Your program is then responsible for splitting that string up into useful information. Fortunately, there are librariesand modules available to help you process this data, as well as handle other of the aspects of your CGI program.

CGI modules/libraries

When you write CGI programs, you should consider using a code library, or module, to do most of the grunt work foryou. This leads to fewer errors, and faster development.

If you’re writing CGI programs in Perl, modules are available on CPAN2. The most popular module for this purposeis CGI.pm. You might also consider CGI::Lite, which implements a minimal set of functionality, which is all youneed in most programs.

If you’re writing CGI programs in C, there are a variety of options. One of these is the CGIC library, fromhttp://www.boutell.com/cgic/.

For more information

There are a large number of CGI resources on the web. You can discuss CGI problems with other users on the Usenetgroup comp.infosystems.www.authoring.cgi3. And the -servers mailing list from the HTML Writers Guild is a greatsource of answers to your questions. You can find out more at http://www.hwg.org/lists/hwg-servers/.

And, of course, you should probably read the CGI specification, which has all the details on the operation of CGIprograms. You can find the original version at the NCSA4 and there is an updated draft at the Common GatewayInterface RFC project5.

When you post a question about a CGI problem that you’re having, whether to a mailing list, or to a newsgroup, makesure you provide enough information about what happened, what you expected to happen, and how what actuallyhappened was different, what server you’re running, what language your CGI program was in, and, if possible, theoffending code. This will make finding your problem much simpler.

Note that questions about CGI problems should never be posted to the Apache bug database unless you are sure youhave found a problem in the Apache source code.

2http://www.cpan.org/3news:comp.infosystems.www.authoring.cgi4http://hoohoo.ncsa.uiuc.edu/cgi/interface.html5http://web.golux.com/coar/cgi/

Page 199: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

6.4. APACHE TUTORIAL: INTRODUCTION TO SERVER SIDE INCLUDES 191

6.4 Apache Tutorial: Introduction to Server Side Includes

Server-side includes provide a means to add dynamic content to existing HTML documents.

Introduction

Related ModulesMOD INCLUDEMOD CGIMOD EXPIRES

Related DirectivesOPTIONSXBITHACKADDTYPESETOUTPUTFILTERBROWSERMATCHNOCASE

This article deals with Server Side Includes, usually called simply SSI. In this article, I’ll talk about configuring yourserver to permit SSI, and introduce some basic SSI techniques for adding dynamic content to your existing HTMLpages.

In the latter part of the article, we’ll talk about some of the somewhat more advanced things that can be done with SSI,such as conditional statements in your SSI directives.

What are SSI?

SSI (Server Side Includes) are directives that are placed in HTML pages, and evaluated on the server while the pagesare being served. They let you add dynamically generated content to an existing HTML page, without having to servethe entire page via a CGI program, or other dynamic technology.

The decision of when to use SSI, and when to have your page entirely generated by some program, is usually a matterof how much of the page is static, and how much needs to be recalculated every time the page is served. SSI is a greatway to add small pieces of information, such as the current time. But if a majority of your page is being generated atthe time that it is served, you need to look for some other solution.

Configuring your server to permit SSI

To permit SSI on your server, you must have the following directive either in your httpd.conf file, or in a.htaccess file:

Options +Includes

This tells Apache that you want to permit files to be parsed for SSI directives. Note that most configurations containmultiple OPTIONS directives that can override each other. You will probably need to apply the Options to thespecific directory where you want SSI enabled in order to assure that it gets evaluated last.

Not just any file is parsed for SSI directives. You have to tell Apache which files should be parsed. There are two waysto do this. You can tell Apache to parse any file with a particular file extension, such as .shtml, with the followingdirectives:

AddType text/html .shtml

AddOutputFilter INCLUDES .shtml

Page 200: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

192 CHAPTER 6. GUIDES, TUTORIALS, AND HOWTOS

One disadvantage to this approach is that if you wanted to add SSI directives to an existing page, you would have tochange the name of that page, and all links to that page, in order to give it a .shtml extension, so that those directiveswould be executed.

The other method is to use the XBITHACK directive:

XBitHack on

XBITHACK tells Apache to parse files for SSI directives if they have the execute bit set. So, to add SSI directives toan existing page, rather than having to change the file name, you would just need to make the file executable usingchmod.

chmod +x pagename.html

A brief comment about what not to do. You’ll occasionally see people recommending that you just tell Apache toparse all .html files for SSI, so that you don’t have to mess with .shtml file names. These folks have perhaps notheard about XBITHACK. The thing to keep in mind is that, by doing this, you’re requiring that Apache read throughevery single file that it sends out to clients, even if they don’t contain any SSI directives. This can slow things downquite a bit, and is not a good idea.

Of course, on Windows, there is no such thing as an execute bit to set, so that limits your options a little.

In its default configuration, Apache does not send the last modified date or content length HTTP headers on SSI pages,because these values are difficult to calculate for dynamic content. This can prevent your document from being cached,and result in slower perceived client performance. There are two ways to solve this:

1. Use the XBitHack Full configuration. This tells Apache to determine the last modified date by looking onlyat the date of the originally requested file, ignoring the modification date of any included files.

2. Use the directives provided by MOD EXPIRES to set an explicit expiration time on your files, thereby lettingbrowsers and proxies know that it is acceptable to cache them.

Basic SSI directives

SSI directives have the following syntax:

<!--#element attribute=value attribute=value ... -->

It is formatted like an HTML comment, so if you don’t have SSI correctly enabled, the browser will ignore it, but itwill still be visible in the HTML source. If you have SSI correctly configured, the directive will be replaced with itsresults.

The element can be one of a number of things, and we’ll talk some more about most of these in the next installment ofthis series. For now, here are some examples of what you can do with SSI

Today’s date

<!--#echo var="DATE LOCAL" -->

Page 201: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

6.4. APACHE TUTORIAL: INTRODUCTION TO SERVER SIDE INCLUDES 193

The echo element just spits out the value of a variable. There are a number of standard variables, which include thewhole set of environment variables that are available to CGI programs. Also, you can define your own variables withthe set element.

If you don’t like the format in which the date gets printed, you can use the config element, with a timefmtattribute, to modify that formatting.

<!--#config timefmt="%A %B %d, %Y" -->

Today is <!--#echo var="DATE LOCAL" -->

Modification date of the file

This document last modified <!--#flastmod file="index.html" -->

This element is also subject to timefmt format configurations.

Including the results of a CGI program

This is one of the more common uses of SSI - to output the results of a CGI program, such as everybody’s favorite, a“hit counter.”

<!--#include virtual="/cgi-bin/counter.pl" -->

Additional examples

Following are some specific examples of things you can do in your HTML documents with SSI.

When was this document modified?

Earlier, we mentioned that you could use SSI to inform the user when the document was most recently modified.However, the actual method for doing that was left somewhat in question. The following code, placed in your HTMLdocument, will put such a time stamp on your page. Of course, you will have to have SSI correctly enabled, asdiscussed above.

<!--#config timefmt="%A %B %d, %Y" -->

This file last modified <!--#flastmod file="ssi.shtml" -->

Of course, you will need to replace the ssi.shtml with the actual name of the file that you’re referring to. This canbe inconvenient if you’re just looking for a generic piece of code that you can paste into any file, so you probably wantto use the LAST MODIFIED variable instead:

<!--#config timefmt="%D" -->

This file last modified <!--#echo var="LAST MODIFIED" -->

For more details on the timefmt format, go to your favorite search site and look for strftime. The syntax is thesame.

Page 202: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

194 CHAPTER 6. GUIDES, TUTORIALS, AND HOWTOS

Including a standard footer

If you are managing any site that is more than a few pages, you may find that making changes to all those pages canbe a real pain, particularly if you are trying to maintain some kind of standard look across all those pages.

Using an include file for a header and/or a footer can reduce the burden of these updates. You just have to make onefooter file, and then include it into each page with the include SSI command. The include element can determinewhat file to include with either the file attribute, or the virtual attribute. The file attribute is a file path, relativeto the current directory. That means that it cannot be an absolute file path (starting with /), nor can it contain ../ aspart of that path. The virtual attribute is probably more useful, and should specify a URL relative to the documentbeing served. It can start with a /, but must be on the same server as the file being served.

<!--#include virtual="/footer.html" -->

I’ll frequently combine the last two things, putting a LAST MODIFIED directive inside a footer file to be included.SSI directives can be contained in the included file, and includes can be nested - that is, the included file can includeanother file, and so on.

What else can I config?

In addition to being able to config the time format, you can also config two other things.

Usually, when something goes wrong with your SSI directive, you get the message

[an error occurred while processing this directive]

If you want to change that message to something else, you can do so with the errmsg attribute to the configelement:

<!--#config errmsg="[It appears that you don’t know how to use SSI]"

-->

Hopefully, end users will never see this message, because you will have resolved all the problems with your SSIdirectives before your site goes live. (Right?)

And you can config the format in which file sizes are returned with the sizefmt attribute. You can specify bytesfor a full count in bytes, or abbrev for an abbreviated number in Kb or Mb, as appropriate.

Executing commands

I expect that I’ll have an article some time in the coming months about using SSI with small CGI programs. For now,here’s something else that you can do with the exec element. You can actually have SSI execute a command usingthe shell (/bin/sh, to be precise - or the DOS shell, if you’re on Win32). The following, for example, will give youa directory listing.

<pre><!--#exec cmd="ls" -->

</pre>

or, on Windows

Page 203: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

6.4. APACHE TUTORIAL: INTRODUCTION TO SERVER SIDE INCLUDES 195

<pre><!--#exec cmd="dir" -->

</pre>

You might notice some strange formatting with this directive on Windows, because the output from dir contains thestring “<dir>” in it, which confuses browsers.

Note that this feature is exceedingly dangerous, as it will execute whatever code happens to be embedded in theexec tag. If you have any situation where users can edit content on your web pages, such as with a “guestbook”,for example, make sure that you have this feature disabled. You can allow SSI, but not the exec feature, with theIncludesNOEXEC argument to the Options directive.

Advanced SSI techniques

In addition to spitting out content, Apache SSI gives you the option of setting variables, and using those variables incomparisons and conditionals.

Caveat

Most of the features discussed in this article are only available to you if you are running Apache 1.2 or later. Of course,if you are not running Apache 1.2 or later, you need to upgrade immediately, if not sooner. Go on. Do it now. We’llwait.

Setting variables

Using the set directive, you can set variables for later use. We’ll need this later in the discussion, so we’ll talk aboutit here. The syntax of this is as follows:

<!--#set var="name" value="Rich" -->

In addition to merely setting values literally like that, you can use any other variable, including environment variables(p. 60) or the variables discussed above (like LAST MODIFIED, for example) to give values to your variables. Youwill specify that something is a variable, rather than a literal string, by using the dollar sign ($) before the name of thevariable.

<!--#set var="modified" value="$LAST MODIFIED" -->

To put a literal dollar sign into the value of your variable, you need to escape the dollar sign with a backslash.

<!--#set var="cost" value="\$100" -->

Finally, if you want to put a variable in the midst of a longer string, and there’s a chance that the name of the variablewill run up against some other characters, and thus be confused with those characters, you can place the name of thevariable in braces, to remove this confusion. (It’s hard to come up with a really good example of this, but hopefullyyou’ll get the point.)

<!--#set var="date" value="${DATE LOCAL} ${DATE GMT}" -->

Page 204: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

196 CHAPTER 6. GUIDES, TUTORIALS, AND HOWTOS

Conditional expressions

Now that we have variables, and are able to set and compare their values, we can use them to express conditionals. Thislets SSI be a tiny programming language of sorts. MOD INCLUDE provides an if, elif, else, endif structure forbuilding conditional statements. This allows you to effectively generate multiple logical pages out of one actual page.

The structure of this conditional construct is:

<!--#if expr="test condition" --><!--#elif expr="test condition" --><!--#else -->

<!--#endif -->

A test condition can be any sort of logical comparison - either comparing values to one another, or testing the “truth”of a particular value. (A given string is true if it is nonempty.) For a full list of the comparison operators available toyou, see the MOD INCLUDE documentation. Here are some examples of how one might use this construct.

In your configuration file, you could put the following line:

BrowserMatchNoCase macintosh Mac

BrowserMatchNoCase MSIE InternetExplorer

This will set environment variables “Mac” and “InternetExplorer” to true, if the client is running Internet Explorer ona Macintosh.

Then, in your SSI-enabled document, you might do the following:

<!--#if expr="${Mac} && ${InternetExplorer}" -->Apologetic text goes here<!--#else -->Cool JavaScript code goes here

<!--#endif -->

Not that I have anything against IE on Macs - I just struggled for a few hours last week trying to get some JavaScriptworking on IE on a Mac, when it was working everywhere else. The above was the interim workaround.

Any other variable (either ones that you define, or normal environment variables) can be used in conditional statements.With Apache’s ability to set environment variables with the SetEnvIf directives, and other related directives, thisfunctionality can let you do some pretty involved dynamic stuff without ever resorting to CGI.

Conclusion

SSI is certainly not a replacement for CGI, or other technologies used for generating dynamic web pages. But it is agreat way to add small amounts of dynamic content to pages, without doing a lot of extra work.

Page 205: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

6.5. APACHE TUTORIAL: .HTACCESS FILES 197

6.5 Apache Tutorial: .htaccess files

.htaccess files provide a way to make configuration changes on a per-directory basis.

.htaccess files

Related ModulesCOREMOD AUTHMOD CGIMOD INCLUDEMOD MIME

Related DirectivesACCESSFILENAMEALLOWOVERRIDEOPTIONSADDHANDLERSETHANDLERAUTHTYPEAUTHNAMEAUTHUSERFILEAUTHGROUPFILEREQUIRE

What they are/How to use them

.htaccess files (or "distributed configuration files") provide a way to make configuration changes on a per-directory basis. A file, containing one or more configuration directives, is placed in a particular document directory,and the directives apply to that directory, and all subdirectories thereof.

=⇒Note:If you want to call your .htaccess file something else, you can change the name of thefile using the ACCESSFILENAME directive. For example, if you would rather call the file.config then you can put the following in your server configuration file:

AccessFileName .config

In general, .htaccess files use the same syntax as the main configuration files (p. 19) . What you can put in thesefiles is determined by the ALLOWOVERRIDE directive. This directive specifies, in categories, what directives will behonored if they are found in a .htaccess file. If a directive is permitted in a .htaccess file, the documentationfor that directive will contain an Override section, specifying what value must be in ALLOWOVERRIDE in order forthat directive to be permitted.

For example, if you look at the documentation for the ADDDEFAULTCHARSET directive, you will find that it ispermitted in .htaccess files. (See the Context line in the directive summary.) The Override (p. 299) line readsFileInfo. Thus, you must have at least AllowOverride FileInfo in order for this directive to be honored in.htaccess files.

Example:Context: (p. 299) server config, virtual host,

directory, .htaccessOverride: (p. 299) FileInfo

If you are unsure whether a particular directive is permitted in a .htaccess file, look at the documentation for thatdirective, and check the Context line for ".htaccess".

Page 206: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

198 CHAPTER 6. GUIDES, TUTORIALS, AND HOWTOS

When (not) to use .htaccess files

In general, you should never use .htaccess files unless you don’t have access to the main server configuration file.There is, for example, a prevailing misconception that user authentication should always be done in .htaccess files.This is simply not the case. You can put user authentication configurations in the main server configuration, and thisis, in fact, the preferred way to do things.

.htaccess files should be used in a case where the content providers need to make configuration changes to theserver on a per-directory basis, but do not have root access on the server system. In the event that the server adminis-trator is not willing to make frequent configuration changes, it might be desirable to permit individual users to makethese changes in .htaccess files for themselves. This is particularly true, for example, in cases where ISPs arehosting multiple user sites on a single machine, and want their users to be able to alter their configuration.

However, in general, use of .htaccess files should be avoided when possible. Any configuration that you wouldconsider putting in a .htaccess file, can just as effectively be made in a <DIRECTORY> section in your mainserver configuration file.

There are two main reasons to avoid the use of .htaccess files.

The first of these is performance. When ALLOWOVERRIDE is set to allow the use of .htaccess files, Apache willlook in every directory for .htaccess files. Thus, permitting .htaccess files causes a performance hit, whetheror not you actually even use them! Also, the .htaccess file is loaded every time a document is requested.

Further note that Apache must look for .htaccess files in all higher-level directories, in order to have a full com-plement of directives that it must apply. (See section on how directives are applied.) Thus, if a file is requested out ofa directory /www/htdocs/example, Apache must look for the following files:

/.htaccess/www/.htaccess/www/htdocs/.htaccess

/www/htdocs/example/.htaccess

And so, for each file access out of that directory, there are 4 additional file-system accesses, even if none of those filesare present. (Note that this would only be the case if .htaccess files were enabled for /, which is not usually thecase.)

The second consideration is one of security. You are permitting users to modify server configuration, which may resultin changes over which you have no control. Carefully consider whether you want to give your users this privilege.Note also that giving users less privileges than they need will lead to additional technical support requests. Makesure you clearly tell your users what level of privileges you have given them. Specifying exactly what you have setALLOWOVERRIDE to, and pointing them to the relevant documentation, will save yourself a lot of confusion later.

Note that it is completely equivalent to put a .htaccess file in a directory /www/htdocs/example containing adirective, and to put that same directive in a Directory section <Directory /www/htdocs/example> in yourmain server configuration:

.htaccess file in /www/htdocs/example:

Contents of .htaccess file in /www/htdocs/exampleAddType text/example .exm

Section from your httpd.conf file<Directory /www/htdocs/example>

AddType text/example .exm

</Directory>

Page 207: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

6.5. APACHE TUTORIAL: .HTACCESS FILES 199

However, putting this configuration in your server configuration file will result in less of a performance hit, as theconfiguration is loaded once when Apache starts, rather than every time a file is requested.

The use of .htaccess files can be disabled completely by setting the ALLOWOVERRIDE directive to none:

AllowOverride None

How directives are applied

The configuration directives found in a .htaccess file are applied to the directory in which the .htaccess fileis found, and to all subdirectories thereof. However, it is important to also remember that there may have been.htaccess files in directories higher up. Directives are applied in the order that they are found. Therefore, a.htaccess file in a particular directory may override directives found in .htaccess files found higher up inthe directory tree. And those, in turn, may have overridden directives found yet higher up, or in the main serverconfiguration file itself.

Example:

In the directory /www/htdocs/example1 we have a .htaccess file containing the following:

Options +ExecCGI

(Note: you must have "AllowOverride Options" in effect to permit the use of the "OPTIONS" directive in.htaccess files.)

In the directory /www/htdocs/example1/example2 we have a .htaccess file containing:

Options Includes

Because of this second .htaccess file, in the directory /www/htdocs/example1/example2, CGI executionis not permitted, as only Options Includes is in effect, which completely overrides any earlier setting that mayhave been in place.

Merging of .htaccess with the main configuration files

As discussed in the documentation on Configuration Sections (p. 21) , .htaccess files can override the <DIREC-TORY> sections for the corresponding directory, but will be overriden by other types of configuration sections fromthe main configuration files. This fact can be used to enforce certain configurations, even in the presence of a lib-eral ALLOWOVERRIDE setting. For example, to prevent script execution while allowing anything else to be set in.htaccess you can use:

<Directory />

Allowoverride All

</Directory>

<Location />

Options +IncludesNoExec -ExecCGI

</Location>

Page 208: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

200 CHAPTER 6. GUIDES, TUTORIALS, AND HOWTOS

Authentication example

If you jumped directly to this part of the document to find out how to do authentication, it is important to noteone thing. There is a common misconception that you are required to use .htaccess files in order to implementpassword authentication. This is not the case. Putting authentication directives in a <DIRECTORY> section, in yourmain server configuration file, is the preferred way to implement this, and .htaccess files should be used only ifyou don’t have access to the main server configuration file. See above for a discussion of when you should and shouldnot use .htaccess files.

Having said that, if you still think you need to use a .htaccess file, you may find that a configuration such as whatfollows may work for you.

You must have "AllowOverride AuthConfig" in effect for these directives to be honored.

.htaccess file contents:

AuthType BasicAuthName "Password Required"AuthUserFile /www/passwords/password.fileAuthGroupFile /www/passwords/group.file

Require Group admins

Note that AllowOverride AuthConfig must be in effect for these directives to have any effect.

Please see the authentication tutorial (p. 181) for a more complete discussion of authentication and authorization.

Server Side Includes example

Another common use of .htaccess files is to enable Server Side Includes for a particular directory. This may bedone with the following configuration directives, placed in a .htaccess file in the desired directory:

Options +IncludesAddType text/html shtml

AddHandler server-parsed shtml

Note that AllowOverride Options and AllowOverride FileInfo must both be in effect for these direc-tives to have any effect.

Please see the SSI tutorial (p. 191) for a more complete discussion of server-side includes.

CGI example

Finally, you may wish to use a .htaccess file to permit the execution of CGI programs in a particular directory.This may be implemented with the following configuration:

Options +ExecCGI

AddHandler cgi-script cgi pl

Alternately, if you wish to have all files in the given directory be considered to be CGI programs, this may be donewith the following configuration:

Options +ExecCGI

SetHandler cgi-script

Page 209: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

6.5. APACHE TUTORIAL: .HTACCESS FILES 201

Note that AllowOverride Options and AllowOverride FileInfo must both be in effect for these direc-tives to have any effect.

Please see the CGI tutorial (p. 185) for a more complete discussion of CGI programming and configuration.

Troubleshooting

When you put configuration directives in a .htaccess file, and you don’t get the desired effect, there are a numberof things that may be going wrong.

Most commonly, the problem is that ALLOWOVERRIDE is not set such that your configuration directives are beinghonored. Make sure that you don’t have a AllowOverride None in effect for the file scope in question. A goodtest for this is to put garbage in your .htaccess file and reload. If a server error is not generated, then you almostcertainly have AllowOverride None in effect.

If, on the other hand, you are getting server errors when trying to access documents, check your Apache error log. Itwill likely tell you that the directive used in your .htaccess file is not permitted. Alternately, it may tell you thatyou had a syntax error, which you will then need to fix.

Page 210: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

202 CHAPTER 6. GUIDES, TUTORIALS, AND HOWTOS

6.6 Per-user web directories

On systems with multiple users, each user can be permitted to have a web site in their home directory using theUSERDIR directive. Visitors to a URL http://example.com/˜username/ will get content out of the homedirectory of the user "username", out of the subdirectory specified by the USERDIR directive.

See also

• Mapping URLs to the Filesystem (p. 36)

Per-user web directories

Related ModulesMOD USERDIR

Related DirectivesUSERDIRDIRECTORYMATCHALLOWOVERRIDE

Setting the file path with UserDir

The USERDIR directive specifies a directory out of which per-user content is loaded. This directive may take severaldifferent forms.

If a path is given which does not start with a leading slash, it is assumed to be a directory path relative to the homedirectory of the specified user. Given this configuration:

UserDir public html

the URL http://example.com/˜rbowen/file.html will be translated to the file path/home/rbowen/public html/file.html

If a path is given starting with a slash, a directory path will be constructed using that path, plus the username specified.Given this configuration:

UserDir /var/html

the URL http://example.com/˜rbowen/file.html will be translated to the file path/var/html/rbowen/file.html

If a path is provided which contains an asterisk (*), a path is used in which the asterisk is replaced with the username.Given this configuration:

UserDir /var/www/*/docs

the URL http://example.com/˜rbowen/file.html will be translated to the file path/var/www/rbowen/docs/file.html

Page 211: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

6.6. PER-USER WEB DIRECTORIES 203

Restricting what users are permitted to use this feature

Using the syntax shown in the UserDir documentation, you can restrict what users are permitted to use this function-ality:

UserDir enabled

UserDir disabled root jro fish

The configuration above will enable the feature for all users except for those listed in the disabled statement. Youcan, likewise, disable the feature for all but a few users by using a configuration like the following:

UserDir disabled

UserDir enabled rbowen krietz

See USERDIR documentation for additional examples.

Enabling a cgi directory for each user

In order to give each user their own cgi-bin directory, you can use a <DIRECTORY> directive to make a particularsubdirectory of a user’s home directory cgi-enabled.

<Directory /home/*/public html/cgi-bin/>Options ExecCGISetHandler cgi-script

</Directory>

Then, presuming that UserDir is set to public html, a cgi program example.cgi could be loaded from thatdirectory as:

http://example.com/˜rbowen/cgi-bin/example.cgi

Allowing users to alter configuration

If you want to allows users to modify the server configuration in their web space, they will need to use .htaccessfiles to make these changed. Ensure that you have set ALLOWOVERRIDE to a value sufficient for the directives thatyou want to permit the users to modify. See the .htaccess tutorial (p. 197) for additional details on how this works.

Page 212: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

204 CHAPTER 6. GUIDES, TUTORIALS, AND HOWTOS

6.7 Apache Tutorials

! Warning:This document has not been fully updated to take into account changes made in the 2.0 versionof the Apache HTTP Server. Some of the information may still be relevant, but please use itwith care.

The following documents give you step-by-step instructions on how to accomplish common tasks with the ApacheHTTP server. Many of these documents are located at external sites and are not the work of the Apache SoftwareFoundation. Copyright to documents on external sites is owned by the authors or their assignees. Please consult theofficial Apache Server documentation (p. ??) to verify what you read on external sites.

Installation & Getting Started

• Getting Started with Apache 1.36 (ApacheToday)• Configuring Your Apache Server Installation7 (ApacheToday)• Getting, Installing, and Running Apache (on Unix)8 (O’Reilly Network Apache DevCenter)• Maximum Apache: Getting Started9 (CNET Builder.com)• How to Build the Apache of Your Dreams10 (Developer Shed)

Basic Configuration

• An Amble Through Apache Configuration11 (O’Reilly Network Apache DevCenter)• Using .htaccess Files with Apache12 (ApacheToday)• Setting Up Virtual Hosts13 (ApacheToday)• Maximum Apache: Configure Apache14 (CNET Builder.com)• Getting More Out of Apache15 (Developer Shed)

Security

• Security and Apache: An Essential Primer16 (LinuxPlanet)• Using User Authentication17 (Apacheweek)• DBM User Authentication18 (Apacheweek)• An Introduction to Securing Apache19 (Linux.com)• Securing Apache - Access Control20 (Linux.com)

6http://apachetoday.com/news story.php3?ltsn=2000-06-1-001-01-NW-DP-LF7http://apachetoday.com/news story.php3?ltsn=2000-07-10-001-01-NW-LF-SW8http://www.onlamp.com/pub/a/apache/2000/02/24/installing apache.html9http://www.builder.com/Servers/Apache/ss01.html

10http://www.devshed.com/Server Side/Administration/APACHE/11http://www.onlamp.com/pub/a/apache/2000/03/02/configuring apache.html12http://apachetoday.com/news story.php3?ltsn=2000-07-19-002-01-NW-LF-SW13http://apachetoday.com/news story.php3?ltsn=2000-07-17-001-01-PS14http://www.builder.com/Servers/Apache/ss02.html15http://www.devshed.com/Server Side/Administration/MoreApache/16http://www.linuxplanet.com/linuxplanet/tutorials/1527/1/17http://www.apacheweek.com/features/userauth18http://www.apacheweek.com/features/dbmauth19http://linux.com/security/newsitem.phtml?sid=12&aid=354920http://linux.com/security/newsitem.phtml?sid=12&aid=3667

Page 213: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

6.7. APACHE TUTORIALS 205

• Apache Authentication Part 121 - Part 222 - Part 323 - Part 424 (ApacheToday)

• mod access: Restricting Access by Host25 (ApacheToday)

Logging

• Log Rhythms26 (O’Reilly Network Apache DevCenter)

• Gathering Visitor Information: Customising Your Logfiles27 (Apacheweek)

• Apache Guide: Logging Part 128 - Part 229 - Part 330 - Part 431 - Part 532 (ApacheToday)

CGI and SSI

• Dynamic Content with CGI33 (ApacheToday)

• The Idiot’s Guide to Solving Perl CGI Problems34 (CPAN)

• Executing CGI Scripts as Other Users35 (LinuxPlanet)

• CGI Programming FAQ36 (Web Design Group)

• Introduction to Server Side Includes Part 137 - Part 238 (ApacheToday)

• Advanced SSI Techniques39 (ApacheToday)

• Setting up CGI and SSI with Apache40 (CNET Builder.com)

Other Features

• Content Negotiation Explained41 (Apacheweek)

• Using Apache Imagemaps42 (Apacheweek)

• Keeping Your Images from Adorning Other Sites43 (ApacheToday)

• Language Negotiation Notes44 (Alan J. Flavell)

21http://apachetoday.com/news story.php3?ltsn=2000-07-24-002-01-NW-LF-SW22http://apachetoday.com/news story.php3?ltsn=2000-07-31-001-01-NW-DP-LF23http://apachetoday.com/news story.php3?ltsn=2000-08-07-001-01-NW-LF-SW24http://apachetoday.com/news story.php3?ltsn=2000-08-14-001-01-NW-LF-SW25http://apachetoday.com/news story.php3?ltsn=2000-11-13-003-01-SC-LF-SW26http://www.onlamp.com/pub/a/apache/2000/03/10/log rhythms.html27http://www.apacheweek.com/features/logfiles28http://apachetoday.com/news story.php3?ltsn=2000-08-21-003-01-NW-LF-SW29http://apachetoday.com/news story.php3?ltsn=2000-08-28-001-01-NW-LF-SW30http://apachetoday.com/news story.php3?ltsn=2000-09-05-001-01-NW-LF-SW31http://apachetoday.com/news story.php3?ltsn=2000-09-18-003-01-NW-LF-SW32http://apachetoday.com/news story.php3?ltsn=2000-09-25-001-01-NW-LF-SW33http://apachetoday.com/news story.php3?ltsn=2000-06-05-001-10-NW-LF-SW34http://www.cpan.org/doc/FAQs/cgi/idiots-guide.html35http://www.linuxplanet.com/linuxplanet/tutorials/1445/1/36http://www.htmlhelp.org/faq/cgifaq.html37http://apachetoday.com/news story.php3?ltsn=2000-06-12-001-01-PS38http://apachetoday.com/news story.php3?ltsn=2000-06-19-002-01-NW-LF-SW39http://apachetoday.com/news story.php3?ltsn=2000-06-26-001-01-NW-LF-SW40http://www.builder.com/Servers/ApacheFiles/082400/41http://www.apacheweek.com/features/negotiation42http://www.apacheweek.com/features/imagemaps43http://apachetoday.com/news story.php3?ltsn=2000-06-14-002-01-PS44http://ppewww.ph.gla.ac.uk/˜flavell/www/lang-neg.html

Page 214: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

206 CHAPTER 6. GUIDES, TUTORIALS, AND HOWTOS

If you have a pointer to an accurate and well-written tutorial not included here, please let us know by submitting it tothe Apache Bug Database45.

45http://bugs.apache.org/

Page 215: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

Chapter 7

Platform-specific Notes

207

Page 216: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

208 CHAPTER 7. PLATFORM-SPECIFIC NOTES

7.1 Platform Specific Notes

Microsoft Windows

Using Apache This document explains how to install, configure and run Apache 2.0 under Microsoft Windows.

See: Using Apache with Microsoft Windows (p. 209)

Compiling Apache There are many important points before you begin compiling Apache. This document explainthem.

See: Compiling Apache for Microsoft Windows (p. 218)

Other Platforms

Novell NetWare This document explains how to install, configure and run Apache 2.0 under Novell NetWare 5.1 andabove.

See: Using Apache With Novell NetWare (p. 223)

EBCDIC Version 1.3 of the Apache HTTP Server is the first version which includes a port to a (non-ASCII) main-frame machine which uses the EBCDIC character set as its native codeset.

! Warning: This document has not been updated to take into account changes made in the 2.0version of the Apache HTTP Server. Some of the information may still be relevant, but pleaseuse it with care.

See: The Apache EBCDIC Port (p. 230)

Page 217: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

7.2. USING APACHE WITH MICROSOFT WINDOWS 209

7.2 Using Apache with Microsoft Windows

This document explains how to install, configure and run Apache 2.0 under Microsoft Windows. If you find any bugs,or wish to contribute in other ways, please use our bug reporting page1.

This document assumes that you are installing a binary distribution of Apache. If you want to compile Apache yourself(possibly to help with development or tracking down bugs), see Compiling Apache for Microsoft Windows (p. 218) .

Because of the current versioning policies on Microsoft Windows operating system families, this documentassumes the following:

• Windows NT: This means all versions of Windows that are based on the Windows NT kernel. Includes WindowsNT, Windows 2000, Windows XP and Windows .Net Server 2003.

• Windows 9x: This means older, consumer-oriented versions of Windows. Includes Windows 95 (also OSR2),Windows 98 and Windows ME.

Operating System Requirements

The primary Windows platform for running Apache 2.0 is Windows NT. The binary installer only works with the x86family of processors, such as Intel and AMD processors. Running Apache on Windows 9x is not thoroughly tested,and it is never recommended on production systems.

On all operating systems, TCP/IP networking must be installed and working. If running on Windows 95, the Winsock2 upgrade must be installed. Winsock 2 for Windows 95 can be downloaded from here2.

On Windows NT 4.0, installing Service Pack 6 is strongly recommended, as Service Pack 4 created known issues withTCP/IP and Winsock integrity that were resolved in later Service Packs.

Downloading Apache for Windows

Information on the latest versions of Apache can be found on the web site of the Apache web server athttp://httpd.apache.org/download.cgi. There you will find the current release, as well as more recent alpha or betatest versions, and a list of HTTP and FTP mirrors from which you can download the Apache web server. Please use amirror near to you for a fast and reliable download.

For Windows installations you should download the version of Apache for Windows with the .msi extension. This isa single Microsoft Installer file, which contains a ready-to-run version of Apache. There is a separate .zip file, whichcontains only the source code. You can compile Apache yourself with the Microsoft Visual C++ (Visual Studio) tools.

Installing Apache for Windows

You need Microsoft Installer 1.2 or above for the installation to work. On Windows 9x you can update your MicrosoftInstaller to version 2.0 here3 and on Windows NT 4.0 and 2000 the version 2.0 update can be found here4. WindowsXP does not need this update.

Note that you cannot install two versions of Apache 2.0 on the same computer with the binary installer. You can,however, install a version of the 1.3 series and a version of the 2.0 series on the same computer without problems. Ifyou need to have two different 2.0 versions on the same computer, you have to compile and install Apache from thesource (p. 218) .

Run the Apache .msi file you downloaded above. The installation will ask you for these things:1http://httpd.apache.org/bug report.html2http://www.microsoft.com/windows95/downloads/contents/WUAdminTools/S WUNetworkingTools/W95Sockets2/Default.asp3http://www.microsoft.com/downloads/release.asp?ReleaseID=328314http://www.microsoft.com/downloads/release.asp?ReleaseID=32832

Page 218: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

210 CHAPTER 7. PLATFORM-SPECIFIC NOTES

1. Network Domain. Enter the DNS domain in which your server is or will be registered in. For example, if yourserver’s full DNS name is server.mydomain.net, you would type mydomain.net here.

2. Server Name. Your server’s full DNS name. From the example above, you would typeserver.mydomain.net here.

3. Administrator’s Email Address. Enter the server administrator’s or webmaster’s email address here. Thisaddress will be displayed along with error messages to the client by default.

4. For whom to install Apache Select for All Users, on Port 80, as a Service -Recommended if you’d like your new Apache to listen at port 80 for incoming traffic. It will run as a service(that is, Apache will run even if no one is logged in on the server at the moment) Select only for theCurrent User, on Port 8080, when started Manually if you’d like to install Apache foryour personal experimenting or if you already have another WWW server running on port 80.

5. The installation type. Select Typical for everything except the source code and libraries for module devel-opment. With Custom you can specify what to install. A full install will require about 13 megabytes of freedisk space. This does not include the size of your web site(s).

6. Where to install. The default path is C:\Program Files\Apache Group under which a directory calledApache2 will be created by default.

During the installation, Apache will configure the files in the conf subdirectory to reflect the chosen installationdirectory. However, if any of the configuration files in this directory already exist, they will not be overwritten.Instead, the new copy of the corresponding file will be left with the extension .default. So, for example, ifconf\httpd.conf already exists, it will be renamed as conf\httpd.conf.default. After the installationyou should manually check to see what new settings are in the .default file, and if necessary, update your existingconfiguration file.

Also, if you already have a file called htdocs\index.html, it will not be overwritten (and noindex.html.default will be installed either). This means it should be safe to install Apache over an exist-ing installation, although you would have to stop the existing running server before doing the installation, and thenstart the new one after the installation is finished.

After installing Apache, you must edit the configuration files in the conf subdirectory as required. These files willbe configured during the installation so that Apache is ready to be run from the directory it was installed into, withthe documents server from the subdirectory htdocs. There are lots of other options which you should set before youreally start using Apache. However, to get started quickly, the files should work as installed.

Customizing Apache for Windows

Apache is configured by the files in the conf subdirectory. These are the same files used to configure the Unix version,but there are a few different directives for Apache on Windows. See the directive index (p. 663) for all the availabledirectives.

The main differences in Apache for Windows are:

• Because Apache for Windows is multithreaded, it does not use a separate process for each request, as Apachedoes on Unix. Instead there are usually only two Apache processes running: a parent process, and a child whichhandles the requests. Within the child process each request is handled by a separate thread.

The process management directives are also different:

MAXREQUESTSPERCHILD: Like the Unix directive, this controls how many requests a single child pro-cess will serve before exiting. However, unlike on Unix, a single process serves all the requests at once,not just one. If this is set, it is recommended that a very high number is used. The recommended default,MaxRequestsPerChild 0, causes the child process to never exit.

Page 219: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

7.2. USING APACHE WITH MICROSOFT WINDOWS 211

! Warning: The server configuration file is reread when a new child process is started. Ifyou have modified httpd.conf, the new child may not start or you may receive unex-pected results.

THREADSPERCHILD: This directive is new. It tells the server how many threads it should use. This is themaximum number of connections the server can handle at once, so be sure to set this number high enough foryour site if you get a lot of hits. The recommended default is ThreadsPerChild 50.

• The directives that accept filenames as arguments must use Windows filenames instead of Unix ones. However,because Apache uses Unix-style names internally, you must use forward slashes, not backslashes. Drive letterscan be used; if omitted, the drive with the Apache executable will be assumed.

• While filenames are generally case-insensitive on Windows, URLs are still treated internally as case-sensitivebefore they are mapped to the filesystem. For example, the <LOCATION>, ALIAS, and PROXYPASS directivesall use case-sensitive arguments. For this reason, it is particularly important to use the <DIRECTORY> directivewhen attempting to limit access to content in the filesystem, since this directive applies to any content in adirectory, regardless of how it is accessed. If you wish to assure that only lowercase is used in URLs, you canuse something like:

RewriteEngine OnRewriteMap lowercase int:tolowerRewriteCond %{REQUEST URI} [A-Z]

RewriteRule (.*) ${lowercase:$1} [R,L]

• Apache for Windows contains the ability to load modules at runtime, without recompiling the server. If Apacheis compiled normally, it will install a number of optional modules in the \Apache2\modules directory. Toactivate these or other modules, the new LOADMODULE directive must be used. For example, to activate thestatus module, use the following (in addition to the status-activating directives in access.conf):

LoadModule status module modules/mod status.so

Information on creating loadable modules (p. 545) is also available.

• Apache can also load ISAPI (Internet Server Application Programming Interface) extensions (i.e. internet serverapplications), such as those used by Microsoft IIS and other Windows servers. More information is available (p.461) . Note that Apache cannot load ISAPI Filters.

• When running CGI scripts, the method Apache uses to find the interpreter for the script is configurable usingthe SCRIPTINTERPRETERSOURCE directive.

• Since it is often difficult to manage files with names like .htaccess in Windows, you may find it useful tochange the name of this per-directory configuration file using the ACCESSFILENAME directive.

• Any errors during Apache startup are logged into the Windows event log when running on Windows NT.This mechanism acts as a backup for those situations where Apache cannot even access the normally usederror.log file. You can view the Windows event log by using the Event Viewer application on Windows NT4.0, and the Event Viewer MMC snap-in on newer versions of Windows.

=⇒Note that there is no startup error logging on Windows 9x because no Windows event logexists on those operating systems.

Running Apache as a Service

Apache can be run as a service on Windows NT. There is some highly experimental support for similar behavior onWindows 9x.

Page 220: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

212 CHAPTER 7. PLATFORM-SPECIFIC NOTES

You can install Apache as a service automatically during the installation. If you chose to install for all users, theinstallation will create an Apache service for you. If you specify to install for yourself only, you can manually registerApache as a service after the installation. You have to be a member of the Administrators group for the serviceinstallation to succeed.

Apache comes with a utility called the Apache Service Monitor. With it you can see and manage the state of allinstalled Apache services on any machine on your network. To be able to manage an Apache service with the monitor,you have to first install the service (either automatically via the installation or manually).

You can install Apache as a Windows NT service as follows from the command prompt at the Apache bin subdirec-tory:

httpd -k install

If you need to specify the name of the service you want to install, use the following command. You have to do this ifyou have several different service installations of Apache on your computer.

httpd -k install -n "MyServiceName"

If you need to have specifically named configuration files for different services, you must use this:

httpd -k install -n "MyServiceName" -f "c:\files\my.conf"

If you use the first command without any special parameters except -k install, the service will be calledApache2 and the configuration will be assumed to be conf\httpd.conf.

Removing an Apache service is easy. Just use:

httpd -k uninstall

The specific Apache service to be uninstalled can be specified by using:

httpd -k uninstall -n "MyServiceName"

Normal starting, restarting and shutting down of an Apache service is usually done via the Apache Service Moni-tor, by using commands like NET START Apache2 and NET STOP Apache2 or via normal Windows servicemanagement. Before starting Apache as a service by any means, you should test the service’s configuration file byusing:

httpd -n "MyServiceName" -t

You can control an Apache service by its command line switches, too. To start an installed Apache service you’ll usethis:

httpd -k start

To stop an Apache service via the command line switches, use this:

Page 221: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

7.2. USING APACHE WITH MICROSOFT WINDOWS 213

httpd -k stop

or

httpd -k shutdown

You can also restart a running service and force it to reread its configuration file by using:

httpd -k restart

By default, all Apache services are registered to run as the system user (the LocalSystem account). TheLocalSystem account has no privileges to your network via any Windows-secured mechanism, including the filesystem, named pipes, DCOM, or secure RPC. It has, however, wide privileges locally.

! Never grant any network privileges to the LocalSystem account! If you need Apacheto be able to access network resources, create a separate account for Apache as notedbelow.

You may want to create a separate account for running Apache service(s). Especially, if you have to access networkresources via Apache, this is strongly recommended.

1. Create a normal domain user account, and be sure to memorize its password.

2. Grant the newly-created user a privilege of Log on as a service and Act as part of theoperating system. On Windows NT 4.0 these privileges are granted via User Manager for Domains,but on Windows 2000 and XP you probably want to use Group Policy for propagating these settings. You canalso manually set these via the Local Security Policy MMC snap-in.

3. Confirm that the created account is a member of the Users group.

4. Grant the account read and execute (RX) rights to all document and script folders (htdocs and cgi-bin forexample).

5. Grant the account change (RWXD) rights to the Apache logs directory.

6. Grant the account read and execute (RX) rights to the Apache.exe binary executable.

=⇒It is usually a good practice to grant the user the Apache service runs as read and execute (RX)access to the whole Apache2 directory, except the logs subdirectory, where the user has tohave at least change (RWXD) rights.

If you allow the account to log in as a user and as a service, then you can log on with that account and test thatthe account has the privileges to execute the scripts, read the web pages, and that you can start Apache in a consolewindow. If this works, and you have followed the steps above, Apache should execute as a service with no problems.

=⇒Error code 2186 is a good indication that you need to review the "Log On As" configurationfor the service, since Apache cannot access a required network resource. Also, pay closeattention to the privileges of the user Apache is configured to run as.

When starting Apache as a service you may encounter an error message from the Windows Service Control Manager.For example, if you try to start Apache by using the Services applet in the Windows Control Panel, you may get thefollowing message:

Page 222: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

214 CHAPTER 7. PLATFORM-SPECIFIC NOTES

Could not start the Apache2 service on \\COMPUTERError 1067; The process terminated unexpectedly.

You will get this generic error if there is any problem with starting the Apache service. In order to see what is reallycausing the problem you should follow the instructions for Running Apache for Windows from the Command Prompt.

There is some support for Apache on Windows 9x to behave in a similar manner as a service on Windows NT. Itis highly experimental. It is not of production-class reliability, and its future is not guaranteed. It can be mostlyregarded as a risky thing to play with - proceed with caution!

There are some differences between the two kinds of services you should be aware of:

• Apache will attempt to start and if successful it will run in the background. If you run the command

httpd -n "MyServiceName" -k start

via a shortcut on your desktop, for example, then if the service starts successfully, a console window will flash upbut it immediately disappears. If Apache detects any errors on startup such as incorrect entries in the httpd.confconfiguration file, the console window will remain visible. This will display an error message which will beuseful in tracking down the cause of the problem.

• Windows 9x does not support NET START or NET STOP commands. You must control the Apache service onthe command prompt via the -k switches.

• Apache and Windows 9x offer no support for running Apache as a specific user with network privileges. Infact, Windows 9x offers no security on the local machine, either. This is the simple reason because of whichthe Apache Software Foundation never endorses use of a Windows 9x -based system as a public Apache server.The primitive support for Windows 9x exists only to assist the user in developing web content and learning theApache server, and perhaps as an intranet server on a secured, private network.

Once you have confirmed that Apache runs correctly as a console application you can install, control and uninstall thepseudo-service with the same commands as on Windows NT. You can also use the Apache Service Monitor to manageWindows 9x pseudo-services.

Running Apache as a Console Application

Running Apache as a service is usually the recommended way to use it, but it is sometimes easier to work from thecommand line (on Windows 9x running Apache from the command line is the recommended way due to the lack ofreliable service support.)

To run Apache from the command line as a console application, use the following command:

httpd

Apache will execute, and will remain running until it is stopped by pressing Control-C.

You can also run Apache via the shortcut Start Apache in Console placed to Start Menu --> Programs -->Apache HTTP Server 2.0.xx --> Control Apache Server during the installation. This will open aconsole window and start Apache inside it. If you don’t have Apache installed as a service, the window will remainvisible until you stop Apache by pressing Control-C in the console window where Apache is running in. The serverwill exit in a few seconds. However, if you do have Apache installed as a service, the shortcut starts the service. If theApache service is running already, the shortcut doesn’t do anything.

You can tell a running Apache to stop by opening another console window and entering:

Page 223: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

7.2. USING APACHE WITH MICROSOFT WINDOWS 215

httpd -k shutdown

This should be preferred over pressing Control-C because this lets Apache end any current operations and clean upgracefully.

You can also tell Apache to restart. This forces it to reread the configuration file. Any operations in progress areallowed to complete without interruption. To restart Apache, use:

httpd -k restart

=⇒Note for people familiar with the Unix version of Apache: these commands provide a Windowsequivalent to kill -TERM pid and kill -USR1 pid. The command line option used,-k, was chosen as a reminder of the kill command used on Unix.

If the Apache console window closes immediately or unexpectedly after startup, open the Command Prompt from theStart Menu –> Programs. Change to the folder to which you installed Apache, type the command apache, and readthe error message. Then change to the logs folder, and review the error.log file for configuration mistakes. If youaccepted the defaults when you installed Apache, the commands would be:

c:cd "\Program Files\Apache Group\Apache2\bin"httpd

Then wait for Apache to stop, or press Control-C. Then enter the following:

cd ..\logsmore < error.log

When working with Apache it is important to know how it will find the configuration file. You can specify a configu-ration file on the command line in two ways:

• -f specifies an absolute or relative path to a particular configuration file:

httpd -f "c:\my server files\anotherconfig.conf"

or

httpd -f files\anotherconfig.conf

• -n specifies the installed Apache service whose configuration file is to be used:

httpd -n "MyServiceName"

In both of these cases, the proper SERVERROOT should be set in the configuration file.

If you don’t specify a configuration file with -f or -n, Apache will use the file name compiled into the server, suchas conf\httpd.conf. This built-in path is relative to the installation directory. You can verify the compiled filename from a value labelled as SERVER CONFIG FILE when invoking Apache with the -V switch, like this:

Page 224: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

216 CHAPTER 7. PLATFORM-SPECIFIC NOTES

httpd -V

Apache will then try to determine its SERVERROOT by trying the following, in this order:

1. A SERVERROOT directive via the -C command line switch.

2. The -d switch on the command line.

3. Current working directory.

4. A registry entry which was created if you did a binary installation.

5. The server root compiled into the server. This is /apache by default, you can verify it by using apache-V and looking for a value labelled as HTTPD ROOT.

During the installation, a version-specific registry key is created in the Windows registry. The location of this keydepends on the type of the installation. If you chose to install Apache for all users, the key is located under theHKEY LOCAL MACHINE hive, like this (the version numbers will of course vary between different versions of Apache:

HKEY LOCAL MACHINE\SOFTWARE\Apache Group\Apache\2.0.43

Correspondingly, if you chose to install Apache for the current user only, the key is located under theHKEY CURRENT USER hive, the contents of which are dependent of the user currently logged on:

HKEY CURRENT USER\SOFTWARE\Apache Group\Apache\2.0.43

This key is compiled into the server and can enable you to test new versions without affecting the current version. Ofcourse, you must take care not to install the new version in the same directory as another version.

If you did not do a binary install, Apache will in some scenarios complain about the missing registry key. This warningcan be ignored if the server was otherwise able to find its configuration file.

The value of this key is the SERVERROOT directory which contains the conf subdirectory. When Apache startsit reads the httpd.conf file from that directory. If this file contains a SERVERROOT directive which contains adifferent directory from the one obtained from the registry key above, Apache will forget the registry key and use thedirectory from the configuration file. If you copy the Apache directory or configuration files to a new location it isvital that you update the SERVERROOT directive in the httpd.conf file to reflect the new location.

Testing the Installation

After starting Apache (either in a console window or as a service) it will be listening on port 80 (unless you changedthe LISTEN directive in the configuration files or installed Apache only for the current user). To connect to the serverand access the default page, launch a browser and enter this URL:

http://localhost/

Apache should respond with a welcome page and a link to the Apache manual. If nothing happens or you get an error,look in the error.log file in the logs subdirectory. If your host is not connected to the net, or if you have seriousproblems with your DNS (Domain Name Service) configuration, you may have to use this URL:

http://127.0.0.1/

Page 225: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

7.2. USING APACHE WITH MICROSOFT WINDOWS 217

If you happen to be running Apache on an alternate port, you need to explicitly put that in the URL:

http://127.0.0.1:8080/

Once your basic installation is working, you should configure it properly by editing the files in the conf subdirectory.Again, if you change the configuration of the Windows NT service for Apache, first attempt to start it from thecommand line to make sure that the service starts with no errors.

Because Apache cannot share the same port with another TCP/IP application, you may need to stop, uninstall orreconfigure certain other services before running Apache. These conflicting services include other WWW servers andsome firewall implementations.

Page 226: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

218 CHAPTER 7. PLATFORM-SPECIFIC NOTES

7.3 Compiling Apache for Microsoft Windows

There are many important points before you begin compiling Apache. See Using Apache with Microsoft Windows (p.209) before you begin.

Requirements

Compiling Apache requires the following environment to be properly installed:

• Disk Space

Make sure you have at least 50 MB of free disk space available. After installation Apache requires approx-imately 10 MB of disk space, plus space for log and cache files, which can grow rapidly. The actual diskspace requirements will vary considerably based on your chosen configuration and any third-party modules orlibraries.

• Microsoft Visual C++ 5.0 or higher.

Apache can be built using the command line tools, or from within the Visual Studio IDE Workbench. Thecommand line build requires the environment to reflect the PATH, INCLUDE, LIB and other variables that canbe configured with the vcvars32 batch file:

"c:\Program Files\DevStudio\VC\Bin\vcvars32.bat"

• The Windows Platform SDK.

Visual C++ 5.0 builds require an updated Microsoft Windows Platform SDK to enable some Apache features.For command line builds, the Platform SDK environment is prepared by the setenv batch file:

"c:\Program Files\Platform SDK\setenv.bat"

The Platform SDK files distributed with Visual C++ 6.0 and later are sufficient, so users of later version mayskip this requirement.

=⇒Note that the Windows Platform SDK update is required to enable all supportedMOD ISAPI features. Without a recent update, Apache will issue warnings underMSVC++ 5.0 that some MOD ISAPI features will be disabled. Look for the update athttp://msdn.microsoft.com/downloads/sdks/platform/platform.asp.

• The awk utility (awk, gawk or similar).

To install Apache within the build system, several files are modified using the awk.exe utility. awk waschosen since it is a very small download (compared with Perl or WSH/VB) and accomplishes the task of gener-ating files. Brian Kernighan’s http://cm.bell-labs.com/cm/cs/who/bwk/ site has a compiled native Win32 binary,http://cm.bell-labs.com/cm/cs/who/bwk/awk95.exe which you must save with the name awk.exe rather thanawk95.exe.

=⇒Note that Developer Studio IDE will only find awk.exe from the Tools menu Options... Di-rectories tab (the Projects - VC++ Directories pane in Developer Studio 7.0) listing Executablefile paths. Add the path for awk.exe to this list, and your system PATH environment variable,as needed.

=⇒Also note that if you are using Cygwin (http://www.cygwin.com/) the awk utility is namedgawk.exe and that the file awk.exe is really a symlink to the gawk.exe file. The Win-dows command shell does not recognize symlinks, and because of that building InstallBin willfail. A workaround is to delete awk.exe from the cygwin installation and rename gawk.exeto awk.exe.

Page 227: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

7.3. COMPILING APACHE FOR MICROSOFT WINDOWS 219

• [Optional] OpenSSL libraries (for MOD SSL and ab.exe with ssl support)

Caution: there are significant restrictions and prohibitions on the use and distribution of strong cryp-tography and patented intellectual property throughout the world. OpenSSL includes strong cryptographycontrolled by both export regulations and domestic law, as well as intellectual property protected by patent, inthe United States and elsewhere. Neither the Apache Software Foundation nor the OpenSSL project can providelegal advise regarding possession, use, or distribution of the code provided by the OpenSSL project. Consultyour own legal counsel, you are responsible for your own actions.

OpenSSL must be installed into a srclib subdirectory named openssl, obtained fromhttp://www.openssl.org/source/, in order to compile MOD SSL or the abs project (ab.exe with SSLsupport.) To prepare OpenSSL for both release and debug builds of Apache, and disable the patentprotected features in OpenSSL, you might use the following build commands:

perl Configure VC-WIN32perl util\mkfiles.pl >MINFOperl util\mk1mf.pl dll no-asm no-mdc2 no-rc5 no-idea VC-WIN32>makefile.relperl util\mk1mf.pl dll debug no-asm no-mdc2 no-rc5 no-idea VC-WIN32>makefile.dbgperl util\mkdef.pl 32 libeay no-asm no-mdc2 no-rc5 no-idea>ms\libeay32.defperl util\mkdef.pl 32 ssleay no-asm no-mdc2 no-rc5 no-idea>ms\ssleay32.defnmake -f makefile.rel

nmake -f makefile.dbg

Note; you can use the scripts in the ms\ subdirectory, however, it’s rather tricky to force ms\do masm.bat,for example, to perform the patent encumberances as mentioned above. Patches to add the $* argument list tothe appropriate .bat lines in these scripts aren’t incorporated, thus far.

• [Optional] zlib sources (for MOD DEFLATE)

Zlib must be installed into a srclib subdirectory named zlib, however those sources need not be compiled.The build system will compile the compression sources directly into the MOD DEFLATE module. Zlib can beobtained from http://www.zlib.net/ – MOD DEFLATE is confirmed to build correctly with version 1.1.4. To use alater version of zlib, upgrade to Apache HTTP Server release 2.2 or later.

Command-Line Build

First, unpack the Apache distribution into an appropriate directory. Open a command-line prompt and cd to thatdirectory.

The master Apache makefile instructions are contained in the Makefile.win file. To compile Apache on WindowsNT, simply use one of the following commands to compiled the release or debug build, respectively:

nmake /f Makefile.win _apacher

nmake /f Makefile.win _apached

Either command will compile Apache. The latter will include debugging information in the resulting files, making iteasier to find bugs and track down problems.

Page 228: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

220 CHAPTER 7. PLATFORM-SPECIFIC NOTES

Developer Studio Workspace IDE Build

Apache can also be compiled using VC++’s Visual Studio development environment. To simplify this process, a VisualStudio workspace, Apache.dsw, is provided. This workspace exposes the entire list of working .dsp projects thatare required for the complete Apache binary release. It includes dependencies between the projects to assure that theyare built in the appropriate order.

Open the Apache.dsw workspace, and select InstallBin (Release or Debug build, as desired) as the ActiveProject. InstallBin causes all related project to be built, and then invokes Makefile.win to move the compiledexecutables and dlls. You may personalize the INSTDIR= choice by changing InstallBin’s Settings, General tab,Build command line entry. INSTDIR defaults to the /Apache2 directory. If you only want a test compile (withoutinstalling) you may build the BuildBin project instead.

The .dsp project files are distributed in Visual C++ 6.0 format. Visual C++ 5.0 (97) will recognize them. Visual C++7.0 (.net) must convert Apache.dsw plus the .dsp files into an Apache.sln plus .msproj files, be sure youreconvert the .msproj file if any of the source .dsp files change! This is really trivial, just open Apache.dsw inthe VC++ 7.0 IDE once again.

Visual C++ 7.0 (.net) users should also use the Build menu, Configuration Manager dialog to uncheck both the Debugand Release Solution modules abs, MOD SSL and MOD DEFLATE. These modules are built by invoking nmakeor the IDE directly with the BinBuild target to build those modules explicitly, only if the srclib directoriesopenssl and/or zlib exist.

Exported .mak files pose a greater hassle, but they are required for Visual C++ 5.0 users to build MOD SSL, abs (abwith SSL support) and/or MOD DEFLATE. VC++ 7.0 (.net) users also benefit, nmake builds are faster than binenvbuilds. Build the entire project from within the VC++ 5.0 or 6.0 IDE, then use the Project Menu Export for allmakefiles. You must build the projects first in order to create all dynamic auto-generated targets, so that dependenciescan be parsed correctly. Run the following command to fix the paths so they will build anywhere:

perl srclib\apr\build\fixwin32mak.pl

You must type this command from the top level directory of the httpd source tree. Every .mak and .dep project filewithin the current directory and below will be corrected, and the timestamps adjusted to reflect the .dsp.

If you contribute back a patch that revises project files, we must commit project files in Visual Studio 6.0 format.Changes should be simple, with minimal compilation and linkage flags that will be recognized by all VC++ 5.0through 7.0 environments.

Project Components

The Apache.dswworkspace and makefile.win nmake script both build the .dsp projects of the Apache serverin the following sequence:

1. srclib\apr\apr.dsp

2. srclib\apr\libapr.dsp

3. srclib\apr-util\uri\gen uri delims.dsp

4. srclib\apr-util\xml\expat\lib\xml.dsp

5. srclib\apr-util\aprutil.dsp

6. srclib\apr-util\libaprutil.dsp

7. srclib\pcre\dftables.dsp

Page 229: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

7.3. COMPILING APACHE FOR MICROSOFT WINDOWS 221

8. srclib\pcre\pcre.dsp

9. srclib\pcre\pcreposix.dsp

10. server\gen test char.dsp

11. libhttpd.dsp

12. Apache.dsp

In addition, the modules\ subdirectory tree contains project files for the majority of the modules.

The support\ directory contains project files for additional programs that are not part of the Apache runtime, butare used by the administrator to test Apache and maintain password and log files. Windows-specific support projectsare broken out in the support\win32\ directory.

1. support\ab.dsp

2. support\htdigest.dsp

3. support\htpasswd.dsp

4. support\logresolve.dsp

5. support\rotatelogs.dsp

6. support\win32\ApacheMonitor.dsp

7. support\win32\wintty.dsp

Once Apache has been compiled, it needs to be installed in its server root directory. The default is the \Apache2directory, of the same drive.

To build and install all the files into the desired folder dir automatically, use one of the following nmake commands:

nmake /f Makefile.win installr INSTDIR=dir

nmake /f Makefile.win installd INSTDIR=dir

The dir argument to INSTDIR gives the installation directory; it can be omitted if Apache is to be installed into\Apache2.

This will install the following:

• dir\bin\Apache.exe - Apache executable

• dir\bin\ApacheMonitor.exe - Service monitor taskbar icon utility

• dir\bin\htdigest.exe - Digest auth password file utility

• dir\bin\htdbm.exe - SDBM auth database password file utility

• dir\bin\htpasswd.exe - Basic auth password file utility

• dir\bin\logresolve.exe - Log file dns name lookup utility

• dir\bin\rotatelogs.exe - Log file cycling utility

• dir\bin\wintty.exe - Console window utility

• dir\bin\libapr.dll - Apache Portable Runtime shared library

• dir\bin\libaprutil.dll - Apache Utility Runtime shared library

Page 230: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

222 CHAPTER 7. PLATFORM-SPECIFIC NOTES

• dir\bin\libhttpd.dll - Apache Core library

• dir\modules\mod *.so - Loadable Apache modules

• dir\conf - Configuration directory

• dir\logs - Empty logging directory

• dir\include - C language header files

• dir\lib - Link library files

Warning about building Apache from the development tree

=⇒Note only the .dsp files are maintained between release builds. The .mak files are NOTregenerated, due to the tremendous waste of reviewer’s time. Therefore, you cannot rely on theNMAKE commands above to build revised .dsp project files unless you then export all .makfiles yourself from the project. This is unnecessary if you build from within the MicrosoftDeveloper Studio environment.

=⇒Also note it is very worthwhile to build the BuildBin target project (or the command lineapacher or apached target) prior to exporting the make files. Many files are autogener-

ated in the build process. Only a full build provides all of the dependent files required to buildproper dependency trees for correct build behavior.

In order to create distribution .mak files, always review the generated .mak (or .dep) dependen-cies for Platform SDK or other garbage includes. The DevStudio\SharedIDE\bin\ (VC5) orDevStudio\Common\MSDev98\bin\ (VC6) directory contains the sysincl.dat file, which must list allexceptions. Update this file (including both forward and backslashed paths, such as both sys/time.h andsys\time.h) to include such dependencies. Including local-install paths in a distributed .mak file will cause thebuild to fail completely. And don’t forget to run srclib/apr/build/fixwin32mak.pl in order to fix absolutepaths within the .mak files.

Page 231: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

7.4. USING APACHE WITH NOVELL NETWARE 223

7.4 Using Apache With Novell NetWare

This document explains how to install, configure and run Apache 2.0 under Novell NetWare 6.0 and above. If you findany bugs, or wish to contribute in other ways, please use our bug reporting page.5

The bug reporting page and dev-httpd mailing list are not provided to answer questions about configuration or runningApache. Before you submit a bug report or request, first consult this document, the Frequently Asked Questions(p. 140) page and the other relevant documentation topics. If you still have a question or problem, post it to thenovell.devsup.webserver6 newsgroup, where many Apache users are more than willing to answer new and obscurequestions about using Apache on NetWare.

Most of this document assumes that you are installing Apache from a binary distribution. If you want to compileApache yourself (possibly to help with development, or to track down bugs), see the section on Compiling Apache forNetWare below.

Requirements

Apache 2.0 is designed to run on NetWare 6.0 service pack 3 and above. If you are running a service pack less thanSP3, you must install the latest NetWare Libraries for C (LibC)7.

NetWare service packs are available here8.

Apache 2.0 for NetWare can also be run in a NetWare 5.1 environment as long as the latest service pack or the latestversion of the NetWare Libraries for C (LibC)9 has been installed . WARNING: Apache 2.0 for NetWare has not beentargeted for or tested in this environment.

Downloading Apache for NetWare

Information on the latest version of Apache can be found on the Apache web server at http://www.apache.org/. Thiswill list the current release, any more recent alpha or beta-test releases, together with details of mirror web andanonymous ftp sites. Binary builds of the latest releases of Apache 2.0 for NetWare can be downloaded from here10.

Installing Apache for NetWare

There is no Apache install program for NetWare currently. If you are building Apache 2.0 for NetWare from source,you will need to copy the files over to the server manually.

Follow these steps to install Apache on NetWare from the binary download (assuming you will install tosys:/apache2):

• Unzip the binary download file to the root of the SYS: volume (may be installed to any volume)

• Edit the httpd.conf file setting SERVERROOT and SERVERNAME along with any file path values to reflectyour correct server settings

• Add SYS:/APACHE2 to the search path, for example:

SEARCH ADD SYS:\APACHE2

5http://httpd.apache.org/bug report.html6news://developer-forums.novell.com/novell.devsup.webserver7http://developer.novell.com/ndk/libc.htm8http://support.novell.com/misc/patlst.htm#nw9http://developer.novell.com/ndk/libc.htm

10http://www.apache.org/dist/httpd/binaries/netware

Page 232: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

224 CHAPTER 7. PLATFORM-SPECIFIC NOTES

Follow these steps to install Apache on NetWare manually from your own build source (assuming you will install tosys:/apache2):

• Create a directory called Apache2 on a NetWare volume

• Copy APACHE2.NLM, APRLIB.NLM to SYS:/APACHE2

• Create a directory under SYS:/APACHE2 called BIN

• Copy HTDIGEST.NLM, HTPASSWD.NLM, HTDBM.NLM, LOGRES.NLM, ROTLOGS.NLM toSYS:/APACHE2/BIN

• Create a directory under SYS:/APACHE2 called CONF

• Copy the HTTPD-STD.CONF file to the SYS:/APACHE2/CONF directory and rename to HTTPD.CONF

• Copy the MIME.TYPES, CHARSET.CONV and MAGIC files to SYS:/APACHE2/CONF directory

• Copy all files and subdirectories in \HTTPD-2.0\DOCS\ICONS to SYS:/APACHE2/ICONS

• Copy all files and subdirectories in \HTTPD-2.0\DOCS\MANUAL to SYS:/APACHE2/MANUAL

• Copy all files and subdirectories in \HTTPD-2.0\DOCS\ERROR to SYS:/APACHE2/ERROR

• Copy all files and subdirectories in \HTTPD-2.0\DOCS\DOCROOT to SYS:/APACHE2/HTDOCS

• Create the directory SYS:/APACHE2/LOGS on the server

• Create the directory SYS:/APACHE2/CGI-BIN on the server

• Create the directory SYS:/APACHE2/MODULES and copy all nlm modules into the modules directory

• Edit the HTTPD.CONF file searching for all @@Value@@ markers and replacing them with the appropriatesetting

• Add SYS:/APACHE2 to the search path, for example:

SEARCH ADD SYS:\APACHE2

Apache may be installed to other volumes besides the default SYS volume.

During the build process, adding the keyword "install" to the makefile command line will automatically produce acomplete distribution package under the subdirectory DIST. Install Apache by simply copying the distribution thatwas produced by the makfiles to the root of a NetWare volume (see: Compiling Apache for NetWare below).

Running Apache for NetWare

To start Apache just type apache at the console. This will load apache in the OS address space. If you prefer to loadApache in a protected address space you may specify the address space with the load statement as follows:

load address space = apache2 apache2

This will load Apache into an address space called apache2. Running multiple instances of Apache concurrently onNetWare is possible by loading each instance into its own protected address space.

After starting Apache, it will be listening to port 80 (unless you changed the LISTEN directive in the configurationfiles). To connect to the server and access the default page, launch a browser and enter the server’s name or address.This should respond with a welcome page, and a link to the Apache manual. If nothing happens or you get an error,look in the error log file in the logs directory.

Once your basic installation is working, you should configure it properly by editing the files in the conf directory.

To unload Apache running in the OS address space just type the following at the console:

Page 233: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

7.4. USING APACHE WITH NOVELL NETWARE 225

unload apache2

or

apache2 shutdown

If apache is running in a protected address space specify the address space in the unload statement:

unload address space = apache2 apache2

When working with Apache it is important to know how it will find the configuration files. You can specify a config-uration file on the command line in two ways:

• -f specifies a path to a particular configuration file

apache2 -f "vol:/my server/conf/my.conf"

apache -f test/test.conf

In these cases, the proper SERVERROOT should be set in the configuration file.

If you don’t specify a configuration file name with -f, Apache will use the file name compiled into theserver, usually conf/httpd.conf. Invoking Apache with the -V switch will display this value labeled asSERVER CONFIG FILE. Apache will then determine its SERVERROOT by trying the following, in this order:

• A ServerRoot directive via a -C switch.

• The -d switch on the command line.

• Current working directory

• The server root compiled into the server.

The server root compiled into the server is usually sys:/apache2. invoking apache with the -V switch will displaythis value labeled as HTTPD ROOT.

Apache 2.0 for NetWare includes a set of command line directives that can be used to modify or display informationabout the running instance of the web server. These directives are only available while Apache is running. Each ofthese directives must be preceded by the keyword APACHE2.

RESTART Instructs Apache to terminate all running worker threads as they become idle, reread the configurationfile and restart each worker thread based on the new configuration.

VERSION Displays version information about the currently running instance of Apache.

MODULES Displays a list of loaded modules both built-in and external.

DIRECTIVES Displays a list of all available directives.

SETTINGS Enables or disables the thread status display on the console. When enabled, the state of each runningthreads is displayed on the Apache console screen.

SHUTDOWN Terminates the running instance of the Apache web server.

HELP Describes each of the runtime directives.

By default these directives are issued against the instance of Apache running in the OS address space. To issue adirective against a specific instance running in a protected address space, include the -p parameter along with the nameof the address space. For more information type "apache2 Help" on the command line.

Page 234: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

226 CHAPTER 7. PLATFORM-SPECIFIC NOTES

Configuring Apache for NetWare

Apache is configured by reading configuration files usually stored in the conf directory. These are the same as filesused to configure the Unix version, but there are a few different directives for Apache on NetWare. See the Apachedocumentation (p. ??) for all the available directives.

The main differences in Apache for NetWare are:

• Because Apache for NetWare is multithreaded, it does not use a separate process for each request, as Apachedoes on some Unix implementations. Instead there are only threads running: a parent thread, and multiple childor worker threads which handle the requests.

Therefore the "process"-management directives are different:

MAXREQUESTSPERCHILD - Like the Unix directive, this controls how many requests a worker thread willserve before exiting. The recommended default, MaxRequestsPerChild 0, causes the thread to continueservicing request indefinitely. It is recommended on NetWare, unless there is some specific reason, that thisdirective always remain set to 0.

STARTTHREADS - This directive tells the server how many threads it should start initially. The recommendeddefault is StartThreads 50.

MINSPARETHREADS - This directive instructs the server to spawn additional worker threads if the number ofidle threads ever falls below this value. The recommended default is MinSpareThreads 10.

MAXSPARETHREADS - This directive instructs the server to begin terminating worker threads if the number ofidle threads ever exceeds this value. The recommended default is MaxSpareThreads 100.

MAXTHREADS - This directive limits the total number of work threads to a maximum value. The recommendeddefault is ThreadsPerChild 250.

THREADSTACKSIZE - This directive tells the server what size of stack to use for the individual worker thread.The recommended default is ThreadStackSize 65536.

• The directives that accept filenames as arguments must use NetWare filenames instead of Unix names. However,because Apache uses Unix-style names internally, forward slashes must be used rather than backslashes. It isrecommended that all rooted file paths begin with a volume name. If omitted, Apache will assume the SYS:volume which may not be correct.

• Apache for NetWare has the ability to load modules at runtime, without recompiling the server. If Apache iscompiled normally, it will install a number of optional modules in the \Apache2\modules directory. Toactivate these, or other modules, the LOADMODULE directive must be used. For example, to active the statusmodule, use the following:

LoadModule status module modules/status.nlm

Information on creating loadable modules (p. 545) is also available.

Additional NetWare specific directives:

• CGIMAPEXTENSION - This directive maps a CGI file extension to a script interpreter.

• SECURELISTEN - Enables SSL encryption for a specified port.

• NWSSLTRUSTEDCERTS - Adds trusted certificates that are used to create secure connections to proxiedservers.

• NWSSLUPGRADEABLE - Allow a connection created on the specified address/port to be upgraded to an SSLconnection.

Page 235: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

7.4. USING APACHE WITH NOVELL NETWARE 227

Compiling Apache for NetWare

Compiling Apache requires MetroWerks CodeWarrior 6.x or higher. Once Apache has been built, it can be installedto the root of any NetWare volume. The default is the sys:/Apache2 directory.

Before running the server you must fill out the conf directory. Copy the file HTTPD-STD.CONF from the distributionconf directory and rename it to HTTPD.CONF. Edit the HTTPD.CONF file searching for all @@Value@@ markersand replacing them with the appropriate setting. Copy over the conf/magic and conf/mime.types files as well.Alternatively, a complete distribution can be built by including the keyword install when invoking the makefiles.

Requirements:

The following development tools are required to build Apache 2.0 for NetWare:

• Metrowerks CodeWarrior 6.0 or higher with the NetWare PDK 3.011 or higher.

• NetWare Libraries for C (LibC)12

• LDAP Libraries for C13

• ZLIB Compression Library source code14

• AWK utility (awk, gawk or similar). AWK can be downloaded fromhttp://developer.novell.com/ndk/apache.htm. The utility must be found in your windows path andmust be named awk.exe.

• To build using the makefiles, you will need GNU make version 3.78.1 (GMake) available athttp://developer.novell.com/ndk/apache.htm.

Building Apache using the NetWare makefiles:

• Set the environment variable NOVELLLIBC to the location of the NetWare Libraries for C SDK, for example:

Set NOVELLLIBC=c:\novell\ndk\libc

• Set the environment variable METROWERKS to the location where you installed the Metrowerks CodeWarriorcompiler, for example:

Set METROWERKS=C:\Program Files\Metrowerks\CodeWarrior

If you installed to the default location C:\Program Files\Metrowerks\CodeWarrior, you don’t needto set this.

• Set the environment variable LDAPSDK to the location where you installed the LDAP Libraries for C, forexample:

Set LDAPSDK=c:\Novell\NDK\cldapsdk\NetWare\libc

• Set the environment variable ZLIBSDK to the location where you installed the source code for the ZLib Library,for example:

11http://developer.novell.com/ndk/cwpdk.htm12http://developer.novell.com/ndk/libc.htm13http://developer.novell.com/ndk/cldap.htm14http://www.gzip.org/zlib/

Page 236: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

228 CHAPTER 7. PLATFORM-SPECIFIC NOTES

Set ZLIBSDK=D:\NOVELL\zlib

• Set the environment variable AP WORK to the full path of the \httpd-2.0 directory.

• Set the environment variable APR WORK to the full path of the \httpd-2.0\srclib\apr directory.

• Make sure that the path to the AWK utility and the GNU make utility (gmake.exe) have been included in thesystem’s PATH environment variable.

• Download the source code and unzip to an appropriate directory on your workstation.

• Change directory to \httpd-2.0\srclib\apr-util\uri and build GENURI.nlm by running "gmake-f nwgnumakefile".

• Copy the file GENURI.nlm to the SYS: volume of a NetWare server and run using the following command:

SYS:\genuri > sys:\uri delims.h

• Copy the file uri delims.h to the directory \httpd-2.0\srclib\apr-util\uri on the build ma-chine.

• Change directory to \httpd-2.0\srclib\apr and build APR by running "gmake -fnwgnumakefile"

• Change directory to \httpd-2.0\srclib\pcre and build DFTABLES.nlm by running "gmake -fnwgnumakefile"

• Change directory to \httpd-2.0\server and build GENCHARS.nlm by running "gmake -fnwgnumakefile"

• Copy the files GENCHARS.nlm and DFTABLES.nlm from their respective directories to the SYS: volume ofa NetWare server and run them using the following commands:

SYS:\genchars > sys:\test char.h

SYS:\dftables > sys:\chartables.c

• Copy the files test char.h and chartables.c to the directory \httpd-2.0\os\netware on thebuild machine.

• Change directory to \httpd-2.0 and build Apache by running "gmake -f nwgnumakefile". You cancreate a distribution directory by adding an install parameter to the command, for example:

gmake -f nwgnumakefile install

Additional make options

• gmake -f nwgnumakefileBuilds release versions of all of the binaries and copies them to a \releasedestination directory.

• gmake -f nwgnumakefile DEBUG=1Builds debug versions of all of the binaries and copies them to a\debug destination directory.

• gmake -f nwgnumakefile installCreates a complete Apache distribution with binaries, docs and ad-ditional support files in a \dist\Apache2 directory.

• gmake -f nwgnumakefile installdevSame as install but also creates a \lib and \include direc-tory in the destination directory and copies headers and import files.

• gmake -f nwgnumakefile cleanCleans all object files and binaries from the \release or \debugbuild areas depending on whether DEBUG has been defined.

• gmake -f nwgnumakefile clobber allSame as clean and also deletes the distribution directory if itexists.

Page 237: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

7.5. RUNNING A HIGH-PERFORMANCE WEB SERVER ON HPUX 229

7.5 Running a High-Performance Web Server on HPUX

Date: Wed, 05 Nov 1997 16:59:34 -0800From: Rick Jones <[email protected]>Reply-To: [email protected]: Network PerformanceSubject: HP-UX tuning tips

Here are some tuning tips for HP-UX to add to the tuning page.

For HP-UX 9.X: Upgrade to 10.20For HP-UX 10.[00—01—10]: Upgrade to 10.20

For HP-UX 10.20:

Install the latest cumulative ARPA Transport Patch. This will allow you to configure the size of the TCP connectionlookup hash table. The default is 256 buckets and must be set to a power of two. This is accomplished with adbagainst the *disc* image of the kernel. The variable name is tcp hash size. Notice that it’s critically importantthat you use "W" to write a 32 bit quantity, not "w" to write a 16 bit value when patching the disc image because thetcp hash size variable is a 32 bit quantity.

How to pick the value? Examine the output of ftp://ftp.cup.hp.com/dist/networking/tools/connhist and see how manytotal TCP connections exist on the system. You probably want that number divided by the hash table size to bereasonably small, say less than 10. Folks can look at HP’s SPECweb96 disclosures for some common settings. Thesecan be found at http://www.specbench.org/. If an HP-UX system was performing at 1000 SPECweb96 connectionsper second, the TIME WAIT time of 60 seconds would mean 60,000 TCP "connections" being tracked.

Folks can check their listen queue depths with ftp://ftp.cup.hp.com/dist/networking/misc/listenq.

If folks are running Apache on a PA-8000 based system, they should consider "chatr’ing" the Apache executable tohave a large page size. This would be "chatr +pi L <BINARY>". The GID of the running executable must haveMLOCK privileges. Setprivgrp(1m) should be consulted for assigning MLOCK. The change can be validated byrunning Glance and examining the memory regions of the server(s) to make sure that they show a non-trivial fractionof the text segment being locked.

If folks are running Apache on MP systems, they might consider writing a small program that uses mpctl() to bindprocesses to processors. A simple pid % numcpu algorithm is probably sufficient. This might even go into thesource code.

If folks are concerned about the number of FIN WAIT 2 connections, they can use nettune to shrink the value oftcp keepstart. However, they should be careful there - certainly do not make it less than oh two to four minutes.If tcp hash size has been set well, it is probably OK to let the FIN WAIT 2’s take longer to timeout (perhapseven the default two hours) - they will not on average have a big impact on performance.

There are other things that could go into the code base, but that might be left for another email. Feel free to drop me amessage if you or others are interested.

sincerely,

rick jones

http://www.cup.hp.com/netperf/NetperfPage.html

Page 238: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

230 CHAPTER 7. PLATFORM-SPECIFIC NOTES

7.6 The Apache EBCDIC Port

! Warning: This document has not been updated to take into account changes made in the 2.0version of the Apache HTTP Server. Some of the information may still be relevant, but pleaseuse it with care.

Overview of the Apache EBCDIC Port

Version 1.3 of the Apache HTTP Server is the first version which includes a port to a (non-ASCII) mainframe machinewhich uses the EBCDIC character set as its native codeset.

(It is the SIEMENS family of mainframes running the BS2000/OSD operating system15. This mainframe OS nowadaysfeatures a SVR4-derived POSIX subsystem).

The port was started initially to

• prove the feasibility of porting the Apache HTTP server16 to this platform

• find a "worthy and capable" successor for the venerable CERN-3.017 daemon (which was ported a couple ofyears ago), and to

• prove that Apache’s preforking process model can on this platform easily outperform the accept-fork-servemodel used by CERN by a factor of 5 or more.

This document serves as a rationale to describe some of the design decisions of the port to this machine.

Design Goals

One objective of the EBCDIC port was to maintain enough backwards compatibility with the (EBCDIC) CERN serverto make the transition to the new server attractive and easy. This required the addition of a configurable method todefine whether a HTML document was stored in ASCII (the only format accepted by the old server) or in EBCDIC(the native document format in the POSIX subsystem, and therefore the only realistic format in which the other POSIXtools like grep or sed could operate on the documents). The current solution to this is a "pseudo-MIME-format"which is intercepted and interpreted by the Apache server (see below). Future versions might solve the problem bydefining an "ebcdic-handler" for all documents which must be converted.

Technical Solution

Since all Apache input and output is based upon the BUFF data type and its methods, the easiest solution was to addthe conversion to the BUFF handling routines. The conversion must be settable at any time, so a BUFF flag was addedwhich defines whether a BUFF object has currently enabled conversion or not. This flag is modified at several pointsin the HTTP protocol:

• set before a request is received (because the request and the request header lines are always in ASCII format)

• set/unset when the request body is received - depending on the content type of the request body (because therequest body may contain ASCII text or a binary file)

• set before a reply header is sent (because the response header lines are always in ASCII format)

• set/unset when the response body is sent - depending on the content type of the response body (because theresponse body may contain text or a binary file)

15http://www.siemens.de/servers/bs2osd/osdbc us.htm16http://dev.apache.org/17http://www.w3.org/Daemon/

Page 239: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

7.6. THE APACHE EBCDIC PORT 231

Porting Notes

1. The relevant changes in the source are #ifdef’ed into two categories:

#ifdef CHARSET EBCDIC Code which is needed for any EBCDIC based machine. This includes charactertranslations, differences in contiguity of the two character sets, flags which indicate which part of theHTTP protocol has to be converted and which part doesn’t etc.

#ifdef OSD POSIX Code which is needed for the SIEMENS BS2000/OSD mainframe platform only.This deals with include file differences and socket implementation topics which are only required on theBS2000/OSD platform.

2. The possibility to translate between ASCII and EBCDIC at the socket level (on BS2000 POSIX, there is a socketoption which supports this) was intentionally not chosen, because the byte stream at the HTTP protocol levelconsists of a mixture of protocol related strings and non-protocol related raw file data. HTTP protocol stringsare always encoded in ASCII (the GET request, any Header: lines, the chunking information etc.) whereas thefile transfer parts (i.e., GIF images, CGI output etc.) should usually be just "passed through" by the server. Thisseparation between "protocol string" and "raw data" is reflected in the server code by functions like bgets()or rvputs() for strings, and functions like bwrite() for binary data. A global translation of everythingwould therefore be inadequate.

(In the case of text files of course, provisions must be made so that EBCDIC documents are always served inASCII)

3. This port therefore features a built-in protocol level conversion for the server-internal strings (which the compilertranslated to EBCDIC strings) and thus for all server-generated documents. The hard coded ASCII escapes \012and \015 which are ubiquitous in the server code are an exception: they are already the binary encoding of theASCII \n and \r and must not be converted to ASCII a second time. This exception is only relevant for server-generated strings; and external EBCDIC documents are not expected to contain ASCII newline characters.

4. By examining the call hierarchy for the BUFF management routines, I added an "ebcdic/ascii conversion layer"which would be crossed on every puts/write/get/gets, and a conversion flag which allowed enabling/disablingthe conversions on-the-fly. Usually, a document crosses this layer twice from its origin source (a file or CGIoutput) to its destination (the requesting client): file -> Apache, and Apache -> client.

The server can now read the header lines of a CGI-script output in EBCDIC format, and then find out thatthe remainder of the script’s output is in ASCII (like in the case of the output of a WWW Counter program:the document body contains a GIF image). All header processing is done in the native EBCDIC format; theserver then determines, based on the type of document being served, whether the document body (except for thechunking information, of course) is in ASCII already or must be converted from EBCDIC.

5. For Text documents (MIME types text/plain, text/html etc.), an implicit translation to ASCII can be used, or (ifthe users prefer to store some documents in raw ASCII form for faster serving, or because the files reside on aNFS-mounted directory tree) can be served without conversion.

Example:to serve files with the suffix .ahtml as a raw ASCII text/html document without implicit conversion (andsuffix .ascii as ASCII text/plain), use the directives:

AddType text/x-ascii-html .ahtml

AddType text/x-ascii-plain .ascii

Similarly, any text/foo MIME type can be served as "raw ASCII" by configuring a MIME type"text/x-ascii-foo" for it using AddType.

6. Non-text documents are always served "binary" without conversion. This seems to be the most sensible choicefor, .e.g., GIF/ZIP/AU file types. This of course requires the user to copy them to the mainframe host using the"rcp -b" binary switch.

Page 240: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

232 CHAPTER 7. PLATFORM-SPECIFIC NOTES

7. Server parsed files are always assumed to be in native (i.e., EBCDIC) format as used on the machine, and areconverted after processing.

8. For CGI output, the CGI script determines whether a conversion is needed or not: by setting the appropriateContent-Type, text files can be converted, or GIF output can be passed through unmodified. An example for thelatter case is the wwwcount program which we ported as well.

Document Storage Notes

Binary Files

All files with a Content-Type: which does not start with text/ are regarded as binary files by the server and arenot subject to any conversion. Examples for binary files are GIF images, gzip-compressed files and the like.

When exchanging binary files between the mainframe host and a Unix machine or Windows PC, be sure to use theftp "binary" (TYPE I) command, or use the rcp -b command from the mainframe host (the -b switch is notsupported in unix rcp’s).

Text Documents

The default assumption of the server is that Text Files (i.e., all files whose Content-Type: starts with text/) arestored in the native character set of the host, EBCDIC.

Server Side Included Documents

SSI documents must currently be stored in EBCDIC only. No provision is made to convert it from ASCII beforeprocessing.

Apache Modules’ Status

Module Status NotesCORE +MOD ACCESS +MOD ACTIONS +MOD ALIAS +MOD ASIS +MOD AUTH +MOD AUTH ANON +MOD AUTH DBM ? with own libdb.aMOD AUTOINDEX +MOD CERN META ?MOD CGI +mod digest +MOD DIR +MOD SO - no shared libsMOD ENV +MOD EXAMPLE - (test bed only)MOD EXPIRES +MOD HEADERS +MOD IMAP +

Page 241: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

7.6. THE APACHE EBCDIC PORT 233

MOD INCLUDE +MOD INFO +mod log agent +MOD LOG CONFIG +mod log referer +MOD MIME +MOD MIME MAGIC ? not ported yetMOD NEGOTIATION +MOD PROXY +MOD REWRITE + untestedMOD SETENVIF +MOD SPELING +MOD STATUS +MOD UNIQUE ID +MOD USERDIR +MOD USERTRACK ? untested

Third Party Modules’ Status

Module Status Notesmod jserva

ahttp://java.apache.org/

- JAVA still being ported.

mod php3a

ahttp://www.php.net/

+ mod php3 runs fine, with LDAP and GDand FreeType libraries.

mod puta

ahttp://hpwww.ec-lyon.fr/˜vincent/apache/mod put.html

? untested

mod sessiona

aftp://hachiman.vidya.com/pub/apache/

- untested

Page 242: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

234 CHAPTER 7. PLATFORM-SPECIFIC NOTES

Page 243: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

Chapter 8

Apache HTTP Server and SupportingPrograms

235

Page 244: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

236 CHAPTER 8. APACHE HTTP SERVER AND SUPPORTING PROGRAMS

8.1 Server and Supporting Programs

This page documents all the executable programs included with the Apache HTTP Server.

Index

httpd Apache hypertext transfer protocol server

apachectl Apache HTTP server control interface

ab Apache HTTP server benchmarking tool

apxs APache eXtenSion tool

configure Configure the source tree

dbmmanage Create and update user authentication files in DBM format for basic authentication

htdigest Create and update user authentication files for digest authentication

htdbm Manipulate DBM password databases.

htpasswd Create and update user authentication files for basic authentication

logresolve Resolve hostnames for IP-addresses in Apache logfiles

rotatelogs Rotate Apache logs without having to kill the server

suexec Switch User For Exec

Other Programs (p. 269) Support tools with no own manual page.

Page 245: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

8.2. HTTPD - APACHE HYPERTEXT TRANSFER PROTOCOL SERVER 237

8.2 httpd - Apache Hypertext Transfer Protocol Server

httpd is the Apache HyperText Transfer Protocol (HTTP) server program. It is designed to be run as a standalonedaemon process. When used like this it will create a pool of child processes or threads to handle requests.

In general, httpd should not be invoked directly, but rather should be invoked via apachectl on Unix-basedsystems or as a service on Windows NT, 2000 and XP (p. 209) and as a console application on Windows 9x and ME(p. 209) .

See also

• Starting Apache (p. 14)

• Stopping Apache (p. 16)

• Configuration Files (p. 19)

• Platform-specific Documentation (p. 208)

• apachectl

Synopsis

httpd [ -d serverroot ] [ -f config ] [ -C directive ] [ -c directive ] [ -Dparameter ] [ -e level ] [ -E file ] [ -k start|restart|graceful|stop ] [ -Rdirectory ] [ -h ] [ -l ] [ -L ] [ -S ] [ -t ] [ -v ] [ -V ] [ -X ]

On Windows systems (p. 209) , the following additional arguments are available:

httpd [ -k install|config|uninstall ] [ -n name ] [ -w ]

Options

-d serverroot Set the initial value for the SERVERROOT directive to serverroot. This can be overridden by theServerRoot directive in the configuration file. The default is /usr/local/apache2.

-f config Uses the directives in the file config on startup. If config does not begin with a /, then it is taken to be apath relative to the SERVERROOT. The default is conf/httpd.conf.

-k start|restart|graceful|stop Signals httpd to start, restart, or stop. See Stopping Apache (p. 16)for more information.

-C directive Process the configuration directive before reading config files.

-c directive Process the configuration directive after reading config files.

-D parameter Sets a configuration parameter which can be used with <IFDEFINE> sections in the configurationfiles to conditionally skip or process commands at server startup and restart.

-e level Sets the LOGLEVEL to level during server startup. This is useful for temporarily increasing the verbosityof the error messages to find problems during startup.

-E file Send error messages during server startup to file.

-R directory When the server is compiled using the SHARED CORE rule, this specifies the directory for theshared object files.

-h Output a short summary of available command line options.

Page 246: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

238 CHAPTER 8. APACHE HTTP SERVER AND SUPPORTING PROGRAMS

-l Output a list of modules compiled into the server. This will not list dynamically loaded modules included usingthe LOADMODULE directive.

-L Output a list of directives together with expected arguments and places where the directive is valid.

-S Show the settings as parsed from the config file (currently only shows the virtualhost settings).

-t Run syntax tests for configuration files only. The program immediately exits after these syntax parsing tests witheither a return code of 0 (Syntax OK) or return code not equal to 0 (Syntax Error). If -D DUMP VHOSTS isalso set, details of the virtual host configuration will be printed.

-v Print the version of httpd, and then exit.

-V Print the version and build parameters of httpd, and then exit.

-X Run httpd in debug mode. Only one worker will be started and the server will not detach from the console.

The following arguments are available only on the Windows platform (p. 209) :

-k install|config|uninstall Install Apache as a Windows NT service; change startup options for theApache service; and uninstall the Apache service.

-n name The name of the Apache service to signal.

-w Keep the console window open on error so that the error message can be read.

Page 247: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

8.3. AB - APACHE HTTP SERVER BENCHMARKING TOOL 239

8.3 ab - Apache HTTP server benchmarking tool

ab is a tool for benchmarking your Apache Hypertext Transfer Protocol (HTTP) server. It is designed to give youan impression of how your current Apache installation performs. This especially shows you how many requests persecond your Apache installation is capable of serving.

See also

• httpd

Synopsis

ab [ -A auth-username:password ] [ -c concurrency ] [ -C cookie-name=value ] [-d ] [ -e csv-file ] [ -g gnuplot-file ] [ -h ] [ -H custom-header ] [ -i ] [-k ] [ -n requests ] [ -p POST-file ] [ -P proxy-auth-username:password ] [ -q] [ -s ] [ -S ] [ -t timelimit ] [ -T content-type ] [ -v verbosity] [ -V ] [-w ] [ -x <table>-attributes ] [ -X proxy[:port] ] [ -y <tr>-attributes ] [-z <td>-attributes ] [http://]hostname[:port]/path

Options

-A auth-username:password Supply BASIC Authentication credentials to the server. The username andpassword are separated by a single : and sent on the wire base64 encoded. The string is sent regardless ofwhether the server needs it (i.e., has sent an 401 authentication needed).

-c concurrency Number of multiple requests to perform at a time. Default is one request at a time.

-C cookie-name=value Add a Cookie: line to the request. The argument is typically in the form of aname=value pair. This field is repeatable.

-d Do not display the "percentage served within XX [ms] table". (legacy support).

-e csv-file Write a Comma separated value (CSV) file which contains for each percentage (from 1% to 100%)the time (in milliseconds) it took to serve that percentage of the requests. This is usually more useful than the’gnuplot’ file; as the results are already ’binned’.

-g gnuplot-file Write all measured values out as a ’gnuplot’ or TSV (Tab separate values) file. This file caneasily be imported into packages like Gnuplot, IDL, Mathematica, Igor or even Excel. The labels are on the firstline of the file.

-h Display usage information.

-H custom-header Append extra headers to the request. The argument is typically in the form of a valid headerline, containing a colon-separated field-value pair (i.e., "Accept-Encoding: zip/zop;8bit").

-i Do HEAD requests instead of GET.

-k Enable the HTTP KeepAlive feature, i.e., perform multiple requests within one HTTP session. Default is noKeepAlive.

-n requests Number of requests to perform for the benchmarking session. The default is to just perform a singlerequest which usually leads to non-representative benchmarking results.

-p POST-file File containing data to POST.

Page 248: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

240 CHAPTER 8. APACHE HTTP SERVER AND SUPPORTING PROGRAMS

-P proxy-auth-username:password Supply BASIC Authentication credentials to a proxy en-route. Theusername and password are separated by a single : and sent on the wire base64 encoded. The string is sentregardless of whether the proxy needs it (i.e., has sent an 407 proxy authentication needed).

-q When processing more than 150 requests, ab outputs a progress count on stderr every 10% or 100 requests orso. The -q flag will suppress these messages.

-s When compiled in (ab -h will show you) use the SSL protected https rather than the http protocol. Thisfeature is experimental and very rudimentary. You probably do not want to use it.

-S Do not display the median and standard deviation values, nor display the warning/error messages when the averageand median are more than one or two times the standard deviation apart. And default to the min/avg/max values.(legacy support).

-t timelimit Maximum number of seconds to spend for benchmarking. This implies a -n 50000 internally.Use this to benchmark the server within a fixed total amount of time. Per default there is no timelimit.

-T content-type Content-type header to use for POST data.

-v verbosity Set verbosity level - 4 and above prints information on headers, 3 and above prints response codes(404, 200, etc.), 2 and above prints warnings and info.

-V Display version number and exit.

-w Print out results in HTML tables. Default table is two columns wide, with a white background.

-x <table>-attributes String to use as attributes for <table>. Attributes are inserted <table here>.

-X proxy[:port] Use a proxy server for the requests.

-y <tr>-attributes String to use as attributes for <tr>.

-z <td>-attributes String to use as attributes for <td>.

Bugs

There are various statically declared buffers of fixed length. Combined with the lazy parsing of the command linearguments, the response headers from the server and other external inputs, this might bite you.

It does not implement HTTP/1.x fully; only accepts some ’expected’ forms of responses. The rather heavy use ofstrstr(3) shows up top in profile, which might indicate a performance problem; i.e., you would measure the abperformance rather than the server’s.

Page 249: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

8.4. APACHECTL - APACHE HTTP SERVER CONTROL INTERFACE 241

8.4 apachectl - Apache HTTP Server Control Interface

apachectl is a front end to the Apache HyperText Transfer Protocol (HTTP) server. It is designed to help theadministrator control the functioning of the Apache httpd daemon.

The apachectl script can operate in two modes. First, it can act as a simple front-end to the httpd commandthat simply sets any necessary environment variables and then invokes httpd, passing through any command linearguments. Second, apachectl can act as a SysV init script, taking simple one-word arguments like start,restart, and stop, and translating them into appropriate signals to httpd.

If your Apache installation uses non-standard paths, you will need to edit the apachectl script to set the appropriatepaths to the httpd binary. You can also specify any necessary httpd command line arguments. See the commentsin the script for details.

The apachectl script returns a 0 exit value on success, and >0 if an error occurs. For more details, view thecomments in the script.

See also

• Starting Apache (p. 14)

• Stopping Apache (p. 16)

• Configuration Files (p. 19)

• Platform Docs (p. 208)

• httpd

Synopsis

When acting in pass-through mode, apachectl can take all the arguments available for the httpd binary.

apachectl [ httpd-argument ]

When acting in SysV init mode, apachectl takes simple, one-word commands, defined below.

apachectl command

Options

Only the SysV init-style options are defined here. Other arguments are defined on the httpd manual page.

start Start the Apache httpd daemon. Gives an error if it is already running. This is equivalent to apachectl-k start.

stop Stops the Apache httpd daemon. This is equivalent to apachectl -k stop.

restart Restarts the Apache httpd daemon. If the daemon is not running, it is started. This command automat-ically checks the configuration files as in configtest before initiating the restart to make sure the daemondoesn’t die. This is equivalent to apachectl -k restart.

fullstatus Displays a full status report from MOD STATUS. For this to work, you need to have MOD STATUSenabled on your server and a text-based browser such as lynx available on your system. The URL used toaccess the status report can be set by editing the STATUSURL variable in the script.

status Displays a brief status report. Similar to the fullstatus option, except that the list of requests currentlybeing served is omitted.

Page 250: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

242 CHAPTER 8. APACHE HTTP SERVER AND SUPPORTING PROGRAMS

graceful Gracefully restarts the Apache httpd daemon. If the daemon is not running, it is started. This differsfrom a normal restart in that currently open connections are not aborted. A side effect is that old log files willnot be closed immediately. This means that if used in a log rotation script, a substantial delay may be necessaryto ensure that the old log files are closed before processing them. This command automatically checks theconfiguration files as in configtest before initiating the restart to make sure Apache doesn’t die. This isequivalent to apachectl -k graceful.

configtest Run a configuration file syntax test. It parses the configuration files and either reports Syntax Okor detailed information about the particular syntax error. This is equivalent to apachectl -t.

The following additional option is available, but deprecated.

startssl This is equivalent to apachectl -k start -DSSL. We recommend that you use that commandexplicitly, or you adjust your httpd.conf to remove the <IFDEFINE> section so that SSL will always beavailable.

Page 251: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

8.5. APXS - APACHE EXTENSION TOOL 243

8.5 apxs - APache eXtenSion tool

apxs is a tool for building and installing extension modules for the Apache HyperText Transfer Protocol (HTTP)server. This is achieved by building a dynamic shared object (DSO) from one or more source or object files which thencan be loaded into the Apache server under runtime via the LOADMODULE directive from MOD SO.

So to use this extension mechanism your platform has to support the DSO feature and your Apache httpd binary hasto be built with the MOD SO module. The apxs tool automatically complains if this is not the case. You can checkthis yourself by manually running the command

$ httpd -l

The module MOD SO should be part of the displayed list. If these requirements are fulfilled you can easily extend yourApache server’s functionality by installing your own modules with the DSO mechanism by the help of this apxs tool:

$ apxs -i -a -c mod foo.cgcc -fpic -DSHARED MODULE -I/path/to/apache/include -c mod foo.cld -Bshareable -o mod foo.so mod foo.ocp mod foo.so /path/to/apache/modules/mod foo.sochmod 755 /path/to/apache/modules/mod foo.so[activating module ‘foo’ in /path/to/apache/etc/httpd.conf]$ apachectl restart/path/to/apache/sbin/apachectl restart: httpd not running, trying tostart[Tue Mar 31 11:27:55 1998] [debug] mod so.c(303): loaded modulefoo module/path/to/apache/sbin/apachectl restart: httpd started

$

The arguments files can be any C source file (.c), a object file (.o) or even a library archive (.a). The apxs toolautomatically recognizes these extensions and automatically used the C source files for compilation while just usingthe object and archive files for the linking phase. But when using such pre-compiled objects make sure they arecompiled for position independent code (PIC) to be able to use them for a dynamically loaded shared object. Forinstance with GCC you always just have to use -fpic. For other C compilers consult its manual page or at watch forthe flags apxs uses to compile the object files.

For more details about DSO support in Apache read the documentation of MOD SO or perhaps even read thesrc/modules/standard/mod so.c source file.

See also

• apachectl

• httpd

Synopsis

apxs -g [ -S name=value ] -n modname

apxs -q [ -S name=value ] query ...

apxs -c [ -S name=value ] [ -o dsofile ] [ -I incdir ] [ -D name=value ] [ -Llibdir ] [ -l libname ] [ -Wc,compiler-flags ] [ -Wl,linker-flags ] files ...

apxs -i [ -S name=value ] [ -n modname ] [ -a ] [ -A ] dso-file ...

apxs -e [ -S name=value ] [ -n modname ] [ -a ] [ -A ] dso-file ...

Page 252: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

244 CHAPTER 8. APACHE HTTP SERVER AND SUPPORTING PROGRAMS

Options

Common Options

-n modname This explicitly sets the module name for the -i (install) and -g (template generation) option. Usethis to explicitly specify the module name. For option -g this is required, for option -i the apxs tool tries todetermine the name from the source or (as a fallback) at least by guessing it from the filename.

Query Options

-q Performs a query for apxs’s knowledge about certain settings. The query parameters can be one or moreof the following strings: CC, CFLAGS, CFLAGS SHLIB, INCLUDEDIR, LD SHLIB, LDFLAGS SHLIB,LIBEXECDIR, LIBS SHLIB, SBINDIR, SYSCONFDIR, TARGET.

Use this for manually determining settings. For instance use

INC=-I‘apxs -q INCLUDEDIR‘

inside your own Makefiles if you need manual access to Apache’s C header files.

Configuration Options

-S name=value This option changes the apxs settings described above.

Template Generation Options

-g This generates a subdirectory name (see option -n) and there two files: A sample module source file namedmod name.c which can be used as a template for creating your own modules or as a quick start for playingwith the apxs mechanism. And a corresponding Makefile for even easier build and installing of this module.

DSO Compilation Options

-c This indicates the compilation operation. It first compiles the C source files (.c) of files into corresponding objectfiles (.o) and then builds a dynamically shared object in dsofile by linking these object files plus the remainingobject files (.o and .a) of files. If no -o option is specified the output file is guessed from the first filename infiles and thus usually defaults to mod name.so.

-o dsofile Explicitly specifies the filename of the created dynamically shared object. If not specified and thename cannot be guessed from the files list, the fallback name mod unknown.so is used.

-D name=value This option is directly passed through to the compilation command(s). Use this to add your owndefines to the build process.

-I incdir This option is directly passed through to the compilation command(s). Use this to add your own includedirectories to search to the build process.

-L libdir This option is directly passed through to the linker command. Use this to add your own library directo-ries to search to the build process.

-l libname This option is directly passed through to the linker command. Use this to add your own libraries tosearch to the build process.

Page 253: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

8.5. APXS - APACHE EXTENSION TOOL 245

-Wc,compiler-flags This option passes compiler-flags as additional flags to the compiler command. Use thisto add local compiler-specific options.

-Wl,linker-flags This option passes linker-flags as additional flags to the linker command. Use this to addlocal linker-specific options.

DSO Installation and Configuration Options

-i This indicates the installation operation and installs one or more dynamically shared objects into the server’smodules directory.

-a This activates the module by automatically adding a corresponding LOADMODULE line to Apache’shttpd.conf configuration file, or by enabling it if it already exists.

-A Same as option -a but the created LOADMODULE directive is prefixed with a hash sign (#), i.e., the module isjust prepared for later activation but initially disabled.

-e This indicates the editing operation, which can be used with the -a and -A options similarly to the -i operationto edit Apache’s httpd.conf configuration file without attempting to install the module.

Examples

Assume you have an Apache module named mod foo.c available which should extend Apache’s server functionality.To accomplish this you first have to compile the C source into a shared object suitable for loading into the Apacheserver under runtime via the following command:

$ apxs -c mod foo.cgcc -fpic -DSHARED MODULE -I/path/to/apache/include -c mod foo.cld -Bshareable -o mod foo.so mod foo.o

$

Then you have to update the Apache configuration by making sure a LOADMODULE directive is present to load thisshared object. To simplify this step apxs provides an automatic way to install the shared object in its "modules"directory and updating the httpd.conf file accordingly. This can be achieved by running:

$ apxs -i -a mod foo.ccp mod foo.so /path/to/apache/modules/mod foo.sochmod 755 /path/to/apache/modules/mod foo.so[activating module ‘foo’ in /path/to/apache/etc/httpd.conf]

$

This way a line named

LoadModule foo module modules/mod foo.so

is added to the configuration file if still not present. If you want to have this disabled per default use the -A option, i.e.

$ apxs -i -A mod foo.c

For a quick test of the apxs mechanism you can create a sample Apache module template plus a corresponding Makefilevia:

Page 254: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

246 CHAPTER 8. APACHE HTTP SERVER AND SUPPORTING PROGRAMS

$ apxs -g -n fooCreating [DIR] fooCreating [FILE] foo/MakefileCreating [FILE] foo/mod foo.c

$

Then you can immediately compile this sample module into a shared object and load it into the Apache server:

$ cd foo$ make all reloadapxs -c mod foo.cgcc -fpic -DSHARED MODULE -I/path/to/apache/include -c mod foo.cld -Bshareable -o mod foo.so mod foo.oapxs -i -a -n "foo" mod foo.socp mod foo.so /path/to/apache/modules/mod foo.sochmod 755 /path/to/apache/modules/mod foo.so[activating module ‘foo’ in /path/to/apache/etc/httpd.conf]apachectl restart/path/to/apache/sbin/apachectl restart: httpd not running, trying tostart[Tue Mar 31 11:27:55 1998] [debug] mod so.c(303): loaded modulefoo module/path/to/apache/sbin/apachectl restart: httpd started

$

You can even use apxs to compile complex modules outside the Apache source tree, like PHP3:

$ cd php3$ ./configure --with-shared-apache=../apache-1.3$ apxs -c -o libphp3.so mod php3.c libmodphp3-so.agcc -fpic -DSHARED MODULE -I/tmp/apache/include -c mod php3.cld -Bshareable -o libphp3.so mod php3.o libmodphp3-so.a

$

because apxs automatically recognized C source files and object files. Only C source files are compiled whileremaining object files are used for the linking phase.

Page 255: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

8.6. CONFIGURE - CONFIGURE THE SOURCE TREE 247

8.6 configure - Configure the source tree

The configure script configures the source tree for compiling and installing the Apache HTTP Server on yourparticular platform. Various options allow the compilation of a server corresponding to your personal requirements.

This script, included in the root directory of the source distribution, is for compilation on Unix and Unix-like systemsonly. For other platforms, see the platform (p. 208) documentation.

See also

• Compiling and Installing (p. 10)

Synopsis

You should call the configure script from within the root directory of the distribution.

./configure [OPTION]... [VAR=VALUE]...

To assign environment variables (e.g. CC, CFLAGS ...), specify them as VAR=VALUE. See below for descriptions ofsome of the useful variables.

Options

• Configuration options

• Installation directories

• System types

• Optional features

• Options for support programs

Configuration options

The following options influence the behavior of configure itself.

-C

--config-cache This is an alias for --cache-file=config.cache

--cache-file=FILE The test results will be cached in file FILE. This option is disabled by default.

-h

--help [short|recursive] Output the help and exit. With the argument short only options specific to thispackage will displayed. The argument recursive displays the short help of all the included packages.

-n

--no-create The configure script is run normally but does not create output files. This is useful to check thetest results before generating makefiles for compilation.

-q

--quiet Do not print checking ... messages during the configure process.

--srcdir=DIR Defines directory DIR to be the source file directory. Default is the directory, where configure islocated, or the parent directory ...

Page 256: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

248 CHAPTER 8. APACHE HTTP SERVER AND SUPPORTING PROGRAMS

--silent Same as --quiet

-V

–version Display copyright information and exit.

Installation directories

These options define the installation directory. The installation tree depends on the selected layout.

--prefix=PREFIX Install architecture-independent files in PREFIX. By default the installation directory is set to/usr/local/apache2.

--exec-prefix=EPREFIX Install architecture-dependent files in EPREFIX. By default the installation directoryis set to the PREFIX directory.

By default, make install will install all the files in /usr/local/apache2/bin,/usr/local/apache2/lib etc. You can specify an installation prefix other than /usr/local/apache2using --prefix, for instance --prefix=$HOME.

Define a directory layout

--enable-layout=LAYOUT Configure the source code and build scripts to assume an installation tree based onthe layout LAYOUT. This allows you to separately specify the locations for each type of file within the ApacheHTTP Server installation. The config.layout file contains several example configurations, and you canalso create your own custom configuration following the examples. The different layouts in this file are groupedinto <Layout FOO>...</Layout> sections and referred to by name as in FOO. The default layout isApache.

Fine tuning of the installation directories

For better control of the installation directories, use the options below. Please note that the directory defaults are setby autoconf and be overwritten by the corresponding layout setting.

--bindir=DIR Install user executables in DIR. The user executables are supporting programs like htpasswd,dbmmanage, etc. which are useful for site administrators. By default DIR is set to EPREFIX/bin.

--datadir=DIR Install read-only architecture-independent data in DIR. By default datadir is set toPREFIX/share. This option is offered by autoconf and currently unused.

--includedir=DIR Install C header files in DIR. By default includedir is set to EPREFIX/include.

--infodir=DIR Install info documentation in DIR. By default infodir is set to PREFIX/info. This optionis currently unused.

--libdir=DIR Install object code libraries in DIR. By default libdir is set to EPREFIX/lib.

--libexecdir=DIR Install the program executables (i.e., shared modules) in DIR. By default libexecdir isset to EPREFIX/libexec.

--localstatedir=DIR Install modifiable single-machine data in DIR. By default localstatedir is set toPREFIX/var. This option is offered by autoconf and currently unused.

--mandir=DIR Install the man documentation in DIR. By default mandir is set to EPREFIX/man.

Page 257: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

8.6. CONFIGURE - CONFIGURE THE SOURCE TREE 249

--oldincludedir=DIR Install C header files for non-gcc in DIR. By default oldincludedir is set to/usr/include. This option is offered by autoconf and currently unused.

--sbindir=DIR Install the system administrator executables in DIR. Those are server programs like httpd,apachectl, suexec, etc. which are neccessary to run the Apache HTTP Server. By default sbindiris set to EPREFIX/sbin.

--sharedstatedir=DIR Install modifiable architecture-independent data in DIR. By defaultsharedstatedir is set to PREFIX/com. This option is offered by autoconf and currentlyunused.

--sysconfdir=DIR Install read-only single-machine data like the server configuration files httpd.conf,mime.types, etc. in DIR. By default sysconfdir is set to PREFIX/conf.

System types

These options are used to cross-compile the Apache HTTP Server to run on another system. In normal cases, whenbuilding and running the server on the same system, these options are not used.

--build=BUILD Defines the system type of the system on which the tools are being built. It defaults to the resultof the script config.guess.

--host=HOST Defines the system type of the system on which the server will run. HOST defaults to BUILD.

--target=TARGET Configure for building compilers for the system type TARGET. It defaults to HOST. Thisoption is offered by autoconf and not necessary for the Apache HTTP Server.

Optional Features

These options are used to fine tune the features your HTTP server will have.

General syntax

Generally you can use the following syntax to enable or disable a feature:

--disable-FEATURE Do not include FEATURE. This is the same as --enable-FEATURE=no.

--enable-FEATURE[=ARG] Include FEATURE. The default value for ARG is yes.

--enable-MODULE=shared The corresponding module will be build as DSO module.

--enable-MODULE=static By default enabled modules are linked statically. You can force this explicitly.

=⇒Noteconfigure will not complain about --enable-foo even if foo doesn’t exist, so you needto type carefully.

Page 258: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

250 CHAPTER 8. APACHE HTTP SERVER AND SUPPORTING PROGRAMS

Modules enabled by default

Some modules are compiled by default and have to be disabled explicitly. Use the following options to remove discretemodules from the compilation process.

--disable-actions Disable action triggering on requests, which is provided by MOD ACTIONS.

--disable-alias Disable the mapping of requests to different parts of the filesystem, which is provided byMOD ALIAS.

--disable-asis Disable support for as-is filetypes, which is provided by MOD ASIS.

--disable-auth Disable user-based access control provided by MOD AUTH. This module provides for HTTPBasic Authentication, where the usernames and passwords are stored in plain text files.

--disable-autoindex Disable the directory listing functionality provided by MOD AUTOINDEX.

--disable-access Disable host-based access control provided by MOD ACCESS.

--disable-cgi MOD CGI, which provides support for CGI scripts, is enabled by default when using a non-threaded MPM. Use this option to disable CGI support.

--disable-cgid When using the threaded MPMs WORKER or PERCHILD support for CGI scripts is provided byMOD CGID by default. To disable CGI support use this option.

--disable-charset-lite Disable character set translation provided by MOD CHARSET LITE. This modulewill be installed by default only on EBCDIC systems.

--disable-dir Disable directory request handling provided by MOD DIR.

--disable-env Disable setting and clearing of environment variables, which is provided by MOD ENV.

--disable-http Disable the HTTP protocol handling. The http module is a basic one, enabling the server tofunction as an HTTP server. It is only useful to disable it if you want to use another protocol module instead.Don’t disable this module unless you are really sure what you are doing.Note: This module will always be linked statically.

--disable-imap Disable support for server based imagemaps, which provided by MOD IMAP.

--disable-include Disable Server Side Includes provided by MOD INCLUDE.

--disable-log-config Disable the logging configuration provided by MOD LOG CONFIG. You won’t be ableto log requests to the server without this module.

--disable-mime MOD MIME associates the requested filename’s extensions with the file’s behavior and content(mime-type, language, character set and encoding). Disabling the mapping of file-extensions to MIME is nor-mally not recommended.

--disable-negotiation Disable content negotiation provided by MOD NEGOTIATION.

--disable-setenvif Disable support for basing environment variables on headers, which is provided byMOD SETENVIF.

--disable-status Disable the process/thread monitoring, which is provided by MOD STATUS.

--disable-userdir Disable the mapping of requests to user-specific directories, which is provided byMOD USERDIR.

Page 259: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

8.6. CONFIGURE - CONFIGURE THE SOURCE TREE 251

Modules, disabled by default

Some modules are compiled by default and have to be enabled explicitly or by using the keywords most or all (see--enable-mods-shared below for further explanation) to be available. Therefore use the options below.

--enable-auth-anon Enable anonymous user access provided by MOD AUTH ANON.

--enable-auth-dbm MOD AUTH DBM provides for HTTP Basic Authentication, where the usernames and pass-words are stored in DBM type database files. Use this option to enable the module.

--enable-auth-digest Enable RFC2617 Digest authentication provided by MOD AUTH DIGEST. This moduleuses plain text files to store the credentials.

--enable-auth-ldap Enable LDAP based authentication provided by MOD AUTH LDAP.

--enable-cache Enable dynamic file caching provided by MOD CACHE. This experimental module may beinteresting for servers with high load or caching proxy servers. At least one storage management module (e.g.MOD DISK CACHE or MOD MEM CACHE) is also necessary.

--enable-cern-meta Enable the CERN-type meta files support provided by MOD CERN META.

--enable-charset-lite Enable character set translation provided by MOD CHARSET LITE. This module willbe installed by default only on EBCDIC systems. On other systems, you have to enable it.

--enable-dav Enable the WebDAV protocol handling provided by MOD DAV. Support for filesystem re-sources is provided by the seperate module MOD DAV FS. This module is also automatically enabled with--enable-dav.Note: MOD DAV can only be used together with the http protocol module.

--enable-dav-fs Enable DAV support for filesystem resources, which is provided by MOD DAV FS. This mod-ule is a provider for the MOD DAV module, so you should also use --enable-dav.

--enable-deflate Enable deflate transfer encoding provided by MOD DEFLATE.

--enable-disk-cache Enable disk caching provided by MOD DISK CACHE.

--enable-expires Enable Expires header control provided by MOD EXPIRES.

--enable-ext-filter Enable the external filter support provided by MOD EXT FILTER.

--enable-file-cache Enable the file cache provided by MOD FILE CACHE.

--enable-headers Enable control of HTTP headers provided by MOD HEADERS.

--enable-info Enable the server information provided by MOD INFO.

--enable-ldap Enable LDAP caching and connection pooling services provided by MOD LDAP.

--enable-logio Enable logging of input and output bytes including headers provided by MOD LOGIO.

--enable-mem-cache Enable memory caching provided by MOD MEM CACHE.

--enable-mime-magic Enable automatical determining of MIME types, which is provided byMOD MIME MAGIC.

--enable-isapi Enable the isapi extension support provided by MOD ISAPI.

--enable-proxy Enable the proxy/gateway functionality provided by MOD PROXY. The proxying capabilities forCONNECT, FTP and HTTP are provided by the seperate modules MOD PROXY CONNECT, MOD PROXY FTPand MOD PROXY HTTP. These three modules are also automatically enabled with --enable-proxy.

Page 260: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

252 CHAPTER 8. APACHE HTTP SERVER AND SUPPORTING PROGRAMS

--enable-proxy-connect Enable proxy support for CONNECT request handling, which is provided byMOD PROXY CONNECT. This module is an extension for the MOD PROXY module, so you should also use--enable-proxy.

--enable-proxy-ftp Enable proxy support for FTP requests, which is provided by MOD PROXY FTP.. Thismodule is an extension for the MOD PROXY module, so you should also use --enable-proxy.

--enable-proxy-http Enable proxy support for HTTP requests, which is provided by MOD PROXY HTTP. Thismodule is an extension for the MOD PROXY module, so you should also use --enable-proxy.

--enable-rewrite Enable rule based URL manipulation provided by MOD REWRITE.

--enable-so Enable DSO capability provided by MOD SO. This module will be automatically enabled if you usethe --enable-mods-shared option.

--enable-speling Enable the functionality to correct common URL misspellings, which is provided byMOD SPELING.

--enable-ssl Enable support for SSL/TLS provided by MOD SSL.

--enable-unique-id Enable the generation of per-request unique ids, which is provided by MOD UNIQUE ID.

--enable-usertrack Enable user-session tracking provided by MOD USERTRACK.

--enable-vhost-alias Enable mass virtual hosting provided by MOD VHOST ALIAS.

Modules for developers

The following modules are useful only for developers and testing purposes and are disabled by default. Use thefollowing options to enable them. If you are not sure whether you need one of these modules, omit them.

--enable-bucketeer Enable the manipulation filter for buckets, which is provided by mod bucketeer.

--enable-case-filter Enable the example uppercase conversion output filter support of mod case filter.

--enable-case-filter-in Enable the example uppercase conversion input filter support ofmod case filter in.

--enable-echo Enable the ECHO server provided by MOD ECHO.

--enable-example Enable the example and demo module MOD EXAMPLE.

--enable-optional-fn-export Enable the example for an optional function exporter, which is provided bymod optional fn export.

--enable-optional-fn-import Enable the example for an optional function importer, which is provided bymod optional fn import.

--enable-optional-hook-export Enable the example for an optional hook exporter, which is provided bymod optional hook export.

--enable-optional-hook-import Enable the example optional hook importer, which is provided bymod optional hook import.

Page 261: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

8.6. CONFIGURE - CONFIGURE THE SOURCE TREE 253

MPMs and third-party modules

To add the necessary Multi Processing Module and additional third-party modules use the following options:

--with-module=module-type:module-file[, module-type:module-file] Add one or morethird-party modules to the list of statically linked modules. The module source file module-file will besearched in the modules/module-type subdirectory of your Apache HTTP server source tree. If it is notfound there configure is considering module-file to be an absolute file path and tries to copy the sourcefile into the module-type subdirectory. If the subdirectory doesn’t exist it will be created and populated with astandard Makefile.in.

This option is useful to add small external modules consisting of one source file. For more complex modulesyou should read the vendor’s documentation.

=⇒NoteIf you want to build a DSO module instead of a statically linked use apxs.

--with-mpm=MPM Choose the process model for your server. You have to select exactly one Multi-ProcessingModule (p. 59) . Otherwise the default MPM (p. 59) for your operating system will be taken. Possible MPMsare BEOS, LEADER, MPMT OS2, PERCHILD, PREFORK, THREADPOOL and WORKER.

Cumulative and other options

--enable-maintainer-mode Turn on debugging and compile time warnings.

--enable-mods-shared=MODULE-LIST Defines a list of modules to be enabled and build as dynamic sharedmodules. This mean, these module have to be loaded dynamically by using the LOADMODULE directive.

MODULE-LIST is a space separated list of modulenames enclosed by quotation marks. The module names aregiven without the preceding mod . For example:

--enable-mods-shared=’headers rewrite dav’

Additionally you can use the special keywords all and most. For example,

--enable-mods-shared=most

will compile most modules and build them as DSO modules.

--enable-modules=MODULE-LIST This option behaves similar to --enable-mods-shared, but will linkthe given modules statically. This mean, these modules will always be present while running httpd. Theyneed not be loaded with LOADMODULE.

--enable-v4-mapped Allow IPv6 sockets to handle IPv4 connections.

--with-port=PORT This defines the port on which httpd will listen. This port number is used when generatingthe configuration file httpd.conf. The default is 80.

--with-program-name Define an alternative executable name. The default is httpd.

Optional packages

These options are used to define optional packages.

Page 262: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

254 CHAPTER 8. APACHE HTTP SERVER AND SUPPORTING PROGRAMS

General syntax

Generally you can use the following syntax to define an optional package:

--with-PACKAGE[=ARG] Use the package PACKAGE. The default value for ARG is yes.

--without-PACKAGE Do not use the package PACKAGE. This is the same as --with-PACKAGE=no. Thisoption is provided by autoconf but not very useful for the Apache HTTP Server.

Specific packages

--with-apr=DIR|FILE The Apache Portable Runtime (APR) is part of the httpd source distribution and willautomatically be build together with the HTTP server. If you want to use an already installed APR instead youhave to tell configure the path to the apr-config script. You may set the absolute path and name or thedirectory to the installed APR. apr-config must exist within this directory or the subdirectory bin.

--with-apr-util=DIR|FILE The Apache Portable Runtime Utilities (APU) are part of the httpd source distri-bution and will automatically be build together with the HTTP server. If you want to use an already installedAPU instead you have to tell configure the path to the apu-config script. You may set the absolutepath and name or the directory to the installed APU. apu-config must exist within this directory or thesubdirectory bin.

--with-ssl=DIR If MOD SSL has been enabled configure searches for an installed OpenSSL. You can set thedirectory path to the SSL/TLS toolkit instead.

--with-z=DIR configure searches automatically for an installed zlib library if your source configurationrequires one (e.g., when MOD DEFLATE is enabled). You can set the directory path to the compression libraryinstead.

Several features of the Apache HTTP Server, including MOD AUTHN DBM and MOD REWRITE’s DBMREWRITEMAP use simple key/value databases for quick lookups of information. SDBM is included in the APU,so this database is always available. If you would like to use other database types, use the following options to enablethem:

--with-gdbm[=path] If no path is specified, configurewill search for the include files and libraries of a GNUDBM installation in the usual search paths. An explicit path will cause configure to look in path/lib andpath/include for the relevant files. Finally, the path may specify specific include and library paths separatedby a colon.

--with-ndbm[=path] Like --with-gdbm, bur searches for a New DBM installation.

--with-berkeley-db[=path] Like --with-gdbm, but searches for a Berkeley DB installation.

=⇒NoteThe DBM options are provided by the APU and passed through to its configuration script.They are useless when using an already installed APU defined by --with-apr-util.You may use more then one DBM implementation together with your HTTP server. The ap-propriated DBM type will be configured within the runtime configuration at each time.

Page 263: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

8.6. CONFIGURE - CONFIGURE THE SOURCE TREE 255

Options for support programs

--enable-static-support Build a statically linked version of the support binaries. This means, a stand-aloneexecutable will be built with all the necessary libraries integrated. Otherwise the support binaries are linkeddynamically by default.

--enable-suexec Use this option to enable suexec, which allows you to set uid and gid for spawned pro-cesses. Do not use this option unless you understand all the security implications of running a suid binaryon your server. Further options to configure suexec are described below.

It is possible to create a statically linked binary of a single support program by using the following options:

--enable-static-ab Build a statically linked version of ab.

--enable-static-checkgid Build a statically linked version of checkgid.

--enable-static-htdbm Build a statically linked version of htdbm.

--enable-static-htdigest Build a statically linked version of htdigest.

--enable-static-htpasswd Build a statically linked version of htpasswd.

--enable-static-logresolve Build a statically linked version of logresolve.

--enable-static-rotatelogs Build a statically linked version of rotatelogs.

suexec configuration options

The following options are used to fine tune the behavior of suexec. See Configuring and installing suEXEC (p. 268)or further information.

--with-suexec-bin This defines the path to suexec binary. Default is --sbindir (see Fine tuning of instal-lation directories).

--with-suexec-caller This defines the user allowed to call suexec. It should be the same as the user underwhich httpd normally runs.

--with-suexec-docroot This defines the directory tree under which suexec access is allowed for executa-bles. Default value is --datadir/htdocs.

--with-suexec-gidmin Define this as the lowest GID allowed to be a target user for suexec. The defaultvalue is 100.

--with-suexec-logfile This defines the filename of the suexec logfile. By default the logfile is namedsuexec log and located in --logfiledir.

--with-suexec-safepath Define the value of the environment variable PATH to be set for processes startedby suexec. Default value is /usr/local/bin:/usr/bin:/bin.

--with-suexec-userdir This defines the subdirectory under the user’s directory that contains all executablesfor which suexec access is allowed. This setting is necessary when you want to use suexec together withuser-specific directories (as provided by MOD USERDIR). The default is public html.

--with-suexec-uidmin Define this as the lowest UID allowed to be a target user for suexec. The defaultvalue is 100.

--with-suexec-umask Set umask for processes started by suexec. It defaults to your system settings.

Page 264: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

256 CHAPTER 8. APACHE HTTP SERVER AND SUPPORTING PROGRAMS

Environment variables

There are some useful environment variables to override the choices made by configure or to help it to find librariesand programs with nonstandard names or locations.

CC Define the C compiler command to be used for compilation.

CFLAGS Set C compiler flags you want to use for compilation.

CPP Define the C preprocessor command to be used.

CPPFLAGS Set C/C++ preprocessor flags, e.g. -Iincludedir if you have headers in a nonstandard directoryincludedir.

LDFLAGS Set linker flags, e.g. -Llibdir if you have libraries in a nonstandard directory libdir.

Page 265: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

8.7. DBMMANAGE - MANAGE USER AUTHENTICATION FILES IN DBM FORMAT 257

8.7 dbmmanage - Manage user authentication files in DBM format

dbmmanage is used to create and update the DBM format files used to store usernames and password for basic au-thentication of HTTP users via MOD AUTH DBM. Resources available from the Apache HTTP server can be restrictedto just the users listed in the files created by dbmmanage. This program can only be used when the usernames arestored in a DBM file. To use a flat-file database see htpasswd.

This manual page only lists the command line arguments. For details of the directives necessary to configureuser authentication in httpd see the httpd manual, which is part of the Apache distribution or can be found athttp://httpd.apache.org/.

See also

• httpd

• MOD AUTH DBM

Synopsis

dbmmanage [ encoding ] filename add|adduser|check|delete|update username [encpasswd [ group[,group...] [ comment ] ] ]

dbmmanage filename view [ username ]

dbmmanage filename import

Options

filename The filename of the DBM format file. Usually without the extension .db, .pag, or .dir.

username The user for which the operations are performed. The username may not contain a colon (:).

encpasswd This is the already encrypted password to use for the update and add commands. You may use ahyphen (-) if you want to get prompted for the password, but fill in the fields afterwards. Additionally whenusing the update command, a period (.) keeps the original password untouched.

group A group, which the user is member of. A groupname may not contain a colon (:). You may use a hyphen(-) if you don’t want to assign the user to a group, but fill in the comment field. Additionally when using theupdate command, a period (.) keeps the original groups untouched.

comment This is the place for your opaque comments about the user, like realname, mailaddress or such things. Theserver will ignore this field.

Encodings

-d crypt encryption (default, except on Win32, Netware)

-m MD5 encryption (default on Win32, Netware)

-s SHA1 encryption

-p plaintext (not recommended)

Page 266: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

258 CHAPTER 8. APACHE HTTP SERVER AND SUPPORTING PROGRAMS

Commands

add Adds an entry for username to filename using the encrypted password encpasswd.

dbmmanage passwords.dat add rbowen foKntnEF3KSXA

adduser Asks for a password and then adds an entry for username to filename.

dbmmanage passwords.dat adduser krietz

check Asks for a password and then checks if username is in filename and if it’s password matches the specifiedone.

dbmmanage passwords.dat check rbowen

delete Deletes the username entry from filename.

dbmmanage passwords.dat delete rbowen

import Reads username:password entries (one per line) from STDIN and adds them to filename. The pass-words already have to be crypted.

update Same as the adduser command, except that it makes sure username already exists in filename.

dbmmanage passwords.dat update rbowen

view Just displays the contents of the DBM file. If you specify a username, it displays the particular record only.

dbmmanage passwords.dat view

Bugs

One should be aware that there are a number of different DBM file formats in existence, and with all likelihood,libraries for more than one format may exist on your system. The three primary examples are SDBM, NDBM, theGNU project’s GDBM, and Berkeley DB 2. Unfortunately, all these libraries use different file formats, and you mustmake sure that the file format used by filename is the same format that dbmmanage expects to see. dbmmanagecurrently has no way of determining what type of DBM file it is looking at. If used against the wrong format, willsimply return nothing, or may create a different DBM file with a different name, or at worst, it may corrupt the DBMfile if you were attempting to write to it.

dbmmanage has a list of DBM format preferences, defined by the @AnyDBM::ISA array near the beginning of theprogram. Since we prefer the Berkeley DB 2 file format, the order in which dbmmanage will look for system librariesis Berkeley DB 2, then NDBM, then GDBM and then SDBM. The first library found will be the library dbmmanagewill attempt to use for all DBM file transactions. This ordering is slightly different than the standard @AnyDBM::ISAordering in Perl, as well as the ordering used by the simple dbmopen() call in Perl, so if you use any other utilities tomanage your DBM files, they must also follow this preference ordering. Similar care must be taken if using programsin other languages, like C, to access these files.

One can usually use the file program supplied with most Unix systems to see what format a DBM file is in.

Page 267: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

8.8. HTDBM - MANIPULATE DBM PASSWORD DATABASES 259

8.8 htdbm - Manipulate DBM password databases

htdbm is used to manipulate the DBM format files used to store usernames and password for basic authentication ofHTTP users via MOD AUTH DBM. See the dbmmanage documentation for more information about these DBM files.

See also

• httpd

• dbmmanage

• MOD AUTH DBM

Synopsis

htdbm [ -TDBTYPE ] [ -c ] [ -m | -d | -p | -s ] [ -t ] [ -v ] [ -x ] filenameusername

htdbm -b [ -TDBTYPE ] [ -c ] [ -m | -d | -p | -s ] [ -t ] [ -v ] filenameusername password

htdbm -n [ -c ] [ -m | -d | -p | -s ] [ -t ] [ -v ] username

htdbm -nb [ -c ] [ -m | -d | -p | -s ] [ -t ] [ -v ] username password

htdbm -v [ -TDBTYPE ] [ -c ] [ -m | -d | -p | -s ] [ -t ] [ -v ] filenameusername

htdbm -vb [ -TDBTYPE ] [ -c ] [ -m | -d | -p | -s ] [ -t ] [ -v ] filenameusername password

htdbm -x [ -TDBTYPE ] [ -m | -d | -p | -s ] filename username

htdbm -l [ -TDBTYPE ]

Options

-b Use batch mode; i.e., get the password from the command line rather than prompting for it. This option should beused with extreme care, since the password is clearly visible on the command line.

-c Create the passwdfile. If passwdfile already exists, it is rewritten and truncated. This option cannot be combinedwith the -n option.

-n Display the results on standard output rather than updating a database. This option changes the syntax of thecommand line, since the passwdfile argument (usually the first one) is omitted. It cannot be combined with the-c option.

-m Use MD5 encryption for passwords. On Windows, Netware and TPF, this is the default.

-d Use crypt() encryption for passwords. The default on all platforms but Windows, Netware and TPF. Thoughpossibly supported by htdbm on all platforms, it is not supported by the httpd server on Windows, Netwareand TPF.

-s Use SHA encryption for passwords. Facilitates migration from/to Netscape servers using the LDAP DirectoryInterchange Format (ldif).

-p Use plaintext passwords. Though htdbm will support creation on all platforms, the httpd daemon will onlyaccept plain text passwords on Windows, Netware and TPF.

-l Print each of the usernames and comments from the database on stdout.

Page 268: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

260 CHAPTER 8. APACHE HTTP SERVER AND SUPPORTING PROGRAMS

-t Interpret the final parameter as a comment. When this option is specified, an additional string can be appendedto the command line; this string will be stored in the "Comment" field of the database, associated with thespecified username.

-v Verify the username and password. The program will print a message indicating whether the supplied passwordis valid. If the password is invalid, the program exits with error code 3.

-x Delete user. If the username exists in the specified DBM file, it will be deleted.

filename The filename of the DBM format file. Usually without the extension .db, .pag, or .dir. If -c isgiven, the DBM file is created if it does not already exist, or updated if it does exist.

username The username to create or update in passwdfile. If username does not exist in this file, an entry is added.If it does exist, the password is changed.

password The plaintext password to be encrypted and stored in the DBM file. Used only with the -b flag.

-TDBTYPE Type of DBM file (SDBM, GDBM, DB, or "default").

Bugs

One should be aware that there are a number of different DBM file formats in existence, and with all likelihood,libraries for more than one format may exist on your system. The three primary examples are SDBM, NDBM, GNUGDBM, and Berkeley/Sleepycat DB 2/3/4. Unfortunately, all these libraries use different file formats, and you mustmake sure that the file format used by filename is the same format that htdbm expects to see. htdbm currently hasno way of determining what type of DBM file it is looking at. If used against the wrong format, will simply returnnothing, or may create a different DBM file with a different name, or at worst, it may corrupt the DBM file if you wereattempting to write to it.

One can usually use the file program supplied with most Unix systems to see what format a DBM file is in.

Exit Status

htdbm returns a zero status ("true") if the username and password have been successfully added or updated in theDBM File. htdbm returns 1 if it encounters some problem accessing files, 2 if there was a syntax problem with thecommand line, 3 if the password was entered interactively and the verification entry didn’t match, 4 if its operationwas interrupted, 5 if a value is too long (username, filename, password, or final computed record), 6 if the usernamecontains illegal characters (see the Restrictions section), and 7 if the file is not a valid DBM password file.

Examples

htdbm /usr/local/etc/apache/.htdbm-users jsmith

Adds or modifies the password for user jsmith. The user is prompted for the password. If executed on a Windowssystem, the password will be encrypted using the modified Apache MD5 algorithm; otherwise, the system’s crypt()routine will be used. If the file does not exist, htdbm will do nothing except return an error.

htdbm -c /home/doe/public html/.htdbm jane

Creates a new file and stores a record in it for user jane. The user is prompted for the password. If the file exists andcannot be read, or cannot be written, it is not altered and htdbm will display a message and return an error status.

Page 269: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

8.8. HTDBM - MANIPULATE DBM PASSWORD DATABASES 261

htdbm -mb /usr/web/.htdbm-all jones Pwd4Steve

Encrypts the password from the command line (Pwd4Steve) using the MD5 algorithm, and stores it in the specifiedfile.

Security Considerations

Web password files such as those managed by htdbm should not be within the Web server’s URI space – that is, theyshould not be fetchable with a browser.

The use of the -b option is discouraged, since when it is used the unencrypted password appears on the commandline.

Restrictions

On the Windows and MPE platforms, passwords encrypted with htdbm are limited to no more than 255 charactersin length. Longer passwords will be truncated to 255 characters.

The MD5 algorithm used by htdbm is specific to the Apache software; passwords encrypted using it will not be usablewith other Web servers.

Usernames are limited to 255 bytes and may not include the character :.

Page 270: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

262 CHAPTER 8. APACHE HTTP SERVER AND SUPPORTING PROGRAMS

8.9 htdigest - manage user files for digest authentication

htdigest is used to create and update the flat-files used to store usernames, realm and password for digest authen-tication of HTTP users. Resources available from the Apache HTTP server can be restricted to just the users listed inthe files created by htdigest.

This manual page only lists the command line arguments. For details of the directives necessary to configure di-gest authentication in httpd see the Apache manual, which is part of the Apache distribution or can be found athttp://httpd.apache.org/.

See also

• httpd

• MOD AUTH DIGEST

Synopsis

htdigest [ -c ] passwdfile realm username

Options

-c Create the passwdfile. If passwdfile already exists, it is deleted first.

passwdfile Name of the file to contain the username, realm and password. If -c is given, this file is created if itdoes not already exist, or deleted and recreated if it does exist.

realm The realm name to which the user name belongs.

username The user name to create or update in passwdfile. If username does not exist is this file, an entry is added.If it does exist, the password is changed.

Page 271: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

8.10. HTPASSWD - MANAGE USER FILES FOR BASIC AUTHENTICATION 263

8.10 htpasswd - Manage user files for basic authentication

htpasswd is used to create and update the flat-files used to store usernames and password for basic authentication ofHTTP users. If htpasswd cannot access a file, such as not being able to write to the output file or not being able toread the file in order to update it, it returns an error status and makes no changes.

Resources available from the Apache HTTP server can be restricted to just the users listed in the files created byhtpasswd. This program can only manage usernames and passwords stored in a flat-file. It can encrypt and displaypassword information for use in other types of data stores, though. To use a DBM database see dbmmanage.

htpasswd encrypts passwords using either a version of MD5 modified for Apache, or the system’s crypt() routine.Files managed by htpasswd may contain both types of passwords; some user records may have MD5-encryptedpasswords while others in the same file may have passwords encrypted with crypt().

This manual page only lists the command line arguments. For details of the directives necessary to configureuser authentication in httpd see the Apache manual, which is part of the Apache distribution or can be found athttp://httpd.apache.org/1.

See also

• httpd

• The scripts in support/SHA1 which come with the distribution.

Synopsis

htpasswd [ -c ] [ -m ] [ -D ] passwdfile username

htpasswd -b [ -c ] [ -m | -d | -p | -s ] [ -D ] passwdfile username password

htpasswd -n [ -m | -d | -s | -p ] username

htpasswd -nb [ -m | -d | -s | -p ] username password

Options

-b Use batch mode; i.e., get the password from the command line rather than prompting for it. This option should beused with extreme care, since the password is clearly visible on the command line.

-c Create the passwdfile. If passwdfile already exists, it is rewritten and truncated. This option cannot be combinedwith the -n option.

-n Display the results on standard output rather than updating a file. This is useful for generating password recordsacceptable to Apache for inclusion in non-text data stores. This option changes the syntax of the command line,since the passwdfile argument (usually the first one) is omitted. It cannot be combined with the -c option.

-m Use MD5 encryption for passwords. On Windows, Netware and TPF, this is the default.

-d Use crypt() encryption for passwords. The default on all platforms but Windows, Netware and TPF. Thoughpossibly supported by htpasswd on all platforms, it is not supported by the httpd server on Windows,Netware and TPF.

-s Use SHA encryption for passwords. Facilitates migration from/to Netscape servers using the LDAP DirectoryInterchange Format (ldif).

-p Use plaintext passwords. Though htpasswd will support creation on all platforms, the httpd daemon will onlyaccept plain text passwords on Windows, Netware and TPF.

1http://httpd.apache.org

Page 272: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

264 CHAPTER 8. APACHE HTTP SERVER AND SUPPORTING PROGRAMS

-D Delete user. If the username exists in the specified htpasswd file, it will be deleted.

passwdfile Name of the file to contain the user name and password. If -c is given, this file is created if it doesnot already exist, or rewritten and truncated if it does exist.

username The username to create or update in passwdfile. If username does not exist in this file, an entry is added.If it does exist, the password is changed.

password The plaintext password to be encrypted and stored in the file. Only used with the -b flag.

Exit Status

htpasswd returns a zero status ("true") if the username and password have been successfully added or updated inthe passwdfile. htpasswd returns 1 if it encounters some problem accessing files, 2 if there was a syntax problemwith the command line, 3 if the password was entered interactively and the verification entry didn’t match, 4 if itsoperation was interrupted, 5 if a value is too long (username, filename, password, or final computed record), 6 if theusername contains illegal characters (see the Restrictions section), and 7 if the file is not a valid password file.

Examples

htpasswd /usr/local/etc/apache/.htpasswd-users jsmith

Adds or modifies the password for user jsmith. The user is prompted for the password. If executed on a Windowssystem, the password will be encrypted using the modified Apache MD5 algorithm; otherwise, the system’s crypt()routine will be used. If the file does not exist, htpasswd will do nothing except return an error.

htpasswd -c /home/doe/public html/.htpasswd jane

Creates a new file and stores a record in it for user jane. The user is prompted for the password. If the file exists andcannot be read, or cannot be written, it is not altered and htpasswd will display a message and return an error status.

htpasswd -mb /usr/web/.htpasswd-all jones Pwd4Steve

Encrypts the password from the command line (Pwd4Steve) using the MD5 algorithm, and stores it in the specifiedfile.

Security Considerations

Web password files such as those managed by htpasswd should not be within the Web server’s URI space – that is,they should not be fetchable with a browser.

The use of the -b option is discouraged, since when it is used the unencrypted password appears on the commandline.

Restrictions

On the Windows and MPE platforms, passwords encrypted with htpasswd are limited to no more than 255 charac-ters in length. Longer passwords will be truncated to 255 characters.

The MD5 algorithm used by htpasswd is specific to the Apache software; passwords encrypted using it will not beusable with other Web servers.

Usernames are limited to 255 bytes and may not include the character :.

Page 273: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

8.11. LOGRESOLVE - RESOLVE IP-ADDRESSES TO HOSTNAMES IN APACHE LOG FILES 265

8.11 logresolve - Resolve IP-addresses to hostnames in Apache log files

logresolve is a post-processing program to resolve IP-addresses in Apache’s access logfiles. To minimize impacton your nameserver, logresolve has its very own internal hash-table cache. This means that each IP number will onlybe looked up the first time it is found in the log file.

Takes an Apache log file on standard input. The IP addresses must be the first thing on each line and must be seperatedfrom the remainder of the line by a space.

Synopsis

logresolve [ -s filename ] [ -c ] < access log > access log.new

Options

-s filename Specifies a filename to record statistics.

-c This causes logresolve to apply some DNS checks: after finding the hostname from the IP address, it looksup the IP addresses for the hostname and checks that one of these matches the original address.

Page 274: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

266 CHAPTER 8. APACHE HTTP SERVER AND SUPPORTING PROGRAMS

8.12 rotatelogs - Piped logging program to rotate Apache logs

rotatelogs is a simple program for use in conjunction with Apache’s piped logfile feature. For example:

CustomLog "|bin/rotatelogs /var/logs/logfile 86400" common

This creates the files /var/logs/logfile.nnnn where nnnn is the system time at which the log nominally starts (this timewill always be a multiple of the rotation time, so you can synchronize cron scripts with it). At the end of each rotationtime (here after 24 hours) a new log is started.

CustomLog "|bin/rotatelogs /var/logs/logfile 5M" common

This configuration will rotate the logfile whenever it reaches a size of 5 megabytes.

ErrorLog "|bin/rotatelogs /var/logs/errorlog.%Y-%m-%d-%H %M %S 5M"

This configuration will rotate the error logfile whenever it reaches a size of 5 megabytes, and the suffix to the logfilename will be created of the form errorlog.YYYY-mm-dd-HH MM SS.

Synopsis

rotatelogs [ -l ] logfile [ rotationtime [ offset ]] | [ filesizeM ]

Options

-l (2.0.51 and later) Causes the use of local time rather than GMT as the base for the interval. Note that using -l inan environment which changes the GMT offset (such as for BST or DST) can lead to unpredictable results!

logfile The path plus basename of the logfile. If logfile includes any ’%’ characters, it is treated as a format stringfor strftime(3). Otherwise, the suffix .nnnnnnnnnn is automatically added and is the time in seconds. Bothformats compute the start time from the beginning of the current period.

rotationtime The time between log file rotations in seconds.

offset The number of minutes offset from UTC. If omitted, zero is assumed and UTC is used. For example, to uselocal time in the zone UTC -5 hours, specify a value of -300 for this argument.

filesizeM The maximum file size in megabytes followed by the letter M to specify size rather than time. Use thisparameter in place of both rotationtime and offset.

Portability

The following logfile format string substitutions should be supported by all strftime(3) implementations, see thestrftime(3) man page for library-specific extensions.

%A full weekday name (localized)%a 3-character weekday name (localized)%B full month name (localized)

Page 275: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

8.12. ROTATELOGS - PIPED LOGGING PROGRAM TO ROTATE APACHE LOGS 267

%b 3-character month name (localized)%c date and time (localized)%d 2-digit day of month%H 2-digit hour (24 hour clock)%I 2-digit hour (12 hour clock)%j 3-digit day of year%M 2-digit minute%m 2-digit month%p am/pm of 12 hour clock (localized)%S 2-digit second%U 2-digit week of year (Sunday first day of week)%W 2-digit week of year (Monday first day of week)%w 1-digit weekday (Sunday first day of week)%X time (localized)%x date (localized)%Y 4-digit year%y 2-digit year%Z time zone name%% literal ‘%’

Page 276: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

268 CHAPTER 8. APACHE HTTP SERVER AND SUPPORTING PROGRAMS

8.13 suexec - Switch user before executing external programs

suexec is used by the Apache HTTP Server to switch to another user before executing CGI programs. In order toachieve this, it must run as root. Since the HTTP daemon normally doesn’t run as root, the suexec executableneeds the setuid bit set and must be owned by root. It should never be writable for any other person than root.

For further information about the concepts and and the security model of suexec please refer to the suexec documen-tation (http://httpd.apache.org/docs/2.0/suexec.html).

Synopsis

suexec -V

Options

-V If you are root, this option displays the compile options of suexec. For security reasons all configurationoptions are changeable only at compile time.

Page 277: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

8.14. OTHER PROGRAMS 269

8.14 Other Programs

The following programs are simple support programs included with the Apache HTTP Server which do not have theirown manual pages. They are not installed automatically. You can find them after the configuration process in thesupport/ directory.

log server status

This perl script is designed to be run at a frequent interval by something like cron. It connects to the server anddownloads the status information. It reformats the information to a single line and logs it to a file. Adjust the variablesat the top of the script to specify the location of the resulting logfile.

split-logfile

This perl script will take a combined Web server access log file and break its contents into separate files. It assumesthat the first field of each line is the virtual host identity (put there by "%v"), and that the logfiles should be namedthat + ".log" in the current directory.

The combined log file is read from stdin. Records read will be appended to any existing log files.

split-logfile < access.log

Page 278: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

270 CHAPTER 8. APACHE HTTP SERVER AND SUPPORTING PROGRAMS

Page 279: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

Chapter 9

Apache Miscellaneous Documentation

271

Page 280: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

272 CHAPTER 9. APACHE MISCELLANEOUS DOCUMENTATION

9.1 Apache Miscellaneous Documentation

Below is a list of additional documentation pages that apply to the Apache web server development project.

! WarningSome of the documents below have not been fully updated to take into account changes madein the 2.0 version of the Apache HTTP Server. Some of the information may still be relevant,but please use it with care.

How to use XSSI and Negotiation for custom ErrorDocuments (p. 273) Describes a solution which uses XSSIand negotiation to custom-tailor the Apache ErrorDocuments to taste, adding the advantage of returning in-ternationalized versions of the error messages depending on the client’s language preferences.

File Descriptor use in Apache (p. 291) Describes how Apache uses file descriptors and talks about various limitsimposed on the number of descriptors available by various operating systems.

FIN WAIT 2 (p. 281) A description of the causes of Apache processes going into the FIN WAIT 2 state, and whatyou can do about it.

Known Client Problems (p. 286) A list of problems in HTTP clients which can be mitigated by Apache.

Performance Notes - Apache Tuning (p. 74) Notes about how to (run-time and compile-time) configure Apache forhighest performance. Notes explaining why Apache does some things, and why it doesn’t do other things (whichmake it slower/faster).

Security Tips (p. 40) Some "do"s - and "don’t"s - for keeping your Apache web site secure.

URL Rewriting Guide (p. 86) This document supplements the MOD REWRITE reference documentation (p. 521) .It describes how one can use Apache’s MOD REWRITE to solve typical URL-based problems webmasters areusually confronted with in practice.

Apache Tutorials (p. 204) A list of external resources which help to accomplish common tasks with the ApacheHTTP server.

Relevant Standards (p. 294) This document acts as a reference page for most of the relevant standards that Apachefollows.

Page 281: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

9.2. INTERNATIONAL CUSTOMIZED SERVER ERROR MESSAGES 273

9.2 International Customized Server Error Messages

! Warning:This document has not been fully updated to take into account changes made in the 2.0 versionof the Apache HTTP Server. Some of the information may still be relevant, but please use itwith care.

This document describes an easy way to provide your Apache HTTP Server with a set of customized error messageswhich take advantage of Content Negotiation (p. 47) and MOD INCLUDE to return error messages generated by theserver in the client’s native language.

Introduction

By using SSI, all ERRORDOCUMENT messages can share a homogenous and consistent style and layout, and mainte-nance work (changing images, changing links) is kept to a minimum because all layout information can be kept in asingle file.

Error documents can be shared across different servers, or even hosts, because all varying information is inserted atthe time the error document is returned on behalf of a failed request.

Content Negotiation then selects the appropriate language version of a particular error message text, honoring thelanguage preferences passed in the client’s request. (Users usually select their favorite languages in the preferencesoptions menu of today’s browsers). When an error document in the client’s primary language version is unavailable,the secondary languages are tried or a default (fallback) version is used.

You have full flexibility in designing your error documents to your personal taste (or your company’s conventions). Fordemonstration purposes, we present a simple generic error document scheme. For this hypothetic server, we assumethat all error messages...

• possibly are served by different virtual hosts (different host name, different IP address, or different port) on theserver machine,

• show a predefined company logo in the right top of the message (selectable by virtual host),

• print the error title first, followed by an explanatory text and (depending on the error context) help on how toresolve the error,

• have some kind of standardized background image,

• display an apache logo and a feedback email address at the bottom of the error message.

An example of a "document not found" message for a german client might look like this:

Page 282: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

274 CHAPTER 9. APACHE MISCELLANEOUS DOCUMENTATION

All links in the document as well as links to the server’s administrator mail address, and even the name and port of theserving virtual host are inserted in the error document at "run-time", i.e., when the error actually occurs.

Creating an ErrorDocument directory

For this concept to work as easily as possible, we must take advantage of as much server support as we can get:

1. By defining the MultiViews OPTIONS, we enable the language selection of the most appropriate language alter-native (content negotiation).

2. By setting the LANGUAGEPRIORITY directive we define a set of default fallback languages in the situationwhere the client’s browser did not express any preference at all.

3. By enabling MOD INCLUDE (and disallowing execution of cgi scripts for security reasons), we allow the serverto include building blocks of the error message, and to substitute the value of certain environment variables intothe generated document (dynamic HTML) or even to conditionally include or omit parts of the text.

4. The ADDHANDLER and ADDTYPE directives are useful for automatically SSI-expanding all files with a.shtml suffix to text/html.

5. By using the ALIAS directive, we keep the error document directory outside of the document tree because it canbe regarded more as a server part than part of the document tree.

6. The <DIRECTORY> block restricts these "special" settings to the error document directory and avoids animpact on any of the settings for the regular document tree.

Page 283: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

9.2. INTERNATIONAL CUSTOMIZED SERVER ERROR MESSAGES 275

7. For each of the error codes to be handled (see RFC2068 for an exact description of each error code, or look atsrc/main/http protocol.c if you wish to see apache’s standard messages), an ERRORDOCUMENT inthe aliased /errordocs directory is defined. Note that we only define the basename of the document herebecause the MultiViews option will select the best candidate based on the language suffixes and the client’spreferences. Any error situation with an error code not handled by a custom document will be dealt with by theserver in the standard way (i.e., a plain error message in english).

8. Finally, the ALLOWOVERRIDE directive tells apache that it is not necessary to look for a .htaccess file in the/errordocs directory: a minor speed optimization.

The resulting httpd.conf configuration would then look similar to this:

=⇒NoteNote that you can define your own error messages using this method for only part of thedocument tree, e.g., a /˜user/ subtree. In this case, the configuration could as well be put intothe .htaccess file at the root of the subtree, and the <Directory> and </Directory> directives-but not the contained directives- must be omitted.

LanguagePriority en fr deAlias /errordocs /usr/local/apache/errordocs

<Directory /usr/local/apache/errordocs>

AllowOverride noneOptions MultiViews IncludesNoExec FollowSymLinksAddType text/html .shtml<FilesMatch "\.shtml[.$]">

SetOutputFilter INCLUDES

</FilesMatch>

</Directory>

# "400 Bad Request",ErrorDocument 400 /errordocs/400# "401 Authorization Required",ErrorDocument 401 /errordocs/401# "403 Forbidden",ErrorDocument 403 /errordocs/403# "404 Not Found",ErrorDocument 404 /errordocs/404# "500 Internal Server Error",

ErrorDocument 500 /errordocs/500

The directory for the error messages (here: /usr/local/apache/errordocs/) must then be created with theappropriate permissions (readable and executable by the server uid or gid, only writable for the administrator).

Naming the Individual Error Document files

By defining the MultiViews option, the server was told to automatically scan the directory for matching variants(looking at language and content type suffixes) when a requested document was not found. In the configuration, wedefined the names for the error documents to be just their error number (without any suffix).

The names of the individual error documents are now determined like this (I’m using 403 as an example, think of it asa placeholder for any of the configured error documents):

• No file errordocs/403 should exist. Otherwise, it would be found and served (with the DefaultType, usuallytext/plain), all negotiation would be bypassed.

Page 284: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

276 CHAPTER 9. APACHE MISCELLANEOUS DOCUMENTATION

• For each language for which we have an internationalized version (note that this need not be the same set oflanguages for each error code - you can get by with a single language version until you actually have trans-lated versions), a document errordocs/403.shtml.lang is created and filled with the error text in thatlanguage (see below).

• One fallback document called errordocs/403.shtml is created, usually by creating a symlink to the de-fault language variant (see below).

The Common Header and Footer Files

By putting as much layout information in two special "include files", the error documents can be reduced to a bareminimum.

One of these layout files defines the HTML document header and a configurable list of paths to the icons to be shownin the resulting error document. These paths are exported as a set of SSI environment variables and are later evaluatedby the "footer" special file. The title of the current error (which is put into the TITLE tag and an H1 header) is simplypassed in from the main error document in a variable called title.

By changing this file, the layout of all generated error messages can be changed in a second. (By exploiting thefeatures of SSI, you can easily define different layouts based on the current virtual host, or even based on the client’sdomain name).

The second layout file describes the footer to be displayed at the bottom of every error message. In this example,it shows an apache logo, the current server time, the server version string and adds a mail reference to the site’swebmaster.

For simplicity, the header file is simply called head.shtml because it contains server-parsed content but no languagespecific information. The footer file exists once for each language translation, plus a symlink for the default language.

for English, French and German versions (default english)

foot.shtml.en,foot.shtml.fr,foot.shtml.de,foot.shtml symlink to

foot.shtml.en

Both files are included into the error document by using the directives <!--#include virtual="head" -->and <!--#include virtual="foot" --> respectively: the rest of the magic occurs in mod negotiation andin mod include.

See the listings below to see an actual HTML implementation of the discussed example.

Creating ErrorDocuments in Different Languages

After all this preparation work, little remains to be said about the actual documents. They all share a simple commonstructure:

<!--#set var="title" value="error description title" --><!--#include virtual="head" -->

explanatory error text

<!--#include virtual="foot" -->

In the listings section, you can see an example of a [400 Bad Request] error document. Documents as simple as thatcertainly cause no problems to translate or expand.

Page 285: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

9.2. INTERNATIONAL CUSTOMIZED SERVER ERROR MESSAGES 277

The Fallback Language

Do we need a special handling for languages other than those we have translations for? We did set the LanguagePri-ority, didn’t we?!

Well, the LanguagePriority directive is for the case where the client does not express any language priority at all. Butwhat happens in the situation where the client wants one of the languages we do not have, and none of those we dohave?

Without doing anything, the Apache server will usually return a [406 no acceptable variant] error, listing the choicesfrom which the client may select. But we’re in an error message already, and important error information might getlost when the client had to choose a language representation first.

So, in this situation it appears to be easier to define a fallback language (by copying or linking, e.g., the englishversion to a language-less version). Because the negotiation algorithm prefers "more specialized" variants over "moregeneric" variants, these generic alternatives will only be chosen when the normal negotiation did not succeed.

A simple shell script to do it (execute within the errordocs/ dir):

for f in *.shtml.endo

ln -s $f ‘basename $f .en‘

done

Customizing Proxy Error Messages

As of Apache-1.3, it is possible to use the ErrorDocument mechanism for proxy error messages as well (previousversions always returned fixed predefined error messages).

Most proxy errors return an error code of [500 Internal Server Error]. To find out whether a particular error documentwas invoked on behalf of a proxy error or because of some other server error, and what the reason for the failure was,you can check the contents of the new ERROR NOTES CGI environment variable: if invoked for a proxy error, thisvariable will contain the actual proxy error message text in HTML form.

The following excerpt demonstrates how to exploit the ERROR NOTES variable within an error document:

<!--#if expr="$REDIRECT ERROR NOTES = ’’" -->

<p>

The server encountered an unexpected conditionwhich prevented it from fulfilling the request.

</p>

<p>

<a href="mailto:<!--#echo var="SERVER ADMIN" -->"SUBJECT="Error message [<!--#echo var="REDIRECT STATUS" -->]<!--#echo var="title" --> for <!--#echo var="REQUEST URI" -->">Please forward this error screen to <!--#echo var="SERVER NAME"-->’sWebMaster</a>; it includes useful debugging information aboutthe Request which caused the error.

<pre><!--#printenv --></pre>

</p>

<!--#else -->

<!--#echo var="REDIRECT ERROR NOTES" -->

<!--#endif -->

Page 286: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

278 CHAPTER 9. APACHE MISCELLANEOUS DOCUMENTATION

HTML Listing of the Discussed Example

So, to summarize our example, here’s the complete listing of the 400.shtml.en document. You will notice that itcontains almost nothing but the error text (with conditional additions). Starting with this example, you will find it easyto add more error documents, or to translate the error documents to different languages.

<!--#set var="title" value="Bad Request"--><!--#include virtual="head" -->

<p>

Your browser sent a request that this server could not understand:<blockquote>

<strong><!--#echo var="REQUEST URI" --></strong>

</blockquote>

The request could not be understood by the server due to malformedsyntax. The client should not repeat the request withoutmodifications.

</p>

<p>

<!--#if expr="$HTTP REFERER != ’’" -->

Please inform the owner of<a href="<!--#echo var="HTTP REFERER" -->">the referringpage</a> aboutthe malformed link.

<!--#else -->

Please check your request for typing errors and retry.

<!--#endif -->

</p>

<!--#include virtual="foot" -->

Here is the complete head.shtml.en file (the funny line breaks avoid empty lines in the document after SSIprocessing). Note the configuration section at top. That’s where you configure the images and logos as well as theapache documentation directory. Look how this file displays two different logos depending on the content of the virtualhost name ($SERVER NAME), and that an animated apache logo is shown if the browser appears to support it (thelatter requires server configuration lines of the form

BrowserMatch "ˆMozilla/[2-4]" anigif

for browser types which support animated GIFs).

Page 287: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

9.2. INTERNATIONAL CUSTOMIZED SERVER ERROR MESSAGES 279

<!--#if expr="$SERVER NAME = /.*\.mycompany\.com/" -->

<!--#set var="IMG CorpLogo"value="http://$SERVER NAME:$SERVER PORT/errordocs/CorpLogo.gif"--><!--#set var="ALT CorpLogo" value="Powered by Linux!" -->

<!--#else -->

<!--#set var="IMG CorpLogo"value="http://$SERVER NAME:$SERVER PORT/errordocs/PrivLogo.gif"--><!--#set var="ALT CorpLogo" value="Powered by Linux!" -->

<!--#endif-->

<!--#set var="IMG BgImage"value="http://$SERVER NAME:$SERVER PORT/errordocs/BgImage.gif" --><!--#set var="DOC Apache"value="http://$SERVER NAME:$SERVER PORT/Apache/" -->

<!--#if expr="$anigif" -->

<!--#set var="IMG Apache"value="http://$SERVER NAME:$SERVER PORT/icons/apache anim.gif" -->

<!--#else-->

<!--#set var="IMG Apache"value="http://$SERVER NAME:$SERVER PORT/icons/apache pb.gif" -->

<!--#endif-->

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"><html><head>

<title>[<!--#echo var="REDIRECT STATUS" -->] <!--#echo var="title" --></title>

</head>

<body bgcolor="white" background="<!--#echo var="IMG BgImage" -->">

<h1 align="center">[<!--#echo var="REDIRECT STATUS" -->] <!--#echo var="title" --><img src="<!--#echo var="IMG CorpLogo" -->"alt="<!--#echo var="ALT CorpLogo" -->" align="right"></h1>

<hr /> <!--======================================================== --><div>

and this is the foot.shtml.en file:

Page 288: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

280 CHAPTER 9. APACHE MISCELLANEOUS DOCUMENTATION

</div><hr />

<div align="right">

<small>Local Server time: <!--#echo var="DATE LOCAL"--></small>

</div>

<div align="center">

<a href="<!--#echo var="DOC Apache" -->"><img src="<!--#echo var="IMG Apache" -->" border="0"align="bottom"alt="Powered by <!--#echo var="SERVER SOFTWARE" -->"></a><br /><small><!--#set var="var" value="Powered by $SERVER SOFTWARE--File last modified on $LAST MODIFIED" --><!--#echo var="var" --></small>

</div>

<p>If the indicated error looks like a misconfiguration, pleaseinform<a href="mailto:<!--#echo var="SERVER ADMIN" -->"subject="Feedback about Error message [<!--#echovar="REDIRECT STATUS" -->]<!--#echo var="title" -->, req=<!--#echo var="REQUEST URI" -->"><!--#echo var="SERVER NAME" -->’s WebMaster</a>.</p>

</body>

</html>

If you have tips to contribute, send mail to [email protected]

1mailto:[email protected]

Page 289: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

9.3. CONNECTIONS IN THE FIN WAIT 2 STATE AND APACHE 281

9.3 Connections in the FIN WAIT 2 state and Apache

! Warning:This document has not been fully updated to take into account changes made in the 2.0 versionof the Apache HTTP Server. Some of the information may still be relevant, but please use itwith care.

Starting with the Apache 1.2 betas, people are reporting many more connections in the FIN WAIT 2 state (as reportedby netstat) than they saw using older versions. When the server closes a TCP connection, it sends a packet with theFIN bit set to the client, which then responds with a packet with the ACK bit set. The client then sends a packet withthe FIN bit set to the server, which responds with an ACK and the connection is closed. The state that the connectionis in during the period between when the server gets the ACK from the client and the server gets the FIN from theclient is known as FIN WAIT 2. See the TCP RFC2 for the technical details of the state transitions.

The FIN WAIT 2 state is somewhat unusual in that there is no timeout defined in the standard for it. This means thaton many operating systems, a connection in the FIN WAIT 2 state will stay around until the system is rebooted. Ifthe system does not have a timeout and too many FIN WAIT 2 connections build up, it can fill up the space allocatedfor storing information about the connections and crash the kernel. The connections in FIN WAIT 2 do not tie up anhttpd process.

Why Does It Happen?

There are numerous reasons for it happening, some of them may not yet be fully clear. What is known follows.

Buggy Clients and Persistent Connections

Several clients have a bug which pops up when dealing with persistent connections (aka keepalives). When theconnection is idle and the server closes the connection (based on the KEEPALIVETIMEOUT), the client is programmedso that the client does not send back a FIN and ACK to the server. This means that the connection stays in theFIN WAIT 2 state until one of the following happens:

• The client opens a new connection to the same or a different site, which causes it to fully close the olderconnection on that socket.

• The user exits the client, which on some (most?) clients causes the OS to fully shutdown the connection.

• The FIN WAIT 2 times out, on servers that have a timeout for this state.

If you are lucky, this means that the buggy client will fully close the connection and release the resources on yourserver. However, there are some cases where the socket is never fully closed, such as a dialup client disconnectingfrom their provider before closing the client. In addition, a client might sit idle for days without making anotherconnection, and thus may hold its end of the socket open for days even though it has no further use for it. This is abug in the browser or in its operating system’s TCP implementation.

The clients on which this problem has been verified to exist:

• Mozilla/3.01 (X11; I; FreeBSD 2.1.5-RELEASE i386)

• Mozilla/2.02 (X11; I; FreeBSD 2.1.5-RELEASE i386)

• Mozilla/3.01Gold (X11; I; SunOS 5.5 sun4m)

• MSIE 3.01 on the Macintosh2ftp://ds.internic.net/rfc/rfc793.txt

Page 290: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

282 CHAPTER 9. APACHE MISCELLANEOUS DOCUMENTATION

• MSIE 3.01 on Windows 95

This does not appear to be a problem on:

• Mozilla/3.01 (Win95; I)

It is expected that many other clients have the same problem. What a client should do is periodically check its opensocket(s) to see if they have been closed by the server, and close their side of the connection if the server has closed.This check need only occur once every few seconds, and may even be detected by a OS signal on some systems (e.g.,Win95 and NT clients have this capability, but they seem to be ignoring it).

Apache cannot avoid these FIN WAIT 2 states unless it disables persistent connections for the buggy clients, just likewe recommend doing for Navigator 2.x clients due to other bugs. However, non-persistent connections increase thetotal number of connections needed per client and slow retrieval of an image-laden web page. Since non-persistentconnections have their own resource consumptions and a short waiting period after each closure, a busy server mayneed persistence in order to best serve its clients.

As far as we know, the client-caused FIN WAIT 2 problem is present for all servers that support persistent connections,including Apache 1.1.x and 1.2.

A necessary bit of code introduced in 1.2

While the above bug is a problem, it is not the whole problem. Some users have observed no FIN WAIT 2 problemswith Apache 1.1.x, but with 1.2b enough connections build up in the FIN WAIT 2 state to crash their server. Themost likely source for additional FIN WAIT 2 states is a function called lingering close() which was addedbetween 1.1 and 1.2. This function is necessary for the proper handling of persistent connections and any requestwhich includes content in the message body (e.g., PUTs and POSTs). What it does is read any data sent by the clientfor a certain time after the server closes the connection. The exact reasons for doing this are somewhat complicated,but involve what happens if the client is making a request at the same time the server sends a response and closes theconnection. Without lingering, the client might be forced to reset its TCP input buffer before it has a chance to readthe server’s response, and thus understand why the connection has closed. See the appendix for more details.

The code in lingering close() appears to cause problems for a number of factors, including the change in trafficpatterns that it causes. The code has been thoroughly reviewed and we are not aware of any bugs in it. It is possiblethat there is some problem in the BSD TCP stack, aside from the lack of a timeout for the FIN WAIT 2 state, exposedby the lingering close code that causes the observed problems.

What Can I Do About it?

There are several possible workarounds to the problem, some of which work better than others.

Add a timeout for FIN WAIT 2

The obvious workaround is to simply have a timeout for the FIN WAIT 2 state. This is not specified by the RFC, andcould be claimed to be a violation of the RFC, but it is widely recognized as being necessary. The following systemsare known to have a timeout:

• FreeBSD3 versions starting at 2.0 or possibly earlier.

• NetBSD4 version 1.2(?)

3http://www.freebsd.org/4http://www.netbsd.org/

Page 291: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

9.3. CONNECTIONS IN THE FIN WAIT 2 STATE AND APACHE 283

• OpenBSD5 all versions(?)

• BSD/OS6 2.1, with the K210-0277 patch installed.

• Solaris8 as of around version 2.2. The timeout can be tuned by using ndd to modifytcp fin wait 2 flush interval, but the default should be appropriate for most servers and impropertuning can have negative impacts.

• Linux9 2.0.x and earlier(?)

• HP-UX10 10.x defaults to terminating connections in the FIN WAIT 2 state after the normal keepalive timeouts.This does not refer to the persistent connection or HTTP keepalive timeouts, but the SO LINGER socket optionwhich is enabled by Apache. This parameter can be adjusted by using nettune to modify parameters suchas tcp keepstart and tcp keepstop. In later revisions, there is an explicit timer for connections inFIN WAIT 2 that can be modified; contact HP support for details.

• SGI IRIX11 can be patched to support a timeout. For IRIX 5.3, 6.2, and 6.3, use patches 1654, 1703 and 1778respectively. If you have trouble locating these patches, please contact your SGI support channel for help.

• NCR’s MP RAS Unix12 2.xx and 3.xx both have FIN WAIT 2 timeouts. In 2.xx it is non-tunable at 600 seconds,while in 3.xx it defaults to 600 seconds and is calculated based on the tunable "max keep alive probes" (defaultof 8) multiplied by the "keep alive interval" (default 75 seconds).

• Sequent’s ptx/TCP/IP for DYNIX/ptx13 has had a FIN WAIT 2 timeout since around release 4.1 in mid-1994.

The following systems are known to not have a timeout:

• SunOS 4.x14 does not and almost certainly never will have one because it as at the very end of its developmentcycle for Sun. If you have kernel source should be easy to patch.

There is a patch available15 for adding a timeout to the FIN WAIT 2 state; it was originally intended for BSD/OS, butshould be adaptable to most systems using BSD networking code. You need kernel source code to be able to use it.

Compile without using lingering close()

It is possible to compile Apache 1.2 without using the lingering close() function. This will result in thatsection of code being similar to that which was in 1.1. If you do this, be aware that it can cause problems with PUTs,POSTs and persistent connections, especially if the client uses pipelining. That said, it is no worse than on 1.1, andwe understand that keeping your server running is quite important.

To compile without the lingering close() function, add -DNO LINGCLOSE to the end of the EXTRA CFLAGSline in your Configuration file, rerun Configure and rebuild the server.

Use SO LINGER as an alternative to lingering close()

On most systems, there is an option called SO LINGER that can be set with setsockopt(2). It does somethingvery similar to lingering close(), except that it is broken on many systems so that it causes far more problems

5http://www.openbsd.org/6http://www.bsdi.com/7ftp://ftp.bsdi.com/bsdi/patches/patches-2.1/K210-0278http://www.sun.com/9http://www.linux.org/

10http://www.hp.com/11http://www.sgi.com/12http://www.ncr.com/13http://www.sequent.com14http://www.sun.com/15http://www.apache.org/dist/httpd/contrib/patches/1.2/fin wait 2.patch

Page 292: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

284 CHAPTER 9. APACHE MISCELLANEOUS DOCUMENTATION

than lingering close. On some systems, it could possibly work better so it may be worth a try if you have noother alternatives.

To try it, add -DUSE SO LINGER -DNO LINGCLOSE to the end of the EXTRA CFLAGS line in yourConfiguration file, rerun Configure and rebuild the server.

=⇒NOTEAttempting to use SO LINGER and lingering close() at the same time is very likely todo very bad things, so don’t.

Increase the amount of memory used for storing connection state

BSD based networking code: BSD stores network data, such as connection states, in something called an mbuf.When you get so many connections that the kernel does not have enough mbufs to put them all in, your kernelwill likely crash. You can reduce the effects of the problem by increasing the number of mbufs that are available;this will not prevent the problem, it will just make the server go longer before crashing.

The exact way to increase them may depend on your OS; look for some reference to the number of "mbufs" or"mbuf clusters". On many systems, this can be done by adding the line NMBCLUSTERS="n", where n is thenumber of mbuf clusters you want to your kernel config file and rebuilding your kernel.

Disable KeepAlive

If you are unable to do any of the above then you should, as a last resort, disable KeepAlive. Edit your httpd.conf andchange "KeepAlive On" to "KeepAlive Off".

Appendix

Below is a message from Roy Fielding, one of the authors of HTTP/1.1.

Why the lingering close functionality is necessary with HTTP

The need for a server to linger on a socket after a close is noted a couple times in the HTTP specs, but not explained.This explanation is based on discussions between myself, Henrik Frystyk, Robert S. Thau, Dave Raggett, and John C.Mallery in the hallways of MIT while I was at W3C.

If a server closes the input side of the connection while the client is sending data (or is planning to send data), then theserver’s TCP stack will signal an RST (reset) back to the client. Upon receipt of the RST, the client will flush its ownincoming TCP buffer back to the un-ACKed packet indicated by the RST packet argument. If the server has sent amessage, usually an error response, to the client just before the close, and the client receives the RST packet before itsapplication code has read the error message from its incoming TCP buffer and before the server has received the ACKsent by the client upon receipt of that buffer, then the RST will flush the error message before the client applicationhas a chance to see it. The result is that the client is left thinking that the connection failed for no apparent reason.

There are two conditions under which this is likely to occur:

1. sending POST or PUT data without proper authorization

2. sending multiple requests before each response (pipelining) and one of the middle requests resulting in an erroror other break-the-connection result.

The solution in all cases is to send the response, close only the write half of the connection (what shutdown is supposedto do), and continue reading on the socket until it is either closed by the client (signifying it has finally read the

Page 293: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

9.3. CONNECTIONS IN THE FIN WAIT 2 STATE AND APACHE 285

response) or a timeout occurs. That is what the kernel is supposed to do if SO LINGER is set. Unfortunately,SO LINGER has no effect on some systems; on some other systems, it does not have its own timeout and thus theTCP memory segments just pile-up until the next reboot (planned or not).

Please note that simply removing the linger code will not solve the problem – it only moves it to a different and muchharder one to detect.

Page 294: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

286 CHAPTER 9. APACHE MISCELLANEOUS DOCUMENTATION

9.4 Known Problems in Clients

! Warning:This document has not been fully updated to take into account changes made in the 2.0 versionof the Apache HTTP Server. Some of the information may still be relevant, but please use itwith care.

Over time the Apache Group has discovered or been notified of problems with various clients which we have had towork around, or explain. This document describes these problems and the workarounds available. It’s not arranged inany particular order. Some familiarity with the standards is assumed, but not necessary.

For brevity, Navigator will refer to Netscape’s Navigator product (which in later versions was renamed"Communicator" and various other names), and MSIE will refer to Microsoft’s Internet Explorer product. All trade-marks and copyrights belong to their respective companies. We welcome input from the various client authors tocorrect inconsistencies in this paper, or to provide us with exact version numbers where things are broken/fixed.

For reference, RFC194516 defines HTTP/1.0, and RFC206817 defines HTTP/1.1. Apache as of version 1.2 is anHTTP/1.1 server (with an optional HTTP/1.0 proxy).

Various of these workarounds are triggered by environment variables. The admin typically controls which are set, andfor which clients, by using mod browser. Unless otherwise noted all of these workarounds exist in versions 1.2 andlater.

Trailing CRLF on POSTs

This is a legacy issue. The CERN webserver required POST data to have an extra CRLF following it. Thus manyclients send an extra CRLF that is not included in the Content-Length of the request. Apache works around thisproblem by eating any empty lines which appear before a request.

Broken KeepAlive

Various clients have had broken implementations of keepalive (persistent connections). In particular the Windowsversions of Navigator 2.0 get very confused when the server times out an idle connection. The workaround is presentin the default config files:

BrowserMatch Mozilla/2 nokeepalive

Note that this matches some earlier versions of MSIE, which began the practice of calling themselves Mozilla in theiruser-agent strings just like Navigator.

MSIE 4.0b2, which claims to support HTTP/1.1, does not properly support keepalive when it is used on 301 or 302(redirect) responses. Unfortunately Apache’s nokeepalive code prior to 1.2.2 would not work with HTTP/1.1clients. You must apply this patch18 to version 1.2.1. Then add this to your config:

BrowserMatch "MSIE 4\.0b2;" nokeepalive

16ftp://ds.internic.net/rfc/rfc1945.txt17ftp://ds.internic.net/rfc/rfc2068.txt18http://www.apache.org/dist/httpd/patches/apply to 1.2.1/msie 4 0b2 fixes.patch

Page 295: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

9.4. KNOWN PROBLEMS IN CLIENTS 287

Incorrect interpretation of HTTP/1.1 in response

To quote from section 3.1 of RFC1945:

=⇒HTTP uses a "<MAJOR>.<MINOR>" numbering scheme to indicate versions of the pro-tocol. The protocol versioning policy is intended to allow the sender to indicate the formatof a message and its capacity for understanding further HTTP communication, rather than thefeatures obtained via that communication.

Since Apache is an HTTP/1.1 server, it indicates so as part of its response. Many client authors mistakenly treat thispart of the response as an indication of the protocol that the response is in, and then refuse to accept the response.

The first major indication of this problem was with AOL’s proxy servers. When Apache 1.2 went into beta it wasthe first wide-spread HTTP/1.1 server. After some discussion, AOL fixed their proxies. In anticipation of similarproblems, the force-response-1.0 environment variable was added to Apache. When present Apache willindicate "HTTP/1.0" in response to an HTTP/1.0 client, but will not in any other way change the response.

The pre-1.1 Java Development Kit (JDK) that is used in many clients (including Navigator 3.x and MSIE 3.x) exhibitsthis problem. As do some of the early pre-releases of the 1.1 JDK. We think it is fixed in the 1.1 JDK release. In anyevent the workaround:

BrowserMatch Java/1.0 force-response-1.0

BrowserMatch JDK/1.0 force-response-1.0

RealPlayer 4.0 from Progressive Networks also exhibits this problem. However they have fixed it in version 4.01 ofthe player, but version 4.01 uses the same User-Agent as version 4.0. The workaround is still:

BrowserMatch "RealPlayer 4.0" force-response-1.0

Requests use HTTP/1.1 but responses must be in HTTP/1.0

MSIE 4.0b2 has this problem. Its Java VM makes requests in HTTP/1.1 format but the responses must be in HTTP/1.0format (in particular, it does not understand chunked responses). The workaround is to fool Apache into believing therequest came in HTTP/1.0 format.

BrowserMatch "MSIE 4\.0b2;" downgrade-1.0 force-response-1.0

This workaround is available in 1.2.2, and in a patch19 against 1.2.1.

Boundary problems with header parsing

All versions of Navigator from 2.0 through 4.0b2 (and possibly later) have a problem if the trailing CRLF of theresponse header starts at offset 256, 257 or 258 of the response. A BrowserMatch for this would match on nearlyevery hit, so the workaround is enabled automatically on all responses. The workaround implemented detects whenthis condition would occur in a response and adds extra padding to the header to push the trailing CRLF past offset258 of the response.

19http://www.apache.org/dist/httpd/patches/apply to 1.2.1/msie 4 0b2 fixes.patch

Page 296: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

288 CHAPTER 9. APACHE MISCELLANEOUS DOCUMENTATION

Multipart responses and Quoted Boundary Strings

On multipart responses some clients will not accept quotes (") around the boundary string. The MIME standardrecommends that such quotes be used. But the clients were probably written based on one of the examples in RFC2068,which does not include quotes. Apache does not include quotes on its boundary strings to workaround this problem.

Byterange Requests

A byterange request is used when the client wishes to retrieve a portion of an object, not necessarily the entire object.There was a very old draft which included these byteranges in the URL. Old clients such as Navigator 2.0b1 and MSIE3.0 for the MAC exhibit this behaviour, and it will appear in the servers’ access logs as (failed) attempts to retrieve aURL with a trailing ";xxx-yyy". Apache does not attempt to implement this at all.

A subsequent draft of this standard defines a header Request-Range, and a response typemultipart/x-byteranges. The HTTP/1.1 standard includes this draft with a few fixes, and itdefines the header Range and type multipart/byteranges.

Navigator (versions 2 and 3) sends both Range and Request-Range headers (with the same value), but doesnot accept a multipart/byteranges response. The response must be multipart/x-byteranges. As aworkaround, if Apache receives a Request-Range header it considers it "higher priority" than a Range headerand in response uses multipart/x-byteranges.

The Adobe Acrobat Reader plugin makes extensive use of byteranges and prior to version 3.01 supports only themultipart/x-byterange response. Unfortunately there is no clue that it is the plugin making the request. Ifthe plugin is used with Navigator, the above workaround works fine. But if the plugin is used with MSIE 3 (on Win-dows) the workaround won’t work because MSIE 3 doesn’t give the Range-Request clue that Navigator does. Toworkaround this, Apache special cases "MSIE 3" in the User-Agent and serves multipart/x-byteranges.Note that the necessity for this with MSIE 3 is actually due to the Acrobat plugin, not due to the browser.

Netscape Communicator appears to not issue the non-standard Request-Range header. When an Acrobat pluginprior to version 3.01 is used with it, it will not properly understand byteranges. The user must upgrade their Acrobatreader to 3.01.

Set-Cookie header is unmergeable

The HTTP specifications say that it is legal to merge headers with duplicate names into one (separated by commas).Some browsers that support Cookies don’t like merged headers and prefer that each Set-Cookie header is sentseparately. When parsing the headers returned by a CGI, Apache will explicitly avoid merging any Set-Cookieheaders.

Expires headers and GIF89A animations

Navigator versions 2 through 4 will erroneously re-request GIF89A animations on each loop of the animation if thefirst response included an Expires header. This happens regardless of how far in the future the expiry time is set.There is no workaround supplied with Apache, however there are hacks for 1.220 and for 1.321.

POST without Content-Length

In certain situations Navigator 3.01 through 3.03 appear to incorrectly issue a POST without the request body. Thereis no known workaround. It has been fixed in Navigator 3.04, Netscapes provides some information22. There’s also

20http://www.arctic.org/˜dgaudet/patches/apache-1.2-gif89-expires-hack.patch21http://www.arctic.org/˜dgaudet/patches/apache-1.3-gif89-expires-hack.patch22http://help.netscape.com/kb/client/971014-42.html

Page 297: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

9.4. KNOWN PROBLEMS IN CLIENTS 289

some information23 about the actual problem.

JDK 1.2 betas lose parts of responses.

The http client in the JDK1.2beta2 and beta3 will throw away the first part of the response body when both the headersand the first part of the body are sent in the same network packet AND keep-alive’s are being used. If either conditionis not met then it works fine.

See also Bug-ID’s 4124329 and 4125538 at the java developer connection.

If you are seeing this bug yourself, you can add the following BrowserMatch directive to work around it:

BrowserMatch "Java1\.2beta[23]" nokeepalive

We don’t advocate this though since bending over backwards for beta software is usually not a good idea; ideally itgets fixed, new betas or a final release comes out, and no one uses the broken old software anymore. In theory.

Content-Type change is not noticed after reload

Navigator (all versions?) will cache the content-type for an object "forever". Using reload or shift-reload willnot cause Navigator to notice a content-type change. The only work-around is for the user to flush their caches(memory and disk). By way of an example, some folks may be using an old mime.types file which does not map.htm to text/html, in this case Apache will default to sending text/plain. If the user requests the page and itis served as text/plain. After the admin fixes the server, the user will have to flush their caches before the objectwill be shown with the correct text/html type.

MSIE Cookie problem with expiry date in the year 2000

MSIE versions 3.00 and 3.02 (without the Y2K patch) do not handle cookie expiry dates in the year 2000 properly.Years after 2000 and before 2000 work fine. This is fixed in IE4.01 service pack 1, and in the Y2K patch for IE3.02.Users should avoid using expiry dates in the year 2000.

Lynx incorrectly asking for transparent content negotiation

The Lynx browser versions 2.7 and 2.8 send a "negotiate: trans" header in their requests, which is an indication thebrowser supports transparent content negotiation (TCN). However the browser does not support TCN. As of version1.3.4, Apache supports TCN, and this causes problems with these versions of Lynx. As a workaround future versionsof Apache will ignore this header when sent by the Lynx client.

MSIE 4.0 mishandles Vary response header

MSIE 4.0 does not handle a Vary header properly. The Vary header is generated by mod rewrite in apache 1.3. Theresult is an error from MSIE saying it cannot download the requested file. There are more details in PR#411824.

A workaround is to add the following to your server’s configuration files:

BrowserMatch "MSIE 4\.0" force-no-vary

23http://www.arctic.org/˜dgaudet/apache/no-content-length/24http://bugs.apache.org/index/full/4118

Page 298: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

290 CHAPTER 9. APACHE MISCELLANEOUS DOCUMENTATION

(This workaround is only available with releases after 1.3.6 of the Apache Web server.)

Page 299: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

9.5. DESCRIPTORS AND APACHE 291

9.5 Descriptors and Apache

! Warning:This document has not been fully updated to take into account changes made in the 2.0 versionof the Apache HTTP Server. Some of the information may still be relevant, but please use itwith care.

A descriptor, also commonly called a file handle is an object that a program uses to read or write an open file, or opennetwork socket, or a variety of other devices. It is represented by an integer, and you may be familiar with stdin,stdout, and stderr which are descriptors 0, 1, and 2 respectively. Apache needs a descriptor for each log file, plusone for each network socket that it listens on, plus a handful of others. Libraries that Apache uses may also requiredescriptors. Normal programs don’t open up many descriptors at all, and so there are some latent problems that youmay experience should you start running Apache with many descriptors (i.e., with many virtual hosts).

The operating system enforces a limit on the number of descriptors that a program can have open at a time. There aretypically three limits involved here. One is a kernel limitation, depending on your operating system you will eitherbe able to tune the number of descriptors available to higher numbers (this is frequently called FD SETSIZE). Or youmay be stuck with a (relatively) low amount. The second limit is called the hard resource limit, and it is sometimesset by root in an obscure operating system file, but frequently is the same as the kernel limit. The third limit is calledthe soft resource limit. The soft limit is always less than or equal to the hard limit. For example, the hard limit may be1024, but the soft limit only 64. Any user can raise their soft limit up to the hard limit. Root can raise the hard limitup to the system maximum limit. The soft limit is the actual limit that is used when enforcing the maximum numberof files a process can have open.

To summarize:

#open files <= soft limit <= hard limit <= kernel limit

You control the hard and soft limits using the limit (csh) or ulimit (sh) directives. See the respective man pagesfor more information. For example you can probably use ulimit -n unlimited to raise your soft limit up to thehard limit. You should include this command in a shell script which starts your webserver.

Unfortunately, it’s not always this simple. As mentioned above, you will probably run into some system limitationsthat will need to be worked around somehow. Work was done in version 1.2.1 to improve the situation somewhat.Here is a partial list of systems and workarounds (assuming you are using 1.2.1 or later).

BSDI 2.0

Under BSDI 2.0 you can build Apache to support more descriptors by adding -DFD SETSIZE=nnn toEXTRA CFLAGS (where nnn is the number of descriptors you wish to support, keep it less than the hard limit).But it will run into trouble if more than approximately 240 Listen directives are used. This may be cured by rebuildingyour kernel with a higher FD SETSIZE.

FreeBSD 2.2, BSDI 2.1+

Similar to the BSDI 2.0 case, you should define FD SETSIZE and rebuild. But the extra Listen limitation doesn’texist.

Linux

By default Linux has a kernel maximum of 256 open descriptors per process. There are several patches available forthe 2.0.x series which raise this to 1024 and beyond, and you can find them in the "unofficial patches" section of the

Page 300: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

292 CHAPTER 9. APACHE MISCELLANEOUS DOCUMENTATION

Linux Information HQ25. None of these patches are perfect, and an entirely different approach is likely to be takenduring the 2.1.x development. Applying these patches will raise the FD SETSIZE used to compile all programs, andunless you rebuild all your libraries you should avoid running any other program with a soft descriptor limit above256. As of this writing the patches available for increasing the number of descriptors do not take this into account. Ona dedicated webserver you probably won’t run into trouble.

Solaris through 2.5.1

Solaris has a kernel hard limit of 1024 (may be lower in earlier versions). But it has a limitation that files using the stdiolibrary cannot have a descriptor above 255. Apache uses the stdio library for the ErrorLog directive. When you havemore than approximately 110 virtual hosts (with an error log and an access log each) you will need to build Apachewith -DHIGH SLACK LINE=256 added to EXTRA CFLAGS. You will be limited to approximately 240 error logs ifyou do this.

AIX

AIX version 3.2?? appears to have a hard limit of 128 descriptors. End of story. Version 4.1.5 has a hard limit of 2000.

SCO OpenServer

Edit the /etc/conf/cf.d/stune file or use /etc/conf/cf.d/configure choice 7 (User and Group con-figuration) and modify the NOFILES kernel parameter to a suitably higher value. SCO recommends a number between60 and 11000, the default is 110. Relink and reboot, and the new number of descriptors will be available.

Compaq Tru64 UNIX/Digital UNIX/OSF

1. Raise open max soft and open max hard to 4096 in the proc subsystem. Do a man on sysconfig, syscon-figdb, and sysconfigtab.

2. Raise max-vnodes to a large number which is greater than the number of apache processes * 4096 (Setting itto 250,000 should be good for most people). Do a man on sysconfig, sysconfigdb, and sysconfigtab.

3. If you are using Tru64 5.0, 5.0A, or 5.1, define NO SLACK to work around a bug in the OS.CFLAGS="-DNO SLACK" ./configure

Others

If you have details on another operating system, please submit it through our Bug Report Page26.

In addition to the problems described above there are problems with many libraries that Apache uses. The mostcommon example is the bind DNS resolver library that is used by pretty much every unix, which fails if it ends upwith a descriptor above 256. We suspect there are other libraries that similar limitations. So the code as of 1.2.1 takesa defensive stance and tries to save descriptors less than 16 for use while processing each request. This is called thelow slack line.

Note that this shouldn’t waste descriptors. If you really are pushing the limits and Apache can’t get a descriptor above16 when it wants it, it will settle for one below 16.

In extreme situations you may want to lower the low slack line, but you shouldn’t ever need to. For example, loweringit can increase the limits 240 described above under Solaris and BSDI 2.0. But you’ll play a delicate balancing game

25http://www.linuxhq.com/26http://httpd.apache.org/bug report.html

Page 301: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

9.5. DESCRIPTORS AND APACHE 293

with the descriptors needed to serve a request. Should you want to play this game, the compile time parameter isLOW SLACK LINE and there’s a tiny bit of documentation in the header file httpd.h.

Finally, if you suspect that all this slack stuff is causing you problems, you can disable it. Add -DNO SLACK toEXTRA CFLAGS and rebuild. But please report it to our Bug Report Page27 so that we can investigate.

27http://httpd.apache.org/bug report.html

Page 302: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

294 CHAPTER 9. APACHE MISCELLANEOUS DOCUMENTATION

9.6 Relevant Standards

This page documents all the relevant standards that the Apache HTTP Server follows, along with brief descriptions.

In addition to the information listed below, the following resources should be consulted:

• http://purl.org/NET/http-errata28 - HTTP/1.1 Specification Errata

• http://www.rfc-editor.org/errata.html29 - RFC Errata

• http://ftp.ics.uci.edu/pub/ietf/http/#RFC30 - A pre-compiled list of HTTP related RFCs

! NoticeThis document is not yet complete.

HTTP Recommendations

Regardless of what modules are compiled and used, Apache as a basic web server complies with the following IETFrecommendations:

RFC 194531 (Informational) The Hypertext Transfer Protocol (HTTP) is an application-level protocol with the light-ness and speed necessary for distributed, collaborative, hypermedia information systems. This documentsHTTP/1.0.

RFC 261632 (Standards Track) The Hypertext Transfer Protocol (HTTP) is an application-level protocol for dis-tributed, collaborative, hypermedia information systems. This documents HTTP/1.1.

RFC 239633 (Standards Track) A Uniform Resource Identifier (URI) is a compact string of characters for identify-ing an abstract or physical resource.

HTML Recommendations

Regarding the Hypertext Markup Language, Apache complies with the following IETF and W3C recommendations:

RFC 285434 (Informational) This document summarizes the history of HTML development, and defines the"text/html" MIME type by pointing to the relevant W3C recommendations.

HTML 4.01 Specification35 (Errata36) This specification defines the HyperText Markup Language (HTML), thepublishing language of the World Wide Web. This specification defines HTML 4.01, which is a subversion ofHTML 4.

HTML 3.2 Reference Specification37 The HyperText Markup Language (HTML) is a simple markup language usedto create hypertext documents that are portable from one platform to another. HTML documents are SGMLdocuments.

XHTML 1.1 - Module-based XHTML38 (Errata39) This Recommendation defines a new XHTML document typethat is based upon the module framework and modules defined in Modularization of XHTML.

XHTML 1.0 The Extensible HyperText Markup Language (Second Edition)40 (Errata41) This specification de-fines the Second Edition of XHTML 1.0, a reformulation of HTML 4 as an XML 1.0 application, and threeDTDs corresponding to the ones defined by HTML 4.

28http://purl.org/NET/http-errata29http://www.rfc-editor.org/errata.html30http://ftp.ics.uci.edu/pub/ietf/http/#RFC

Page 303: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

9.6. RELEVANT STANDARDS 295

Authentication

Concerning the different methods of authentication, Apache follows the following IETF recommendations:

RFC 261742 (Draft standard) "HTTP/1.0", includes the specification for a Basic Access Authentication scheme.

Language/Country Codes

The following links document ISO and other language and country code information:

ISO 639-243 ISO 639 provides two sets of language codes, one as a two-letter code set (639-1) and another as athree-letter code set (this part of ISO 639) for the representation of names of languages.

ISO 3166-144 These pages document the country names (official short names in English) in alphabetical order asgiven in ISO 3166-1 and the corresponding ISO 3166-1-alpha-2 code elements.

BCP 4745 (Best Current Practice), RFC 306646 This document describes a language tag for use in cases where it isdesired to indicate the language used in an information object, how to register values for use in this languagetag, and a construct for matching such language tags.

RFC 328247 (Standards Track) This document defines a "Content-language:" header, for use in cases where onedesires to indicate the language of something that has RFC 822-like headers, like MIME body parts or Webdocuments, and an "Accept-Language:" header for use in cases where one wishes to indicate one’s preferenceswith regard to language.

Page 304: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

296 CHAPTER 9. APACHE MISCELLANEOUS DOCUMENTATION

Page 305: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

Chapter 10

Apache modules

297

Page 306: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

298 CHAPTER 10. APACHE MODULES

10.1 Terms Used to Describe Modules

This document describes the terms that are used to describe each Apache module (p. 660) .

Description

A brief description of the purpose of the module.

Status

This indicates how tightly bound into the Apache Web server the module is; in other words, you may need to recompilethe server in order to gain access to the module and its functionality. Possible values for this attribute are:

MPM A module with status "MPM" is a Multi-Processing Module (p. 59) . Unlike the other types of modules,Apache must have one and only one MPM in use at any time. This type of module is responsible for basicrequest handling and dispatching.

Base A module labeled as having "Base" status is compiled and loaded into the server by default, and is thereforenormally available unless you have taken steps to remove the module from your configuration.

Extension A module with "Extension" status is not normally compiled and loaded into the server. To enable themodule and its functionality, you may need to change the server build configuration files and re-compile Apache.

Experimental "Experimental" status indicates that the module is available as part of the Apache kit, but you areon your own if you try to use it. The module is being documented for completeness, and is not necessarilysupported.

External Modules which are not included with the base Apache distribution ("third-party modules") may use the"External" status. We are not responsible for, nor do we support such modules.

Source File

This quite simply lists the name of the source file which contains the code for the module. This is also the name usedby the <IFMODULE> directive.

Module Identifier

This is a string which identifies the module for use in the LOADMODULE directive when dynamically loading modules.In particular, it is the name of the external variable of type module in the source file.

Compatibility

If the module was not part of the original Apache version 2 distribution, the version in which it was introduced shouldbe listed here. In addition, if the module is limited to particular platforms, the details will be listed here.

Page 307: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.2. TERMS USED TO DESCRIBE DIRECTIVES 299

10.2 Terms Used to Describe Directives

This document describes the terms that are used to describe each Apache configuration directive (p. 663) .

See also

• Configuration files (p. 19)

Description

A brief description of the purpose of the directive.

Syntax

This indicates the format of the directive as it would appear in a configuration file. This syntax is extremely directive-specific, and is described in detail in the directive’s definition. Generally, the directive name is followed by a seriesof one or more space-separated arguments. If an argument contains a space, the argument must be enclosed in doublequotes. Optional arguments are enclosed in square brackets. Where an argument can take on more than one possiblevalue, the possible values are separated by vertical bars "—". Literal text is presented in the default font, whileargument-types for which substitution is necessary are emphasized. Directives which can take a variable number ofarguments will end in "..." indicating that the last argument is repeated.

Directives use a great number of different argument types. A few common ones are defined below.

URL A complete Uniform Resource Locator including a scheme, hostname, and optional pathname as inhttp://www.example.com/path/to/file.html

URL-path The part of a url which follows the scheme and hostname as in /path/to/file.html. The url-pathrepresents a web-view of a resource, as opposed to a file-system view.

file-path The path to a file in the local file-system beginning with the root directory as in/usr/local/apache/htdocs/path/to/file.html. Unless otherwise specified, a file-path whichdoes not begin with a slash will be treated as relative to the ServerRoot (p. 302) .

directory-path The path to a directory in the local file-system beginning with the root directory as in/usr/local/apache/htdocs/path/to/.

filename The name of a file with no accompanying path information as in file.html.

regex A Perl-compatible regular expression (p. 656) . The directive definition will specify what the regex is matchingagainst.

extension In general, this is the part of the filename which follows the last dot. However, Apache recognizes multiplefilename extensions, so if a filename contains more than one dot, each dot-separated part of the filename follow-ing the first dot is an extension. For example, the filename file.html.en contains two extensions: .htmland .en. For Apache directives, you may specify extensions with or without the leading dot. In addition,extensions are not case sensitive.

MIME-type A method of describing the format of a file which consists of a major format type and a minor formattype, separated by a slash as in text/html.

env-variable The name of an environment variable (p. 60) defined in the Apache configuration process. Note this is notnecessarily the same as an operating system environment variable. See the environment variable documentation(p. 60) for more details.

Page 308: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

300 CHAPTER 10. APACHE MODULES

Default

If the directive has a default value (i.e., if you omit it from your configuration entirely, the Apache Web server willbehave as though you set it to a particular value), it is described here. If there is no default value, this section shouldsay "None". Note that the default listed here is not necessarily the same as the value the directive takes in the defaulthttpd.conf distributed with the server.

Context

This indicates where in the server’s configuration files the directive is legal. It’s a comma-separated list of one or moreof the following values:

server config This means that the directive may be used in the server configuration files (e.g., httpd.conf), butnot within any <VIRTUALHOST> or <DIRECTORY> containers. It is not allowed in .htaccess files at all.

virtual host This context means that the directive may appear inside <VIRTUALHOST> containers in the serverconfiguration files.

directory A directive marked as being valid in this context may be used inside <DIRECTORY>, <LOCATION>,and <FILES> containers in the server configuration files, subject to the restrictions outlined in How Directory,Location and Files sections work (p. 21) .

.htaccess If a directive is valid in this context, it means that it can appear inside per-directory .htaccess files. Itmay not be processed, though depending upon the overrides currently active.

The directive is only allowed within the designated context; if you try to use it elsewhere, you’ll get a configurationerror that will either prevent the server from handling requests in that context correctly, or will keep the server fromoperating at all – i.e., the server won’t even start.

The valid locations for the directive are actually the result of a Boolean OR of all of the listed contexts. In other words,a directive that is marked as being valid in "server config, .htaccess" can be used in the httpd.conffile and in .htaccess files, but not within any <DIRECTORY> or <VIRTUALHOST> containers.

Override

This directive attribute indicates which configuration override must be active in order for the directive to be processedwhen it appears in a .htaccess file. If the directive’s context doesn’t permit it to appear in .htaccess files, thenno context will be listed.

Overrides are activated by the ALLOWOVERRIDE directive, and apply to a particular scope (such as a directory) andall descendants, unless further modified by other ALLOWOVERRIDE directives at lower levels. The documentation forthat directive also lists the possible override names available.

Status

This indicates how tightly bound into the Apache Web server the directive is; in other words, you may need to recom-pile the server with an enhanced set of modules in order to gain access to the directive and its functionality. Possiblevalues for this attribute are:

Core If a directive is listed as having "Core" status, that means it is part of the innermost portions of the Apache Webserver, and is always available.

Page 309: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.2. TERMS USED TO DESCRIBE DIRECTIVES 301

MPM A directive labeled as having "MPM" status is provided by a Multi-Processing Module (p. 59) . This type ofdirective will be available if and only if you are using one of the MPMs listed on the Module line of the directivedefinition.

Base A directive labeled as having "Base" status is supported by one of the standard Apache modules which iscompiled into the server by default, and is therefore normally available unless you’ve taken steps to remove themodule from your configuration.

Extension A directive with "Extension" status is provided by one of the modules included with the Apache serverkit, but the module isn’t normally compiled into the server. To enable the directive and its functionality, you willneed to change the server build configuration files and re-compile Apache.

Experimental "Experimental" status indicates that the directive is available as part of the Apache kit, but you’reon your own if you try to use it. The directive is being documented for completeness, and is not necessarilysupported. The module which provides the directive may or may not be compiled in by default; check the topof the page which describes the directive and its module to see if it remarks on the availability.

Module

This quite simply lists the name of the source module which defines the directive.

Compatibility

If the directive wasn’t part of the original Apache version 2 distribution, the version in which it was introduced shouldbe listed here. In addition, if the directive is available only on certain platforms, it will be noted here.

Page 310: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

302 CHAPTER 10. APACHE MODULES

10.3 Apache Module core

Description: Core Apache HTTP Server features that are always availableStatus: Core

Directives

• AcceptPathInfo

• AccessFileName

• AddDefaultCharset

• AddOutputFilterByType

• AllowEncodedSlashes

• AllowOverride

• AuthName

• AuthType

• CGIMapExtension

• ContentDigest

• DefaultType

• <Directory>

• <DirectoryMatch>

• DocumentRoot

• EnableMMAP

• EnableSendfile

• ErrorDocument

• ErrorLog

• FileETag

• <Files>

• <FilesMatch>

• ForceType

• HostnameLookups

• IdentityCheck

• <IfDefine>

• <IfModule>

• Include

• KeepAlive

• KeepAliveTimeout

• <Limit>

• <LimitExcept>

• LimitInternalRecursion

• LimitRequestBody

• LimitRequestFields

• LimitRequestFieldSize

Page 311: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.3. APACHE MODULE CORE 303

• LimitRequestLine

• LimitXMLRequestBody

• <Location>

• <LocationMatch>

• LogLevel

• MaxKeepAliveRequests

• MaxRanges

• NameVirtualHost

• Options

• Require

• RLimitCPU

• RLimitMEM

• RLimitNPROC

• Satisfy

• ScriptInterpreterSource

• ServerAdmin

• ServerAlias

• ServerName

• ServerPath

• ServerRoot

• ServerSignature

• ServerTokens

• SetHandler

• SetInputFilter

• SetOutputFilter

• TimeOut

• TraceEnable

• UseCanonicalName

• <VirtualHost>

AcceptPathInfo Directive

Description: Resources accept trailing pathname informationSyntax: AcceptPathInfo On|Off|DefaultDefault: AcceptPathInfo DefaultContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: CoreModule: coreCompatibility: Available in Apache 2.0.30 and later

This directive controls whether requests that contain trailing pathname information that follows an actual filename (ornon-existent file in an existing directory) will be accepted or rejected. The trailing pathname information can be madeavailable to scripts in the PATH INFO environment variable.

Page 312: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

304 CHAPTER 10. APACHE MODULES

For example, assume the location /test/ points to a directory that contains only the single file here.html.Then requests for /test/here.html/more and /test/nothere.html/more both collect /more asPATH INFO.

The three possible arguments for the ACCEPTPATHINFO directive are:

Off A request will only be accepted if it maps to a literal path that exists. Therefore a request with trailing pathnameinformation after the true filename such as /test/here.html/more in the above example will return a 404NOT FOUND error.

On A request will be accepted if a leading path component maps to a file that exists. The above example/test/here.html/more will be accepted if /test/here.html maps to a valid file.

Default The treatment of requests with trailing pathname information is determined by the handler (p. 65) respon-sible for the request. The core handler for normal files defaults to rejecting PATH INFO requests. Handlers thatserve scripts, such as cgi-script (p. 399) and isapi-handler (p. 461) , generally accept PATH INFO by default.

The primary purpose of the AcceptPathInfo directive is to allow you to override the handler’s choice of acceptingor rejecting PATH INFO. This override is required, for example, when you use a filter (p. 67) , such as INCLUDES(p. 450) , to generate content based on PATH INFO. The core handler would usually reject the request, so you can usethe following configuration to enable such a script:

<Files "mypaths.shtml">

Options +IncludesSetOutputFilter INCLUDESAcceptPathInfo On

</Files>

AccessFileName Directive

Description: Name of the distributed configuration fileSyntax: AccessFileName filename [filename] ...Default: AccessFileName .htaccessContext: server config, virtual hostStatus: CoreModule: core

While processing a request the server looks for the first existing configuration file from this list of names in everydirectory of the path to the document, if distributed configuration files are enabled for that directory. For example:

AccessFileName .acl

before returning the document /usr/local/web/index.html, the server will read /.acl, /usr/.acl,/usr/local/.acl and /usr/local/web/.acl for directives, unless they have been disabled with

<Directory />

AllowOverride None

</Directory>

See also

• ALLOWOVERRIDE

• Configuration Files (p. 19)• .htaccess Files (p. 197)

Page 313: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.3. APACHE MODULE CORE 305

AddDefaultCharset Directive

Description: Default charset parameter to be added when a response content-type is text/plain ortext/html

Syntax: AddDefaultCharset On|Off|charsetDefault: AddDefaultCharset OffContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: CoreModule: core

This directive specifies a default value for the media type charset parameter (the name of a character encoding) to beadded to a response if and only if the response’s content-type is either text/plain or text/html. This shouldoverride any charset specified in the body of the response via a META element, though the exact behavior is oftendependent on the user’s client configuration. A setting of AddDefaultCharset Off disables this functionality.AddDefaultCharset On enables a default charset of iso-8859-1. Any other value is assumed to be the charsetto be used, which should be one of the IANA registered charset values1 for use in MIME media types. For example:

AddDefaultCharset utf-8

ADDDEFAULTCHARSET should only be used when all of the text resources to which it applies are known to be in thatcharacter encoding and it is too inconvenient to label their charset individually. One such example is to add the charsetparameter to resources containing generated content, such as legacy CGI scripts, that might be vulnerable to cross-sitescripting attacks due to user-provided data being included in the output. Note, however, that a better solution is to justfix (or delete) those scripts, since setting a default charset does not protect users that have enabled the "auto-detectcharacter encoding" feature on their browser.

See also

• ADDCHARSET

AddOutputFilterByType Directive

Description: assigns an output filter to a particular MIME-typeSyntax: AddOutputFilterByType filter[;filter...] MIME-type

[MIME-type] ...Context: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: CoreModule: coreCompatibility: Available in Apache 2.0.33 and later

This directive activates a particular output filter (p. 67) for a request depending on the response MIME-type.

The following example uses the DEFLATE filter, which is provided by MOD DEFLATE. It will compress all output(either static or dynamic) which is labeled as text/html or text/plain before it is sent to the client.

AddOutputFilterByType DEFLATE text/html text/plain

If you want the content to be processed by more than one filter, their names have to be separated by semicolons. It’salso possible to use one ADDOUTPUTFILTERBYTYPE directive for each of these filters.

1http://www.iana.org/assignments/character-sets

Page 314: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

306 CHAPTER 10. APACHE MODULES

The configuration below causes all script output labeled as text/html to be processed at first by the INCLUDESfilter and then by the DEFLATE filter.

<Location /cgi-bin/>

Options IncludesAddOutputFilterByType INCLUDES;DEFLATE text/html

</Location>

! NoteEnabling filters with ADDOUTPUTFILTERBYTYPE may fail partially or completely in somecases. For example, no filters are applied if the MIME-type could not be determined and fallsback to the DEFAULTTYPE setting, even if the DEFAULTTYPE is the same.However, if you want to make sure, that the filters will be applied, assign the content type toa resource explicitly, for example with ADDTYPE or FORCETYPE. Setting the content typewithin a (non-nph) CGI script is also safe.The by-type output filters are never applied on proxy requests.

See also

• ADDOUTPUTFILTER

• SETOUTPUTFILTER

• filters (p. 67)

AllowEncodedSlashes Directive

Description: Determines whether encoded path separators in URLs are allowed to be passed throughSyntax: AllowEncodedSlashes On|OffDefault: AllowEncodedSlashes OffContext: server config, virtual hostStatus: CoreModule: coreCompatibility: Available in Apache 2.0.46 and later

The ALLOWENCODEDSLASHES directive allows URLs which contain encoded path separators (%2F for / and ad-ditionally %5C for \ on according systems) to be used. Normally such URLs are refused with a 404 (Not found)error.

Turning ALLOWENCODEDSLASHES On is mostly useful when used in conjunction with PATH INFO.

=⇒NoteAllowing encoded slashes does not imply decoding. Occurrences of %2F or %5C (only onaccording systems) will be left as such in the otherwise decoded URL string.

See also

• ACCEPTPATHINFO

Page 315: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.3. APACHE MODULE CORE 307

AllowOverride Directive

Description: Types of directives that are allowed in .htaccess filesSyntax: AllowOverride All|None|directive-type [directive-type] ...Default: AllowOverride AllContext: directoryStatus: CoreModule: core

When the server finds an .htaccess file (as specified by ACCESSFILENAME) it needs to know which directivesdeclared in that file can override earlier configuration directives.

=⇒Only available in <Directory> sectionsALLOWOVERRIDE is valid only in <DIRECTORY> sections specified without regular expres-sions, not in <LOCATION>, <DIRECTORYMATCH> or <FILES> sections.

When this directive is set to None, then .htaccess files are completely ignored. In this case, the server will not evenattempt to read .htaccess files in the filesystem.

When this directive is set to All, then any directive which has the .htaccess Context (p. 299) is allowed in .htaccessfiles.

The directive-type can be one of the following groupings of directives.

AuthConfig Allow use of the authorization directives (AUTHDBMGROUPFILE, AUTHDBMUSERFILE, AUTH-GROUPFILE, AUTHNAME, AUTHTYPE, AUTHUSERFILE, REQUIRE, etc.).

FileInfo Allow use of the directives controlling document types (DEFAULTTYPE, ERRORDOCUMENT, FORCETYPE,LANGUAGEPRIORITY, SETHANDLER, SETINPUTFILTER, SETOUTPUTFILTER, and MOD MIME Add* andRemove* directives, etc.).

Indexes Allow use of the directives controlling directory indexing (ADDDESCRIPTION, ADDICON, ADDICON-BYENCODING, ADDICONBYTYPE, DEFAULTICON, DIRECTORYINDEX, FANCYINDEXING, HEADERNAME,INDEXIGNORE, INDEXOPTIONS, READMENAME, etc.).

Limit Allow use of the directives controlling host access (ALLOW, DENY and ORDER).

Options Allow use of the directives controlling specific directory features (OPTIONS and XBITHACK).

Example:

AllowOverride AuthConfig Indexes

In the example above all directives that are neither in the group AuthConfig nor Indexes cause an internal servererror.

See also

• ACCESSFILENAME

• Configuration Files (p. 19)

• .htaccess Files (p. 197)

Page 316: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

308 CHAPTER 10. APACHE MODULES

AuthName Directive

Description: Authorization realm for use in HTTP authenticationSyntax: AuthName auth-domainContext: directory, .htaccessOverride: AuthConfigStatus: CoreModule: core

This directive sets the name of the authorization realm for a directory. This realm is given to the client so that theuser knows which username and password to send. AUTHNAME takes a single argument; if the realm name containsspaces, it must be enclosed in quotation marks. It must be accompanied by AUTHTYPE and REQUIRE directives, anddirectives such as AUTHUSERFILE and AUTHGROUPFILE to work.

For example:

AuthName "Top Secret"

The string provided for the AuthName is what will appear in the password dialog provided by most browsers.

See also

• Authentication, Authorization, and Access Control (p. 181)

AuthType Directive

Description: Type of user authenticationSyntax: AuthType Basic|DigestContext: directory, .htaccessOverride: AuthConfigStatus: CoreModule: core

This directive selects the type of user authentication for a directory. Only Basic and Digest are currently imple-mented.

It must be accompanied by AUTHNAME and REQUIRE directives, and directives such as AUTHUSERFILE and AU-THGROUPFILE to work.

See also

• Authentication, Authorization, and Access Control (p. 181)

CGIMapExtension Directive

Description: Technique for locating the interpreter for CGI scriptsSyntax: CGIMapExtension cgi-path .extensionContext: directory, .htaccessOverride: FileInfoStatus: CoreModule: coreCompatibility: NetWare only

This directive is used to control how Apache finds the interpreter used to run CGI scripts. For example, settingCGIMapExtension sys:\foo.nlm .foo will cause all CGI script files with a .foo extension to be passed tothe FOO interpreter.

Page 317: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.3. APACHE MODULE CORE 309

ContentDigest Directive

Description: Enables the generation of Content-MD5 HTTP Response headersSyntax: ContentDigest On|OffDefault: ContentDigest OffContext: server config, virtual host, directory, .htaccessOverride: OptionsStatus: CoreModule: core

This directive enables the generation of Content-MD5 headers as defined in RFC1864 respectively RFC2068.

MD5 is an algorithm for computing a "message digest" (sometimes called "fingerprint") of arbitrary-length data,with a high degree of confidence that any alterations in the data will be reflected in alterations in the message digest.

The Content-MD5 header provides an end-to-end message integrity check (MIC) of the entity-body. A proxy orclient may check this header for detecting accidental modification of the entity-body in transit. Example header:

Content-MD5: AuLb7Dp1rqtRtxz2m9kRpA==

Note that this can cause performance problems on your server since the message digest is computed on every request(the values are not cached).

Content-MD5 is only sent for documents served by the CORE, and not by any module. For example, SSI documents,output from CGI scripts, and byte range responses do not have this header.

DefaultType Directive

Description: MIME content-type that will be sent if the server cannot determine a type in any other waySyntax: DefaultType MIME-typeDefault: DefaultType text/plainContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: CoreModule: core

There will be times when the server is asked to provide a document whose type cannot be determined by its MIMEtypes mappings.

The server must inform the client of the content-type of the document, so in the event of an unknown type it uses theDefaultType. For example:

DefaultType image/gif

would be appropriate for a directory which contained many GIF images with filenames missing the .gif extension.

Note that unlike FORCETYPE, this directive only provides the default mime-type. All other mime-type definitions,including filename extensions, that might identify the media type will override this default.

Page 318: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

310 CHAPTER 10. APACHE MODULES

Directory Directive

Description: Enclose a group of directives that apply only to the named file-system directory and sub-directories

Syntax: <Directory directory-path> ... </Directory>Context: server config, virtual hostStatus: CoreModule: core

<DIRECTORY> and </Directory> are used to enclose a group of directives that will apply only to the nameddirectory and sub-directories of that directory. Any directive that is allowed in a directory context may be used.Directory-path is either the full path to a directory, or a wild-card string using Unix shell-style matching. In a wild-card string, ? matches any single character, and * matches any sequences of characters. You may also use []character ranges. None of the wildcards match a ‘/’ character, so <Directory /*/public html> will notmatch /home/user/public html, but <Directory /home/*/public html> will match. Example:

<Directory /usr/local/httpd/htdocs>

Options Indexes FollowSymLinks

</Directory>

=⇒Be careful with the directory-path arguments: They have to literally match the filesystem pathwhich Apache uses to access the files. Directives applied to a particular <Directory> willnot apply to files accessed from that same directory via a different path, such as via differentsymbolic links.

Extended regular expressions can also be used, with the addition of the ˜ character. For example:

<Directory ˜ "ˆ/www/.*/[0-9]{3}">

would match directories in /www/ that consisted of three numbers.

If multiple (non-regular expression) <DIRECTORY> sections match the directory (or one of its parents) containing adocument, then the directives are applied in the order of shortest match first, interspersed with the directives from the.htaccess files. For example, with

<Directory />

AllowOverride None

</Directory>

<Directory /home/>

AllowOverride FileInfo

</Directory>

for access to the document /home/web/dir/doc.html the steps are:

• Apply directive AllowOverride None (disabling .htaccess files).

• Apply directive AllowOverride FileInfo (for directory /home).

• Apply any FileInfo directives in /home/.htaccess, /home/web/.htaccess and/home/web/dir/.htaccess in that order.

Page 319: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.3. APACHE MODULE CORE 311

Regular expressions are not considered until after all of the normal sections have been applied. Then all of the regularexpressions are tested in the order they appeared in the configuration file. For example, with

<Directory ˜ abc$>

# ... directives here ...

</Directory>

the regular expression section won’t be considered until after all normal <DIRECTORY>s and .htaccess files havebeen applied. Then the regular expression will match on /home/abc/public html/abc and the corresponding<DIRECTORY> will be applied.

Note that the default Apache access for <Directory /> is Allow from All. This means that Apache willserve any file mapped from an URL. It is recommended that you change this with a block such as

<Directory />

Order Deny,AllowDeny from All

</Directory>

and then override this for directories you want accessible. See the Security Tips (p. 40) page for more details.

The directory sections occur in the httpd.conf file. <DIRECTORY> directives cannot nest, and cannot appear ina <LIMIT> or <LIMITEXCEPT> section.

See also

• How <Directory>, <Location> and <Files> sections work (p. 21) for an explanation of how these differentsections are combined when a request is received

DirectoryMatch Directive

Description: Enclose directives that apply to file-system directories matching a regular expression and theirsubdirectories

Syntax: <DirectoryMatch regex> ... </DirectoryMatch>Context: server config, virtual hostStatus: CoreModule: core

<DIRECTORYMATCH> and </DirectoryMatch> are used to enclose a group of directives which will applyonly to the named directory and sub-directories of that directory, the same as <DIRECTORY>. However, it takes asan argument a regular expression. For example:

<DirectoryMatch "ˆ/www/(.+/)?[0-9]{3}">

would match directories in /www/ that consisted of three numbers.

See also

• <DIRECTORY> for a description of how regular expressions are mixed in with normal <DIRECTORY>s

• How <Directory>, <Location> and <Files> sections work (p. 21) for an explanation of how these differentsections are combined when a request is received

Page 320: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

312 CHAPTER 10. APACHE MODULES

DocumentRoot Directive

Description: Directory that forms the main document tree visible from the webSyntax: DocumentRoot directory-pathDefault: DocumentRoot /usr/local/apache/htdocsContext: server config, virtual hostStatus: CoreModule: core

This directive sets the directory from which httpd will serve files. Unless matched by a directive like ALIAS, theserver appends the path from the requested URL to the document root to make the path to the document. Example:

DocumentRoot /usr/web

then an access to http://www.my.host.com/index.html refers to /usr/web/index.html.

The DOCUMENTROOT should be specified without a trailing slash.

See also

• Mapping URLs to Filesystem Location (p. 36)

EnableMMAP Directive

Description: Use memory-mapping to read files during deliverySyntax: EnableMMAP On|OffDefault: EnableMMAP OnContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: CoreModule: core

This directive controls whether the httpd may use memory-mapping if it needs to read the contents of a file duringdelivery. By default, when the handling of a request requires access to the data within a file – for example, whendelivering a server-parsed file using MOD INCLUDE – Apache memory-maps the file if the OS supports it.

This memory-mapping sometimes yields a performance improvement. But in some environments, it is better to disablethe memory-mapping to prevent operational problems:

• On some multiprocessor systems, memory-mapping can reduce the performance of the httpd.

• With an NFS-mounted DOCUMENTROOT, the httpd may crash due to a segmentation fault if a file is deletedor truncated while the httpd has it memory-mapped.

For server configurations that are vulnerable to these problems, you should disable memory-mapping of delivered filesby specifying:

EnableMMAP Off

For NFS mounted files, this feature may be disabled explicitly for the offending files by specifying:

<Directory "/path-to-nfs-files">EnableMMAP Off

</Directory>

Page 321: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.3. APACHE MODULE CORE 313

EnableSendfile Directive

Description: Use the kernel sendfile support to deliver files to the clientSyntax: EnableSendfile On|OffDefault: EnableSendfile OnContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: CoreModule: coreCompatibility: Available in version 2.0.44 and later

This directive controls whether httpd may use the sendfile support from the kernel to transmit file contents to theclient. By default, when the handling of a request requires no access to the data within a file – for example, whendelivering a static file – Apache uses sendfile to deliver the file contents without ever reading the file if the OS supportsit.

This sendfile mechanism avoids separate read and send operations, and buffer allocations. But on some platforms orwithin some filesystems, it is better to disable this feature to avoid operational problems:

• Some platforms may have broken sendfile support that the build system did not detect, especially if the binarieswere built on another box and moved to such a machine with broken sendfile support.

• On Linux the use of sendfile triggers TCP-checksum offloading bugs on certain networking cards when usingIPv6.

• With a network-mounted DOCUMENTROOT (e.g., NFS or SMB), the kernel may be unable to serve the networkfile through its own cache.

For server configurations that are vulnerable to these problems, you should disable this feature by specifying:

EnableSendfile Off

For NFS or SMB mounted files, this feature may be disabled explicitly for the offending files by specifying:

<Directory "/path-to-nfs-files">EnableSendfile Off

</Directory>

ErrorDocument Directive

Description: What the server will return to the client in case of an errorSyntax: ErrorDocument error-code documentContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: CoreModule: coreCompatibility: Quoting syntax for text messages is different in Apache 2.0

In the event of a problem or error, Apache can be configured to do one of four things,

1. output a simple hardcoded error message

2. output a customized message

Page 322: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

314 CHAPTER 10. APACHE MODULES

3. redirect to a local URL-path to handle the problem/error

4. redirect to an external URL to handle the problem/error

The first option is the default, while options 2-4 are configured using the ERRORDOCUMENT directive, which isfollowed by the HTTP response code and a URL or a message. Apache will sometimes offer additional informationregarding the problem/error.

URLs can begin with a slash (/) for local web-paths (relative to the DOCUMENTROOT), or be a full URL which theclient can resolve. Alternatively, a message can be provided to be displayed by the browser. Examples:

ErrorDocument 500 http://foo.example.com/cgi-bin/testerErrorDocument 404 /cgi-bin/bad urls.plErrorDocument 401 /subscription info.html

ErrorDocument 403 "Sorry can’t allow you access today"

Additionally, the special value default can be used to specify Apache’s simple hardcoded message. While notrequired under normal circumstances, default will restore Apache’s simple hardcoded message for configurationsthat would otherwise inherit an existing ERRORDOCUMENT.

ErrorDocument 404 /cgi-bin/bad urls.pl

<Directory /web/docs>

ErrorDocument 404 default

</Directory>

Note that when you specify an ERRORDOCUMENT that points to a remote URL (ie. anything with a method suchas http in front of it), Apache will send a redirect to the client to tell it where to find the document, even if thedocument ends up being on the same server. This has several implications, the most important being that the clientwill not receive the original error status code, but instead will receive a redirect status code. This in turn can confuseweb robots and other clients which try to determine if a URL is valid using the status code. In addition, if you use aremote URL in an ErrorDocument 401, the client will not know to prompt the user for a password since it willnot receive the 401 status code. Therefore, if you use an ErrorDocument 401 directive then it must refer to alocal document.

Microsoft Internet Explorer (MSIE) will by default ignore server-generated error messages when they are "too small"and substitute its own "friendly" error messages. The size threshold varies depending on the type of error, but ingeneral, if you make your error document greater than 512 bytes, then MSIE will show the server-generated errorrather than masking it. More information is available in Microsoft Knowledge Base article Q2948072.

Although most error messages can be overriden, there are certain circumstances where the internal messages are usedregardless of the setting of ERRORDOCUMENT. In particular, if a malformed request is detected, normal requestprocessing will be immediately halted and the internal error message returned. This is necessary to guard againstsecurity problems caused by bad requests.

If you are using mod proxy, you may wish to enable PROXYERROROVERRIDE so that you can provide custom errormessages on behalf of your Origin servers. If you don’t enable ProxyErrorOverride, Apache will not generate customerror documents for proxied content.

Prior to version 2.0, messages were indicated by prefixing them with a single unmatched double quote character.

See also

• documentation of customizable responses (p. 54)

2http://support.microsoft.com/default.aspx?scid=kb;en-us;Q294807

Page 323: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.3. APACHE MODULE CORE 315

ErrorLog Directive

Description: Location where the server will log errorsSyntax: ErrorLog file-path|syslog[:facility]Default: ErrorLog logs/error log (Unix) ErrorLog logs/error.log (Windows

and OS/2)Context: server config, virtual hostStatus: CoreModule: core

The ERRORLOG directive sets the name of the file to which the server will log any errors it encounters. If the file-pathis not absolute then it is assumed to be relative to the SERVERROOT.

ExampleErrorLog /var/log/httpd/error log

If the file-path begins with a pipe (—) then it is assumed to be a command to spawn to handle the error log.

ExampleErrorLog "|/usr/local/bin/httpd errors"

Using syslog instead of a filename enables logging via syslogd(8) if the system supports it. The default is to usesyslog facility local7, but you can override this by using the syslog:facility syntax where facility can be oneof the names usually documented in syslog(1).

ExampleErrorLog syslog:user

SECURITY: See the security tips (p. 40) document for details on why your security could be compromised if thedirectory where log files are stored is writable by anyone other than the user that starts the server.

! NoteWhen entering a file path on non-Unix platforms, care should be taken to make sure that onlyforward slashed are used even though the platform may allow the use of back slashes. Ingeneral it is a good idea to always use forward slashes throughout the configuration files.

See also

• LOGLEVEL

• Apache Log Files (p. 29)

FileETag Directive

Description: File attributes used to create the ETag HTTP response headerSyntax: FileETag component ...Default: FileETag INode MTime SizeContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: CoreModule: core

Page 324: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

316 CHAPTER 10. APACHE MODULES

The FILEETAG directive configures the file attributes that are used to create the ETag (entity tag) response headerfield when the document is based on a file. (The ETag value is used in cache management to save network bandwidth.)In Apache 1.3.22 and earlier, the ETag value was always formed from the file’s inode, size, and last-modified time(mtime). The FILEETAG directive allows you to choose which of these – if any – should be used. The recognizedkeywords are:

INode The file’s i-node number will be included in the calculation

MTime The date and time the file was last modified will be included

Size The number of bytes in the file will be included

All All available fields will be used. This is equivalent to:

FileETag INode MTime Size

None If a document is file-based, no ETag field will be included in the response

The INode, MTime, and Size keywords may be prefixed with either + or -, which allow changes to be made tothe default setting inherited from a broader scope. Any keyword appearing without such a prefix immediately andcompletely cancels the inherited setting.

If a directory’s configuration includes FileETagINodeMTimeSize, and a subdirectory’s includesFileETag-INode, the setting for that subdirectory (which will be inherited by any sub-subdirectories that don’toverride it) will be equivalent to FileETagMTimeSize.

Files Directive

Description: Contains directives that apply to matched filenamesSyntax: <Files filename> ... </Files>Context: server config, virtual host, directory, .htaccessOverride: AllStatus: CoreModule: core

The <FILES> directive limits the scope of the enclosed directives by filename. It is comparable to the <DIREC-TORY> and <LOCATION> directives. It should be matched with a </Files> directive. The directives givenwithin this section will be applied to any object with a basename (last component of filename) matching the specifiedfilename. <FILES> sections are processed in the order they appear in the configuration file, after the <DIRECTORY>sections and .htaccess files are read, but before <LOCATION> sections. Note that <FILES> can be nested inside<DIRECTORY> sections to restrict the portion of the filesystem they apply to.

The filename argument should include a filename, or a wild-card string, where ? matches any single character, and* matches any sequences of characters. Extended regular expressions can also be used, with the addition of the ˜character. For example:

<Files ˜ "\.(gif|jpe?g|png)$">

would match most common Internet graphics formats. <FILESMATCH> is preferred, however.

Note that unlike <DIRECTORY> and <LOCATION> sections, <FILES> sections can be used inside .htaccessfiles. This allows users to control access to their own files, at a file-by-file level.

See also

• How <Directory>, <Location> and <Files> sections work (p. 21) for an explanation of how these differentsections are combined when a request is received

Page 325: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.3. APACHE MODULE CORE 317

FilesMatch Directive

Description: Contains directives that apply to regular-expression matched filenamesSyntax: <FilesMatch regex> ... </FilesMatch>Context: server config, virtual host, directory, .htaccessOverride: AllStatus: CoreModule: core

The <FILESMATCH> directive limits the scope of the enclosed directives by filename, just as the <FILES> directivedoes. However, it accepts a regular expression. For example:

<FilesMatch "\.(gif|jpe?g|png)$">

would match most common Internet graphics formats.

See also

• How <Directory>, <Location> and <Files> sections work (p. 21) for an explanation of how these differentsections are combined when a request is received

ForceType Directive

Description: Forces all matching files to be served with the specified MIME content-typeSyntax: ForceType MIME-type|NoneContext: directory, .htaccessOverride: FileInfoStatus: CoreModule: coreCompatibility: Moved to the core in Apache 2.0

When placed into an .htaccess file or a <DIRECTORY>, or <LOCATION> or <FILES> section, this directiveforces all matching files to be served with the content type identification given by MIME-type. For example, if youhad a directory full of GIF files, but did not want to label them all with .gif, you might want to use:

ForceType image/gif

Note that unlike DEFAULTTYPE, this directive overrides all mime-type associations, including filename extensions,that might identify the media type.

You can override any FORCETYPE setting by using the value of None:

# force all files to be image/gif:<Location /images>

ForceType image/gif

</Location>

# but normal mime-type associations here:<Location /images/mixed>

ForceType None

</Location>

Page 326: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

318 CHAPTER 10. APACHE MODULES

HostnameLookups Directive

Description: Enables DNS lookups on client IP addressesSyntax: HostnameLookups On|Off|DoubleDefault: HostnameLookups OffContext: server config, virtual host, directoryStatus: CoreModule: core

This directive enables DNS lookups so that host names can be logged (and passed to CGIs/SSIs in REMOTE HOST).The value Double refers to doing double-reverse DNS lookup. That is, after a reverse lookup is performed, a forwardlookup is then performed on that result. At least one of the IP addresses in the forward lookup must match the originaladdress. (In "tcpwrappers" terminology this is called PARANOID.)

Regardless of the setting, when MOD ACCESS is used for controlling access by hostname, a double reverse lookup willbe performed. This is necessary for security. Note that the result of this double-reverse isn’t generally available unlessyou set HostnameLookups Double. For example, if only HostnameLookups On and a request is made to anobject that is protected by hostname restrictions, regardless of whether the double-reverse fails or not, CGIs will stillbe passed the single-reverse result in REMOTE HOST.

The default is Off in order to save the network traffic for those sites that don’t truly need the reverse lookups done.It is also better for the end users because they don’t have to suffer the extra latency that a lookup entails. Heavilyloaded sites should leave this directive Off, since DNS lookups can take considerable amounts of time. The utilitylogresolve, compiled by default to the bin subdirectory of your installation directory, can be used to look up hostnames from logged IP addresses offline.

IdentityCheck Directive

Description: Enables logging of the RFC1413 identity of the remote userSyntax: IdentityCheck On|OffDefault: IdentityCheck OffContext: server config, virtual host, directoryStatus: CoreModule: core

This directive enables RFC1413-compliant logging of the remote user name for each connection, where the clientmachine runs identd or something similar. This information is logged in the access log.

The information should not be trusted in any way except for rudimentary usage tracking.

Note that this can cause serious latency problems accessing your server since every request requires one of theselookups to be performed. When firewalls are involved each lookup might possibly fail and add 30 seconds of latencyto each hit. So in general this is not very useful on public servers accessible from the Internet.

IfDefine Directive

Description: Encloses directives that will be processed only if a test is true at startupSyntax: <IfDefine [!]parameter-name> ... </IfDefine>Context: server config, virtual host, directory, .htaccessOverride: AllStatus: CoreModule: core

The <IfDefine test>...</IfDefine> section is used to mark directives that are conditional. The direc-tives within an <IFDEFINE> section are only processed if the test is true. If test is false, everything between the startand end markers is ignored.

Page 327: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.3. APACHE MODULE CORE 319

The test in the <IFDEFINE> section directive can be one of two forms:

• parameter-name

• !parameter-name

In the former case, the directives between the start and end markers are only processed if the parameter namedparameter-name is defined. The second format reverses the test, and only processes the directives if parameter-nameis not defined.

The parameter-name argument is a define as given on the httpd command line via -Dparameter- , at the timethe server was started.

<IFDEFINE> sections are nest-able, which can be used to implement simple multiple-parameter tests. Example:

httpd -DReverseProxy ...

# httpd.conf<IfDefine ReverseProxy>

LoadModule rewrite module modules/mod rewrite.soLoadModule proxy module modules/libproxy.so

</IfDefine>

IfModule Directive

Description: Encloses directives that are processed conditional on the presence or absence of a specificmodule

Syntax: <IfModule [!]module-name> ... </IfModule>Context: server config, virtual host, directory, .htaccessOverride: AllStatus: CoreModule: core

The <IfModule test>...</IfModule> section is used to mark directives that are conditional on the pres-ence of a specific module. The directives within an <IFMODULE> section are only processed if the test is true. If testis false, everything between the start and end markers is ignored.

The test in the <IFMODULE> section directive can be one of two forms:

• module name

• !module name

In the former case, the directives between the start and end markers are only processed if the module named modulename is included in Apache – either compiled in or dynamically loaded using LOADMODULE. The second formatreverses the test, and only processes the directives if module name is not included.

The module name argument is the file name of the module, at the time it was compiled. For example,mod rewrite.c. If a module consists of several source files, use the name of the file containing the stringSTANDARD20 MODULE STUFF.

<IFMODULE> sections are nest-able, which can be used to implement simple multiple-module tests.

=⇒This section should only be used if you need to have one configuration file that works whetheror not a specific module is available. In normal operation, directives need not be placed in<IFMODULE> sections.

Page 328: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

320 CHAPTER 10. APACHE MODULES

Include Directive

Description: Includes other configuration files from within the server configuration filesSyntax: Include file-path|directory-pathContext: server config, virtual host, directoryStatus: CoreModule: coreCompatibility: Wildcard matching available in 2.0.41 and later

This directive allows inclusion of other configuration files from within the server configuration files.

Shell-style (fnmatch()) wildcard characters can be used to include several files at once, in alphabetical order. Inaddition, if INCLUDE points to a directory, rather than a file, Apache will read all files in that directory and anysubdirectory. But including entire directories is not recommended, because it is easy to accidentally leave temporaryfiles in a directory that can cause httpd to fail.

The file path specified may be an absolute path, or may be relative to the SERVERROOT directory.

Examples:

Include /usr/local/apache2/conf/ssl.conf

Include /usr/local/apache2/conf/vhosts/*.conf

Or, providing paths relative to your SERVERROOT directory:

Include conf/ssl.conf

Include conf/vhosts/*.conf

See also

• apachectl

KeepAlive Directive

Description: Enables HTTP persistent connectionsSyntax: KeepAlive On|OffDefault: KeepAlive OnContext: server config, virtual hostStatus: CoreModule: core

The Keep-Alive extension to HTTP/1.0 and the persistent connection feature of HTTP/1.1 provide long-lived HTTPsessions which allow multiple requests to be sent over the same TCP connection. In some cases this has been shownto result in an almost 50% speedup in latency times for HTML documents with many images. To enable Keep-Aliveconnections, set KeepAlive On.

For HTTP/1.0 clients, Keep-Alive connections will only be used if they are specifically requested by a client. Inaddition, a Keep-Alive connection with an HTTP/1.0 client can only be used when the length of the content is knownin advance. This implies that dynamic content such as CGI output, SSI pages, and server-generated directory listingswill generally not use Keep-Alive connections to HTTP/1.0 clients. For HTTP/1.1 clients, persistent connections arethe default unless otherwise specified. If the client requests it, chunked encoding will be used in order to send contentof unknown length over persistent connections.

See also

• MAXKEEPALIVEREQUESTS

Page 329: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.3. APACHE MODULE CORE 321

KeepAliveTimeout Directive

Description: Amount of time the server will wait for subsequent requests on a persistent connectionSyntax: KeepAliveTimeout secondsDefault: KeepAliveTimeout 15Context: server config, virtual hostStatus: CoreModule: core

The number of seconds Apache will wait for a subsequent request before closing the connection. Once a request hasbeen received, the timeout value specified by the TIMEOUT directive applies.

Setting KEEPALIVETIMEOUT to a high value may cause performance problems in heavily loaded servers. The higherthe timeout, the more server processes will be kept occupied waiting on connections with idle clients.

In a name-based virtual host context, the value of the first defined virtual host (the default host) in a set of NAMEVIR-TUALHOST will be used. The other values will be ignored.

Limit Directive

Description: Restrict enclosed access controls to only certain HTTP methodsSyntax: <Limit method [method] ... > ... </Limit>Context: server config, virtual host, directory, .htaccessOverride: AllStatus: CoreModule: core

Access controls are normally effective for all access methods, and this is the usual desired behavior. In the generalcase, access control directives should not be placed within a <LIMIT> section.

The purpose of the <LIMIT> directive is to restrict the effect of the access controls to the nominated HTTP methods.For all other methods, the access restrictions that are enclosed in the <LIMIT> bracket will have no effect. Thefollowing example applies the access control only to the methods POST, PUT, and DELETE, leaving all other methodsunprotected:

<Limit POST PUT DELETE>

Require valid-user

</Limit>

The method names listed can be one or more of: GET, POST, PUT, DELETE, CONNECT, OPTIONS, PATCH,PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, and UNLOCK. The method name is case-sensitive. IfGET is used it will also restrict HEAD requests. The TRACE method cannot be limited.

! A <LIMITEXCEPT> section should always be used in preference to a <LIMIT> sectionwhen restricting access, since a <LIMITEXCEPT> section provides protection against arbi-trary methods.

Page 330: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

322 CHAPTER 10. APACHE MODULES

LimitExcept Directive

Description: Restrict access controls to all HTTP methods except the named onesSyntax: <LimitExcept method [method] ... > ... </LimitExcept>Context: server config, virtual host, directory, .htaccessOverride: AllStatus: CoreModule: core

<LIMITEXCEPT> and </LimitExcept> are used to enclose a group of access control directives which will thenapply to any HTTP access method not listed in the arguments; i.e., it is the opposite of a <LIMIT> section and can beused to control both standard and nonstandard/unrecognized methods. See the documentation for <LIMIT> for moredetails.

For example:

<LimitExcept POST GET>

Require valid-user

</LimitExcept>

LimitInternalRecursion Directive

Description: Determine maximum number of internal redirects and nested subrequestsSyntax: LimitInternalRecursion number [number]Default: LimitInternalRecursion 10Context: server config, virtual hostStatus: CoreModule: coreCompatibility: Available in Apache 2.0.47 and later

An internal redirect happens, for example, when using the ACTION directive, which internally redirects the originalrequest to a CGI script. A subrequest is Apache’s mechanism to find out what would happen for some URI if it wererequested. For example, MOD DIR uses subrequests to look for the files listed in the DIRECTORYINDEX directive.

LIMITINTERNALRECURSION prevents the server from crashing when entering an infinite loop of internal redirects orsubrequests. Such loops are usually caused by misconfigurations.

The directive stores two different limits, which are evaluated on per-request basis. The first number is the maximumnumber of internal redirects, that may follow each other. The second number determines, how deep subrequests maybe nested. If you specify only one number, it will be assigned to both limits.

ExampleLimitInternalRecursion 5

LimitRequestBody Directive

Description: Restricts the total size of the HTTP request body sent from the clientSyntax: LimitRequestBody bytesDefault: LimitRequestBody 0Context: server config, virtual host, directory, .htaccessOverride: AllStatus: CoreModule: core

Page 331: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.3. APACHE MODULE CORE 323

This directive specifies the number of bytes from 0 (meaning unlimited) to 2147483647 (2GB) that are allowed in arequest body.

The LIMITREQUESTBODY directive allows the user to set a limit on the allowed size of an HTTP request messagebody within the context in which the directive is given (server, per-directory, per-file or per-location). If the clientrequest exceeds that limit, the server will return an error response instead of servicing the request. The size of anormal request message body will vary greatly depending on the nature of the resource and the methods allowed onthat resource. CGI scripts typically use the message body for retrieving form information. Implementations of the PUTmethod will require a value at least as large as any representation that the server wishes to accept for that resource.

This directive gives the server administrator greater control over abnormal client request behavior, which may beuseful for avoiding some forms of denial-of-service attacks.

If, for example, you are permitting file upload to a particular location, and wish to limit the size of the uploaded file to100K, you might use the following directive:

LimitRequestBody 102400

LimitRequestFields Directive

Description: Limits the number of HTTP request header fields that will be accepted from the clientSyntax: LimitRequestFields numberDefault: LimitRequestFields 100Context: server config, virtual hostStatus: CoreModule: core

Number is an integer from 0 (meaning unlimited) to 32767. The default value is defined by the compile-time constantDEFAULT LIMIT REQUEST FIELDS (100 as distributed).

The LIMITREQUESTFIELDS directive allows the server administrator to modify the limit on the number of requestheader fields allowed in an HTTP request. A server needs this value to be larger than the number of fields that a normalclient request might include. The number of request header fields used by a client rarely exceeds 20, but this may varyamong different client implementations, often depending upon the extent to which a user has configured their browserto support detailed content negotiation. Optional HTTP extensions are often expressed using request header fields.

This directive gives the server administrator greater control over abnormal client request behavior, which may beuseful for avoiding some forms of denial-of-service attacks. The value should be increased if normal clients see anerror response from the server that indicates too many fields were sent in the request.

For example:

LimitRequestFields 50

! WarningWhen name-based virtual hosting is used, the value for this directive is taken from the default(first-listed) virtual host for the NAMEVIRTUALHOST the connection was mapped to.

Page 332: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

324 CHAPTER 10. APACHE MODULES

LimitRequestFieldSize Directive

Description: Limits the size of the HTTP request header allowed from the clientSyntax: LimitRequestFieldsize bytesDefault: LimitRequestFieldsize 8190Context: server config, virtual hostStatus: CoreModule: core

This directive specifies the number of bytes that will be allowed in an HTTP request header.

The LIMITREQUESTFIELDSIZE directive allows the server administrator to reduce or increase the limit on the allowedsize of an HTTP request header field. A server needs this value to be large enough to hold any one header fieldfrom a normal client request. The size of a normal request header field will vary greatly among different clientimplementations, often depending upon the extent to which a user has configured their browser to support detailedcontent negotiation. SPNEGO authentication headers can be up to 12392 bytes.

This directive gives the server administrator greater control over abnormal client request behavior, which may beuseful for avoiding some forms of denial-of-service attacks.

For example:

LimitRequestFieldSize 4094

=⇒Under normal conditions, the value should not be changed from the default.

=⇒Apache 2.0.53 or higher is required for increasing the limit above the compiled-in value ofDEFAULT LIMIT REQUEST FIELDSIZE (8190 as distributed).

! WarningWhen name-based virtual hosting is used, the value for this directive is taken from the default(first-listed) virtual host for the NAMEVIRTUALHOST the connection was mapped to.

LimitRequestLine Directive

Description: Limit the size of the HTTP request line that will be accepted from the clientSyntax: LimitRequestLine bytesDefault: LimitRequestLine 8190Context: server config, virtual hostStatus: CoreModule: core

This directive sets the number of bytes from 0 to the value of the compile-time constantDEFAULT LIMIT REQUEST LINE (8190 as distributed) that will be allowed on the HTTP request-line.

The LIMITREQUESTLINE directive allows the server administrator to reduce the limit on the allowed size of a client’sHTTP request-line below the normal input buffer size compiled with the server. Since the request-line consists of theHTTP method, URI, and protocol version, the LIMITREQUESTLINE directive places a restriction on the length of arequest-URI allowed for a request on the server. A server needs this value to be large enough to hold any of its resourcenames, including any information that might be passed in the query part of a GET request.

This directive gives the server administrator greater control over abnormal client request behavior, which may beuseful for avoiding some forms of denial-of-service attacks.

For example:

Page 333: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.3. APACHE MODULE CORE 325

LimitRequestLine 4094

=⇒Under normal conditions, the value should not be changed from the default.

! WarningWhen name-based virtual hosting is used, the value for this directive is taken from the default(first-listed) virtual host for the NAMEVIRTUALHOST the connection was mapped to.

LimitXMLRequestBody Directive

Description: Limits the size of an XML-based request bodySyntax: LimitXMLRequestBody bytesDefault: LimitXMLRequestBody 1000000Context: server config, virtual host, directory, .htaccessOverride: AllStatus: CoreModule: core

Limit (in bytes) on maximum size of an XML-based request body. A value of 0 will disable any checking.

Example:

LimitXMLRequestBody 0

Location Directive

Description: Applies the enclosed directives only to matching URLsSyntax: <Location URL-path|URL> ... </Location>Context: server config, virtual hostStatus: CoreModule: core

The <LOCATION> directive limits the scope of the enclosed directives by URL. It is similar to the <DIRECTORY>directive, and starts a subsection which is terminated with a </Location> directive. <LOCATION> sections areprocessed in the order they appear in the configuration file, after the <DIRECTORY> sections and .htaccess filesare read, and after the <FILES> sections.

<LOCATION> sections operate completely outside the filesystem. This has several consequences. Most importantly,<LOCATION> directives should not be used to control access to filesystem locations. Since several different URLsmay map to the same filesystem location, such access controls may by circumvented.

=⇒When to use <LOCATION>

Use <LOCATION> to apply directives to content that lives outside the filesystem. For contentthat lives in the filesystem, use <DIRECTORY> and <FILES>. An exception is <Location/>, which is an easy way to apply a configuration to the entire server.

For all origin (non-proxy) requests, the URL to be matched is a URL-path of the form /path/. No scheme,hostname, port, or query string may be included. For proxy requests, the URL to be matched is of the formscheme://servername/path, and you must include the prefix.

The URL may use wildcards. In a wild-card string, ? matches any single character, and * matches any sequences ofcharacters.

Page 334: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

326 CHAPTER 10. APACHE MODULES

Extended regular expressions can also be used, with the addition of the ˜ character. For example:

<Location ˜ "/(extra|special)/data">

would match URLs that contained the substring /extra/data or /special/data. The directive <LOCATION-MATCH> behaves identical to the regex version of <LOCATION>.

The <LOCATION> functionality is especially useful when combined with the SETHANDLER directive. For example,to enable status requests, but allow them only from browsers at foo.com, you might use:

<Location /status>

SetHandler server-statusOrder Deny,AllowDeny from allAllow from .foo.com

</Location>

=⇒Note about / (slash)The slash character has special meaning depending on where in a URL it appears. Peoplemay be used to its behavior in the filesystem where multiple adjacent slashes are frequentlycollapsed to a single slash (i.e., /home///foo is the same as /home/foo). In URL-spacethis is not necessarily true. The <LOCATIONMATCH> directive and the regex version of<LOCATION> require you to explicitly specify multiple slashes if that is your intention.For example, <LocationMatch ˆ/abc> would match the request URL /abc but not therequest URL //abc. The (non-regex) <LOCATION> directive behaves similarly when usedfor proxy requests. But when (non-regex) <LOCATION> is used for non-proxy requests it willimplicitly match multiple slashes with a single slash. For example, if you specify <Location/abc/def> and the request is to /abc//def then it will match.

See also

• How <Directory>, <Location> and <Files> sections work (p. 21) for an explanation of how these differentsections are combined when a request is received

LocationMatch Directive

Description: Applies the enclosed directives only to regular-expression matching URLsSyntax: <LocationMatch regex> ... </LocationMatch>Context: server config, virtual hostStatus: CoreModule: core

The <LOCATIONMATCH> directive limits the scope of the enclosed directives by URL, in an identical manner to<LOCATION>. However, it takes a regular expression as an argument instead of a simple string. For example:

<LocationMatch "/(extra|special)/data">

would match URLs that contained the substring /extra/data or /special/data.

See also

• How <Directory>, <Location> and <Files> sections work (p. 21) for an explanation of how these differentsections are combined when a request is received

Page 335: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.3. APACHE MODULE CORE 327

LogLevel Directive

Description: Controls the verbosity of the ErrorLogSyntax: LogLevel levelDefault: LogLevel warnContext: server config, virtual hostStatus: CoreModule: core

LOGLEVEL adjusts the verbosity of the messages recorded in the error logs (see ERRORLOG directive). The followinglevels are available, in order of decreasing significance:

Level Description Exampleemerg Emergencies - system is unusable. "Child cannot open lock file. Exiting"alert Action must be taken immediately. "getpwuid: couldn’t determine user name from uid"crit Critical Conditions. "socket: Failed to get a socket, exiting child"error Error conditions. "Premature end of script headers"warn Warning conditions. "child process 1234 did not exit, sending another SIGHUP"notice Normal but significant condition. "httpd: caught SIGBUS, attempting to dump core in ..."info Informational. "Server seems busy, (you may need to increase StartServers, or

Min/MaxSpareServers)..."debug Debug-level messages "Opening config file ..."

When a particular level is specified, messages from all other levels of higher significance will be reported as well. E.g.,when LogLevel info is specified, then messages with log levels of notice and warn will also be posted.

Using a level of at least crit is recommended.

For example:

LogLevel notice

=⇒NoteWhen logging to a regular file messages of the level notice cannot be suppressed and thusare always logged. However, this doesn’t apply when logging is done using syslog.

MaxKeepAliveRequests Directive

Description: Number of requests allowed on a persistent connectionSyntax: MaxKeepAliveRequests numberDefault: MaxKeepAliveRequests 100Context: server config, virtual hostStatus: CoreModule: core

The MAXKEEPALIVEREQUESTS directive limits the number of requests allowed per connection when KEEPALIVEis on. If it is set to 0, unlimited requests will be allowed. We recommend that this setting be kept to a high value formaximum server performance.

For example:

MaxKeepAliveRequests 500

Page 336: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

328 CHAPTER 10. APACHE MODULES

MaxRanges Directive

Description: Number of ranges allowed before returning the complete resourceSyntax: MaxRanges default | unlimited | none | number-of-rangesDefault: MaxRanges 200Context: server config, virtual host, directoryStatus: CoreModule: coreCompatibility: Available in Apache HTTP Server 2.0.65 and later

The MAXRANGES directive limits the number of HTTP ranges the server is willing to return to the client. If moreranges then permitted are requested, the complete resource is returned instead.

default Limits the number of ranges to a compile-time default of 200.

none Range headers are ignored.

unlimited The server does not limit the number of ranges it is willing to satisfy.

number-of-ranges A positive number representing the maximum number of ranges the server is willing to satisfy.

NameVirtualHost Directive

Description: Designates an IP address for name-virtual hostingSyntax: NameVirtualHost addr[:port]Context: server configStatus: CoreModule: core

The NAMEVIRTUALHOST directive is a required directive if you want to configure name-based virtual hosts (p. 110).

Although addr can be hostname it is recommended that you always use an IP address, e.g.

NameVirtualHost 111.22.33.44

With the NAMEVIRTUALHOST directive you specify the IP address on which the server will receive requests for thename-based virtual hosts. This will usually be the address to which your name-based virtual host names resolve. Incases where a firewall or other proxy receives the requests and forwards them on a different IP address to the server,you must specify the IP address of the physical interface on the machine which will be servicing the requests. If youhave multiple name-based hosts on multiple addresses, repeat the directive for each address.

=⇒NoteNote, that the "main server" and any default servers will never be served for a request toa NAMEVIRTUALHOST IP address (unless for some reason you specify NAMEVIRTUALHOSTbut then don’t define any VIRTUALHOSTs for that address).

Optionally you can specify a port number on which the name-based virtual hosts should be used, e.g.

NameVirtualHost 111.22.33.44:8080

IPv6 addresses must be enclosed in square brackets, as shown in the following example:

NameVirtualHost [2001:db8::a00:20ff:fea7:ccea]:8080

Page 337: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.3. APACHE MODULE CORE 329

To receive requests on all interfaces, you can use an argument of *

NameVirtualHost *

=⇒Argument to <VIRTUALHOST> directiveNote that the argument to the <VIRTUALHOST> directive must exactly match the argumentto the NAMEVIRTUALHOST directive.

NameVirtualHost 1.2.3.4<VirtualHost 1.2.3.4># ...

</VirtualHost>

See also

• Virtual Hosts documentation (p. 110)

Options Directive

Description: Configures what features are available in a particular directorySyntax: Options [+|-]option [[+|-]option] ...Default: Options AllContext: server config, virtual host, directory, .htaccessOverride: OptionsStatus: CoreModule: core

The OPTIONS directive controls which server features are available in a particular directory.

option can be set to None, in which case none of the extra features are enabled, or one or more of the following:

All All options except for MultiViews. This is the default setting.

ExecCGI Execution of CGI scripts using MOD CGI is permitted.

FollowSymLinks The server will follow symbolic links in this directory.

=⇒Even though the server follows the symlink it does not change the pathname used to matchagainst <DIRECTORY> sections.Note also, that this option gets ignored if set inside a <LOCATION> section.

Includes Server-side includes provided by MOD INCLUDE are permitted.

IncludesNOEXEC Server-side includes are permitted, but the #exec cmd and #exec cgi are disabled. It isstill possible to #include virtual CGI scripts from SCRIPTALIASed directories.

Indexes If a URL which maps to a directory is requested, and there is no DIRECTORYINDEX (e.g., index.html)in that directory, then MOD AUTOINDEX will return a formatted listing of the directory.

MultiViews Content negotiated (p. 47) "MultiViews" are allowed using MOD NEGOTIATION.

SymLinksIfOwnerMatch The server will only follow symbolic links for which the target file or directory isowned by the same user id as the link.

=⇒NoteThis option gets ignored if set inside a <LOCATION> section.

Page 338: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

330 CHAPTER 10. APACHE MODULES

Normally, if multiple OPTIONS could apply to a directory, then the most specific one is used and others are ignored;the options are not merged. (See how sections are merged (p. 21) .) However if all the options on the OPTIONSdirective are preceded by a + or - symbol, the options are merged. Any options preceded by a + are added to theoptions currently in force, and any options preceded by a - are removed from the options currently in force.

! WarningMixing OPTIONS with a + or - with those without is not valid syntax, and is likely to causeunexpected results.

For example, without any + and - symbols:

<Directory /web/docs>

Options Indexes FollowSymLinks

</Directory>

<Directory /web/docs/spec>

Options Includes

</Directory>

then only Includes will be set for the /web/docs/spec directory. However if the second OPTIONS directiveuses the + and - symbols:

<Directory /web/docs>

Options Indexes FollowSymLinks

</Directory>

<Directory /web/docs/spec>

Options +Includes -Indexes

</Directory>

then the options FollowSymLinks and Includes are set for the /web/docs/spec directory.

=⇒NoteUsing -IncludesNOEXEC or -Includes disables server-side includes completely regard-less of the previous setting.

The default in the absence of any other settings is All.

Require Directive

Description: Selects which authenticated users can access a resourceSyntax: Require entity-name [entity-name] ...Context: directory, .htaccessOverride: AuthConfigStatus: CoreModule: core

This directive selects which authenticated users can access a resource. The allowed syntaxes are:

Require user userid [userid] ... Only the named users can access the resource.

Require group group-name [group-name] ... Only users in the named groups can access the re-source.

Page 339: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.3. APACHE MODULE CORE 331

Require valid-user All valid users can access the resource.

REQUIRE must be accompanied by AUTHNAME and AUTHTYPE directives, and directives such as AUTHUSERFILEand AUTHGROUPFILE (to define users and groups) in order to work correctly. Example:

AuthType BasicAuthName "Restricted Resource"AuthUserFile /web/usersAuthGroupFile /web/groups

Require group admin

Access controls which are applied in this way are effective for all methods. This is what is normally desired. Ifyou wish to apply access controls only to specific methods, while leaving other methods unprotected, then place theREQUIRE statement into a <LIMIT> section.

See also

• SATISFY

• MOD ACCESS

RLimitCPU Directive

Description: Limits the CPU consumption of processes launched by Apache childrenSyntax: RLimitCPU seconds|max [seconds|max]Default: Unset; uses operating system defaultsContext: server config, virtual host, directory, .htaccessOverride: AllStatus: CoreModule: core

Takes 1 or 2 parameters. The first parameter sets the soft resource limit for all processes and the second parameter setsthe maximum resource limit. Either parameter can be a number, or max to indicate to the server that the limit shouldbe set to the maximum allowed by the operating system configuration. Raising the maximum resource limit requiresthat the server is running as root, or in the initial startup phase.

This applies to processes forked off from Apache children servicing requests, not the Apache children themselves.This includes CGI scripts and SSI exec commands, but not any processes forked off from the Apache parent such aspiped logs.

CPU resource limits are expressed in seconds per process.

See also

• RLIMITMEM

• RLIMITNPROC

RLimitMEM Directive

Description: Limits the memory consumption of processes launched by Apache childrenSyntax: RLimitMEM bytes|max [bytes|max]Default: Unset; uses operating system defaultsContext: server config, virtual host, directory, .htaccessOverride: AllStatus: CoreModule: core

Page 340: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

332 CHAPTER 10. APACHE MODULES

Takes 1 or 2 parameters. The first parameter sets the soft resource limit for all processes and the second parameter setsthe maximum resource limit. Either parameter can be a number, or max to indicate to the server that the limit shouldbe set to the maximum allowed by the operating system configuration. Raising the maximum resource limit requiresthat the server is running as root, or in the initial startup phase.

This applies to processes forked off from Apache children servicing requests, not the Apache children themselves.This includes CGI scripts and SSI exec commands, but not any processes forked off from the Apache parent such aspiped logs.

Memory resource limits are expressed in bytes per process.

See also

• RLIMITCPU

• RLIMITNPROC

RLimitNPROC Directive

Description: Limits the number of processes that can be launched by processes launched by Apache childrenSyntax: RLimitNPROC number|max [number|max]Default: Unset; uses operating system defaultsContext: server config, virtual host, directory, .htaccessOverride: AllStatus: CoreModule: core

Takes 1 or 2 parameters. The first parameter sets the soft resource limit for all processes and the second parameter setsthe maximum resource limit. Either parameter can be a number, or max to indicate to the server that the limit shouldbe set to the maximum allowed by the operating system configuration. Raising the maximum resource limit requiresthat the server is running as root, or in the initial startup phase.

This applies to processes forked off from Apache children servicing requests, not the Apache children themselves.This includes CGI scripts and SSI exec commands, but not any processes forked off from the Apache parent such aspiped logs.

Process limits control the number of processes per user.

=⇒NoteIf CGI processes are not running under user ids other than the web server user id, this directivewill limit the number of processes that the server itself can create. Evidence of this situationwill be indicated by cannot fork messages in the error log.

See also

• RLIMITMEM

• RLIMITCPU

Page 341: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.3. APACHE MODULE CORE 333

Satisfy Directive

Description: Interaction between host-level access control and user authenticationSyntax: Satisfy Any|AllDefault: Satisfy AllContext: directory, .htaccessOverride: AuthConfigStatus: CoreModule: coreCompatibility: Influenced by <LIMIT> and <LIMITEXCEPT> in version 2.0.51 and later

Access policy if both ALLOW and REQUIRE used. The parameter can be either All or Any. This directive is onlyuseful if access to a particular area is being restricted by both username/password and client host address. In this casethe default behavior (All) is to require that the client passes the address access restriction and enters a valid usernameand password. With the Any option the client will be granted access if they either pass the host restriction or enter avalid username and password. This can be used to password restrict an area, but to let clients from particular addressesin without prompting for a password.

For example, if you wanted to let people on your network have unrestricted access to a portion of your website, butrequire that people outside of your network provide a password, you could use a configuration similar to the following:

Require valid-userAllow from 192.168.1

Satisfy Any

Since version 2.0.51 SATISFY directives can be restricted to particular methods by <LIMIT> and <LIMITEXCEPT>sections.

See also

• ALLOW

• REQUIRE

ScriptInterpreterSource Directive

Description: Technique for locating the interpreter for CGI scriptsSyntax: ScriptInterpreterSource Registry|Registry-Strict|ScriptDefault: ScriptInterpreterSource ScriptContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: CoreModule: coreCompatibility: Win32 only; option Registry-Strict is available in Apache 2.0 and later

This directive is used to control how Apache finds the interpreter used to run CGI scripts. The default setting isScript. This causes Apache to use the interpreter pointed to by the shebang line (first line, starting with #!) in thescript. On Win32 systems this line usually looks like:

#!C:/Perl/bin/perl.exe

or, if perl is in the PATH, simply:

#!perl

Page 342: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

334 CHAPTER 10. APACHE MODULES

Setting ScriptInterpreterSource Registrywill cause the Windows Registry tree HKEY CLASSES ROOTto be searched using the script file extension (e.g., .pl) as a search key. The command defined by the registry subkeyShell\ExecCGI\Command or, if it does not exist, by the subkey Shell\Open\Command is used to open thescript file. If the registry keys cannot be found, Apache falls back to the behavior of the Script option.

! SecurityBe careful when using ScriptInterpreterSource Registry with SCRIPTALIAS’eddirectories, because Apache will try to execute every file within this directory. The Registrysetting may cause undesired program calls on files which are typically not executed. For exam-ple, the default open command on .htm files on most Windows systems will execute MicrosoftInternet Explorer, so any HTTP request for an .htm file existing within the script directorywould start the browser in the background on the server. This is a good way to crash yoursystem within a minute or so.

The option Registry-Strict which is new in Apache 2.0 does the same thing as Registry but uses only thesubkey Shell\ExecCGI\Command. The ExecCGI key is not a common one. It must be configured manually inthe windows registry and hence prevents accidental program calls on your system.

ServerAdmin Directive

Description: Email address that the server includes in error messages sent to the clientSyntax: ServerAdmin email-addressContext: server config, virtual hostStatus: CoreModule: core

The SERVERADMIN sets the e-mail address that the server includes in any error messages it returns to the client.

It may be worth setting up a dedicated address for this, e.g.

ServerAdmin [email protected]

as users do not always mention that they are talking about the server!

ServerAlias Directive

Description: Alternate names for a host used when matching requests to name-virtual hostsSyntax: ServerAlias hostname [hostname] ...Context: virtual hostStatus: CoreModule: core

The SERVERALIAS directive sets the alternate names for a host, for use with name-based virtual hosts (p. 111) .

<VirtualHost *>ServerName server.domain.comServerAlias server server2.domain.com server2# ...

</VirtualHost>

See also

• Apache Virtual Host documentation (p. 110)

Page 343: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.3. APACHE MODULE CORE 335

ServerName Directive

Description: Hostname and port that the server uses to identify itselfSyntax: ServerName fully-qualified-domain-name[:port]Context: server config, virtual hostStatus: CoreModule: coreCompatibility: In version 2.0, this directive supersedes the functionality of the PORT directive from version

1.3.

The SERVERNAME directive sets the hostname and port that the server uses to identify itself. This is used when creat-ing redirection URLs. For example, if the name of the machine hosting the web server is simple.example.com,but the machine also has the DNS alias www.example.com and you wish the web server to be so identified, thefollowing directive should be used:

ServerName www.example.com:80

If no SERVERNAME is specified, then the server attempts to deduce the hostname by performing a reverse lookup onthe IP address. If no port is specified in the SERVERNAME, then the server will use the port from the incoming request.For optimal reliability and predictability, you should specify an explicit hostname and port using the SERVERNAMEdirective.

If you are using name-based virtual hosts (p. 111) , the SERVERNAME inside a <VIRTUALHOST> section specifieswhat hostname must appear in the request’s Host: header to match this virtual host.

See the description of the USECANONICALNAME directive for settings which determine whether self-referentialURL’s (e.g., by the MOD DIR module) will refer to the specified port, or to the port number given in the client’srequest.

See also

• Issues Regarding DNS and Apache (p. 136)

• Apache virtual host documentation (p. 110)

• USECANONICALNAME

• NAMEVIRTUALHOST

• SERVERALIAS

ServerPath Directive

Description: Legacy URL pathname for a name-based virtual host that is accessed by an incompatiblebrowser

Syntax: ServerPath URL-pathContext: virtual hostStatus: CoreModule: core

The SERVERPATH directive sets the legacy URL pathname for a host, for use with name-based virtual hosts (p. 110) .

See also

• Apache Virtual Host documentation (p. 110)

Page 344: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

336 CHAPTER 10. APACHE MODULES

ServerRoot Directive

Description: Base directory for the server installationSyntax: ServerRoot directory-pathDefault: ServerRoot /usr/local/apacheContext: server configStatus: CoreModule: core

The SERVERROOT directive sets the directory in which the server lives. Typically it will contain the subdirecto-ries conf/ and logs/. Relative paths in other configuration directives (such as INCLUDE or LOADMODULE, forexample) are taken as relative to this directory.

ExampleServerRoot /home/httpd

See also

• the -d option to httpd (p. 14)

• the security tips (p. 40) for information on how to properly set permissions on the SERVERROOT

ServerSignature Directive

Description: Configures the footer on server-generated documentsSyntax: ServerSignature On|Off|EMailDefault: ServerSignature OffContext: server config, virtual host, directory, .htaccessOverride: AllStatus: CoreModule: core

The SERVERSIGNATURE directive allows the configuration of a trailing footer line under server-generated documents(error messages, MOD PROXY ftp directory listings, MOD INFO output, ...). The reason why you would want to enablesuch a footer line is that in a chain of proxies, the user often has no possibility to tell which of the chained serversactually produced a returned error message.

The Off setting, which is the default, suppresses the footer line (and is therefore compatible with the behavior ofApache-1.2 and below). The On setting simply adds a line with the server version number and SERVERNAME of theserving virtual host, and the EMail setting additionally creates a "mailto:" reference to the SERVERADMIN of thereferenced document.

After version 2.0.44, the details of the server version number presented are controlled by the SERVERTOKENS direc-tive.

See also

• SERVERTOKENS

Page 345: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.3. APACHE MODULE CORE 337

ServerTokens Directive

Description: Configures the Server HTTP response headerSyntax: ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|FullDefault: ServerTokens FullContext: server configStatus: CoreModule: core

This directive controls whether Server response header field which is sent back to clients includes a description ofthe generic OS-type of the server as well as information about compiled-in modules.

ServerTokens Prod[uctOnly] Server sends (e.g.): Server: Apache

ServerTokens Major Server sends (e.g.): Server: Apache/2

ServerTokens Minor Server sends (e.g.): Server: Apache/2.0

ServerTokens Min[imal] Server sends (e.g.): Server: Apache/2.0.41

ServerTokens OS Server sends (e.g.): Server: Apache/2.0.41 (Unix)

ServerTokens Full (or not specified) Server sends (e.g.): Server: Apache/2.0.41 (Unix)PHP/4.2.2 MyMod/1.2

This setting applies to the entire server, and cannot be enabled or disabled on a virtualhost-by-virtualhost basis.

After version 2.0.44, this directive also controls the information presented by the SERVERSIGNATURE directive.

See also

• SERVERSIGNATURE

SetHandler Directive

Description: Forces all matching files to be processed by a handlerSyntax: SetHandler handler-name|NoneContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: CoreModule: coreCompatibility: Moved into the core in Apache 2.0

When placed into an .htaccess file or a <DIRECTORY> or <LOCATION> section, this directive forces all match-ing files to be parsed through the handler (p. 65) given by handler-name. For example, if you had a directory youwanted to be parsed entirely as imagemap rule files, regardless of extension, you might put the following into an.htaccess file in that directory:

SetHandler imap-file

Another example: if you wanted to have the server display a status report whenever a URL ofhttp://servername/status was called, you might put the following into httpd.conf:

<Location /status>

SetHandler server-status

</Location>

Page 346: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

338 CHAPTER 10. APACHE MODULES

You can override an earlier defined SETHANDLER directive by using the value None.

See also

• ADDHANDLER

SetInputFilter Directive

Description: Sets the filters that will process client requests and POST inputSyntax: SetInputFilter filter[;filter...]Context: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: CoreModule: core

The SETINPUTFILTER directive sets the filter or filters which will process client requests and POST input whenthey are received by the server. This is in addition to any filters defined elsewhere, including the ADDINPUTFILTERdirective.

If more than one filter is specified, they must be separated by semicolons in the order in which they should process thecontent.

See also

• Filters (p. 67) documentation

SetOutputFilter Directive

Description: Sets the filters that will process responses from the serverSyntax: SetOutputFilter filter[;filter...]Context: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: CoreModule: core

The SETOUTPUTFILTER directive sets the filters which will process responses from the server before they are sent tothe client. This is in addition to any filters defined elsewhere, including the ADDOUTPUTFILTER directive.

For example, the following configuration will process all files in the /www/data/ directory for server-side includes.

<Directory /www/data/>

SetOutputFilter INCLUDES

</Directory>

If more than one filter is specified, they must be separated by semicolons in the order in which they should process thecontent.

See also

• Filters (p. 67) documentation

Page 347: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.3. APACHE MODULE CORE 339

TimeOut Directive

Description: Amount of time the server will wait for certain events before failing a requestSyntax: TimeOut secondsDefault: TimeOut 300Context: server config, virtual hostStatus: CoreModule: core

The TIMEOUT directive currently defines the amount of time Apache will wait for three things:

1. The total amount of time it takes to receive a GET request.

2. The amount of time between receipt of TCP packets on a POST or PUT request.

3. The amount of time between ACKs on transmissions of TCP packets in responses.

We plan on making these separately configurable at some point down the road. The timer used to default to 1200before 1.2, but has been lowered to 300 which is still far more than necessary in most situations. It is not set any lowerby default because there may still be odd places in the code where the timer is not reset when a packet is sent.

TraceEnable Directive

Description: Determines the behaviour on TRACE requestsSyntax: TraceEnable [on|off|extended]Default: TraceEnable onContext: server configStatus: CoreModule: coreCompatibility: Available in Apache 1.3.34, 2.0.55 and later

This directive overrides the behavior of TRACE for both the core server and MOD PROXY. The default TraceEnableon permits TRACE requests per RFC 2616, which disallows any request body to accompany the request.TraceEnable off causes the core server and MOD PROXY to return a 405 (Method not allowed) error to theclient.

Finally, for testing and diagnostic purposes only, request bodies may be allowed using the non-compliantTraceEnable extended directive. The core (as an origin server) will restrict the request body to 64k (plus8k for chunk headers if Transfer-Encoding: chunked is used). The core will reflect the full headers and allchunk headers with the response body. As a proxy server, the request body is not restricted to 64k.

UseCanonicalName Directive

Description: Configures how the server determines its own name and portSyntax: UseCanonicalName On|Off|DNSDefault: UseCanonicalName OnContext: server config, virtual host, directoryStatus: CoreModule: core

In many situations Apache must construct a self-referential URL – that is, a URL that refers back to the same server.With UseCanonicalName On Apache will use the hostname and port specified in the SERVERNAME directiveto construct the canonical name for the server. This name is used in all self-referential URLs, and for the values ofSERVER NAME and SERVER PORT in CGIs.

Page 348: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

340 CHAPTER 10. APACHE MODULES

With UseCanonicalName Off Apache will form self-referential URLs using the hostname and port supplied bythe client if any are supplied (otherwise it will use the canonical name, as defined above). These values are the samethat are used to implement name based virtual hosts (p. 111) , and are available with the same clients. The CGIvariables SERVER NAME and SERVER PORT will be constructed from the client supplied values as well.

An example where this may be useful is on an intranet server where you have users connecting to the ma-chine using short names such as www. You’ll notice that if the users type a shortname, and a URL whichis a directory, such as http://www/splat, without the trailing slash then Apache will redirect them tohttp://www.domain.com/splat/. If you have authentication enabled, this will cause the user to have toauthenticate twice (once for www and once again for www.domain.com – see the FAQ on this subject for moreinformation3). But if USECANONICALNAME is set Off, then Apache will redirect to http://www/splat/.

There is a third option, UseCanonicalName DNS, which is intended for use with mass IP-based virtual hosting tosupport ancient clients that do not provide a Host: header. With this option Apache does a reverse DNS lookup onthe server IP address that the client connected to in order to work out self-referential URLs.

! WarningIf CGIs make assumptions about the values of SERVER NAME they may be broken by thisoption. The client is essentially free to give whatever value they want as a hostname. But ifthe CGI is only using SERVER NAME to construct self-referential URLs then it should be justfine.

See also

• SERVERNAME

• LISTEN

VirtualHost Directive

Description: Contains directives that apply only to a specific hostname or IP addressSyntax: <VirtualHost addr[:port] [addr[:port]] ...> ...

</VirtualHost>Context: server configStatus: CoreModule: core

<VIRTUALHOST> and </VirtualHost> are used to enclose a group of directives that will apply only to a par-ticular virtual host. Any directive that is allowed in a virtual host context may be used. When the server receives arequest for a document on a particular virtual host, it uses the configuration directives enclosed in the <VIRTUAL-HOST> section. Addr can be:

• The IP address of the virtual host;

• A fully qualified domain name for the IP address of the virtual host;

• The character *, which is used only in combination with NameVirtualHost * to match all IP addresses; or

• The string default , which is used only with IP virtual hosting to catch unmatched IP addresses.

3http://httpd.apache.org/docs/misc/FAQ.html#prompted-twice

Page 349: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.3. APACHE MODULE CORE 341

Example<VirtualHost 10.1.2.3>

ServerAdmin [email protected] /www/docs/host.foo.comServerName host.foo.comErrorLog logs/host.foo.com-error logTransferLog logs/host.foo.com-access log

</VirtualHost>

IPv6 addresses must be specified in square brackets because the optional port number could not be determined other-wise. An IPv6 example is shown below:

<VirtualHost [2001:db8::a00:20ff:fea7:ccea]>

ServerAdmin [email protected] /www/docs/host.example.comServerName host.example.comErrorLog logs/host.example.com-error logTransferLog logs/host.example.com-access log

</VirtualHost>

Each Virtual Host must correspond to a different IP address, different port number or a different host name for theserver, in the former case the server machine must be configured to accept IP packets for multiple addresses. (Ifthe machine does not have multiple network interfaces, then this can be accomplished with the ifconfig aliascommand – if your OS supports it).

=⇒NoteThe use of <VIRTUALHOST> does not affect what addresses Apache listens on. You mayneed to ensure that Apache is listening on the correct addresses using LISTEN.

When using IP-based virtual hosting, the special name default can be specified in which case this virtual hostwill match any IP address that is not explicitly listed in another virtual host. In the absence of any default virtualhost the "main" server config, consisting of all those definitions outside any VirtualHost section, is used when noIP-match occurs. (But note that any IP address that matches a NAMEVIRTUALHOST directive will use neither the"main" server config nor the default virtual host. See the name-based virtual hosting (p. 111) documentation forfurther details.)

You can specify a :port to change the port that is matched. If unspecified then it defaults to the same port as themost recent LISTEN statement of the main server. You may also specify :* to match all ports on that address. (This isrecommended when used with default .)

! SecuritySee the security tips (p. 40) document for details on why your security could be compromisedif the directory where log files are stored is writable by anyone other than the user that startsthe server.

See also

• Apache Virtual Host documentation (p. 110)

• Issues Regarding DNS and Apache (p. 136)

• Setting which addresses and ports Apache uses (p. 57)

• How <Directory>, <Location> and <Files> sections work (p. 21) for an explanation of how these differentsections are combined when a request is received

Page 350: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

342 CHAPTER 10. APACHE MODULES

10.4 Apache Module mod access

Description: Provides access control based on client hostname, IP address, or other characteristics ofthe client request.

Status: BaseModuleIdentifier: access moduleSourceFile: mod access.cCompatibility: Available only in versions prior to 2.1

Summary

The directives provided by MOD ACCESS are used in <DIRECTORY>, <FILES>, and <LOCATION> sections as wellas .htaccess (p. 302) files to control access to particular parts of the server. Access can be controlled basedon the client hostname, IP address, or other characteristics of the client request, as captured in environment variables(p. 60) . The ALLOW and DENY directives are used to specify which clients are or are not allowed access to the server,while the ORDER directive sets the default access state, and configures how the ALLOW and DENY directives interactwith each other.

Both host-based access restrictions and password-based authentication may be implemented simultaneously. In thatcase, the SATISFY directive is used to determine how the two sets of restrictions interact.

In general, access restriction directives apply to all access methods (GET, PUT, POST, etc). This is the desired behaviorin most cases. However, it is possible to restrict some methods, while leaving other methods unrestricted, by enclosingthe directives in a <LIMIT> section.

Directives

• Allow

• Deny

• Order

See also

• SATISFY

• REQUIRE

Allow Directive

Description: Controls which hosts can access an area of the serverSyntax: Allow from all|host|env=env-variable [host|env=env-variable]

...Context: directory, .htaccessOverride: LimitStatus: BaseModule: mod access

The ALLOW directive affects which hosts can access an area of the server. Access can be controlled by hostname, IPaddress, IP address range, or by other characteristics of the client request captured in environment variables.

The first argument to this directive is always from. The subsequent arguments can take three different forms. IfAllow from all is specified, then all hosts are allowed access, subject to the configuration of the DENY andORDER directives as discussed below. To allow only particular hosts or groups of hosts to access the server, the hostcan be specified in any of the following formats:

Page 351: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.4. APACHE MODULE MOD ACCESS 343

A (partial) domain-nameExample:Allow from apache.org

Allow from .net example.edu

Hosts whose names match, or end in, this string are allowed access. Only complete components are matched, sothe above example will match foo.apache.org but it will not match fooapache.org. This configurationwill cause Apache to perform a double reverse DNS lookup on the client IP address, regardless of the settingof the HOSTNAMELOOKUPS directive. It will do a reverse DNS lookup on the IP address to find the associatedhostname, and then do a forward lookup on the hostname to assure that it matches the original IP address. Onlyif the forward and reverse DNS are consistent and the hostname matches will access be allowed.

A full IP addressExample:Allow from 10.1.2.3

Allow from 192.168.1.104 192.168.1.205

An IP address of a host allowed access

A partial IP addressExample:Allow from 10.1

Allow from 10 172.20 192.168.2

The first 1 to 3 bytes of an IP address, for subnet restriction.

A network/netmask pairExample:Allow from 10.1.0.0/255.255.0.0

A network a.b.c.d, and a netmask w.x.y.z. For more fine-grained subnet restriction.

A network/nnn CIDR specificationExample:Allow from 10.1.0.0/16

Similar to the previous case, except the netmask consists of nnn high-order 1 bits.

Note that the last three examples above match exactly the same set of hosts.

IPv6 addresses and IPv6 subnets can be specified as shown below:

Allow from 2001:db8::a00:20ff:fea7:ccea

Allow from 2001:db8::a00:20ff:fea7:ccea/10

The third format of the arguments to the ALLOW directive allows access to the server to be controlled based onthe existence of an environment variable (p. 60) . When Allow from env=env-variable is specified, thenthe request is allowed access if the environment variable env-variable exists. The server provides the ability toset environment variables in a flexible way based on characteristics of the client request using the directives pro-vided by MOD SETENVIF. Therefore, this directive can be used to allow access based on such factors as the clientsUser-Agent (browser type), Referer, or other HTTP request header fields.

Example:SetEnvIf User-Agent ˆKnockKnock/2\.0 let me in<Directory /docroot>

Order Deny,AllowDeny from allAllow from env=let me in

</Directory>

Page 352: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

344 CHAPTER 10. APACHE MODULES

In this case, browsers with a user-agent string beginning with KnockKnock/2.0 will be allowed access, and allothers will be denied.

Deny Directive

Description: Controls which hosts are denied access to the serverSyntax: Deny from all|host|env=env-variable [host|env=env-variable]

...Context: directory, .htaccessOverride: LimitStatus: BaseModule: mod access

This directive allows access to the server to be restricted based on hostname, IP address, or environment variables.The arguments for the DENY directive are identical to the arguments for the ALLOW directive.

Order Directive

Description: Controls the default access state and the order in which ALLOW and DENY are evaluated.Syntax: Order orderingDefault: Order Deny,AllowContext: directory, .htaccessOverride: LimitStatus: BaseModule: mod access

The ORDER directive, along with the ALLOW and DENY directives, controls a three-pass access control system. Thefirst pass processes either all ALLOW or all DENY directives, as specified by the ORDER directive. The second passparses the rest of the directives (DENY or ALLOW). The third pass applies to all requests which do not match either ofthe first two.

Note that all ALLOW and DENY directives are processed, unlike a typical firewall, where only the first match isused. The last match is effective (also unlike a typical firewall). Additionally, the order in which lines appear in theconfiguration files is not significant – all ALLOW lines are processed as one group, all DENY lines are considered asanother, and the default state is considered by itself.

Ordering is one of:

Allow,Deny First, all ALLOW directives are evaluated; at least one must match, or the request is rejected. Next, allDENY directives are evaluated. If any matches, the request is rejected. Last, any requests which do not matchan ALLOW or a DENY directive are denied by default.

Deny,Allow First, all DENY directives are evaluated; if any match, the request is denied unless it also matches anALLOW directive. Any requests which do not match any ALLOW or DENY directives are permitted.

Mutual-failure This order has the same effect as Order Allow,Deny and is deprecated in its favor.

Keywords may only be separated by a comma; no whitespace is allowed between them.

Match Allow,Deny result Deny,Allow resultMatch Allow only Request allowed Request allowedMatch Deny only Request denied Request deniedNo match Default to second directive: Denied Default to second directive: AllowedMatch both Allow & Deny Final match controls: Denied Final match controls: Allowed

In the following example, all hosts in the apache.org domain are allowed access; all other hosts are denied access.

Page 353: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.4. APACHE MODULE MOD ACCESS 345

Order Deny,AllowDeny from all

Allow from apache.org

In the next example, all hosts in the apache.org domain are allowed access, except for the hosts which are in thefoo.apache.org subdomain, who are denied access. All hosts not in the apache.org domain are denied access becausethe default state is to DENY access to the server.

Order Allow,DenyAllow from apache.org

Deny from foo.apache.org

On the other hand, if the ORDER in the last example is changed to Deny,Allow, all hosts will be allowed access.This happens because, regardless of the actual ordering of the directives in the configuration file, the Allow fromapache.org will be evaluated last and will override the Deny from foo.apache.org. All hosts not in theapache.org domain will also be allowed access because the default state is ALLOW.

The presence of an ORDER directive can affect access to a part of the server even in the absence of accompanyingALLOW and DENY directives because of its effect on the default access state. For example,

<Directory /www>

Order Allow,Deny

</Directory>

will DENY all access to the /www directory because the default access state is set to DENY.

The ORDER directive controls the order of access directive processing only within each phase of the server’s configu-ration processing. This implies, for example, that an ALLOW or DENY directive occurring in a <LOCATION> sectionwill always be evaluated after an ALLOW or DENY directive occurring in a <DIRECTORY> section or .htaccessfile, regardless of the setting of the ORDER directive. For details on the merging of configuration sections, see thedocumentation on How Directory, Location and Files sections work (p. 21) .

Page 354: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

346 CHAPTER 10. APACHE MODULES

10.5 Apache Module mod actions

Description: This module provides for executing CGI scripts based on media type or request method.Status: BaseModuleIdentifier: actions moduleSourceFile: mod actions.c

Summary

This module has two directives. The ACTION directive lets you run CGI scripts whenever a file of a certain type isrequested. The SCRIPT directive lets you run CGI scripts whenever a particular method is used in a request. Thismakes it much easier to execute scripts that process files.

Directives

• Action

• Script

See also

• MOD CGI

• Dynamic Content with CGI (p. 185)

• Apache’s Handler Use (p. 65)

Action Directive

Description: Activates a CGI script for a particular handler or content-typeSyntax: Action action-type cgi-scriptContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod actions

This directive adds an action, which will activate cgi-script when action-type is triggered by the request. The cgi-scriptis the URL-path to a resource that has been designated as a CGI script using SCRIPTALIAS or ADDHANDLER. Theaction-type can be either a handler (p. 65) or a MIME content type. It sends the URL and file path of the requesteddocument using the standard CGI PATH INFO and PATH TRANSLATED environment variables.

Examples# Requests for files of a particular type:Action image/gif /cgi-bin/images.cgi

# Files of a particular file extensionAddHandler my-file-type .xyz

Action my-file-type /cgi-bin/program.cgi

In the first example, requests for files with a MIME content type of image/gif will instead be handled by thespecified cgi script /cgi-bin/images.cgi.

In the second example, requests for files with a file extension of .xyz are handled instead by the specified cgi script/cgi-bin/program.cgi.

See also

• ADDHANDLER

Page 355: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.5. APACHE MODULE MOD ACTIONS 347

Script Directive

Description: Activates a CGI script for a particular request method.Syntax: Script method cgi-scriptContext: server config, virtual host, directoryStatus: BaseModule: mod actions

This directive adds an action, which will activate cgi-script when a file is requested using the method of method.The cgi-script is the URL-path to a resource that has been designated as a CGI script using SCRIPTALIAS or AD-DHANDLER. The URL and file path of the requested document is sent using the standard CGI PATH INFO andPATH TRANSLATED environment variables.

=⇒Any arbitrary method name may be used. Method names are case-sensitive, so ScriptPUT and Script put have two entirely different effects.

Note that the Script command defines default actions only. If a CGI script is called, or some other resource that iscapable of handling the requested method internally, it will do so. Also note that Script with a method of GET willonly be called if there are query arguments present (e.g., foo.html?hi). Otherwise, the request will proceed normally.

Examples# For <ISINDEX>-style searchingScript GET /cgi-bin/search

# A CGI PUT handler

Script PUT /˜bob/put.cgi

Page 356: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

348 CHAPTER 10. APACHE MODULES

10.6 Apache Module mod alias

Description: Provides for mapping different parts of the host filesystem in the document tree and forURL redirection

Status: BaseModuleIdentifier: alias moduleSourceFile: mod alias.c

Summary

The directives contained in this module allow for manipulation and control of URLs as requests arrive at the server.The ALIAS and SCRIPTALIAS directives are used to map between URLs and filesystem paths. This allows for con-tent which is not directly under the DOCUMENTROOT served as part of the web document tree. The SCRIPTALIASdirective has the additional effect of marking the target directory as containing only CGI scripts.

The REDIRECT directives are used to instruct clients to make a new request with a different URL. They are often usedwhen a resource has moved to a new location.

MOD ALIAS is designed to handle simple URL manipulation tasks. For more complicated tasks such as manipulatingthe query string, use the tools provided by MOD REWRITE.

Directives

• Alias

• AliasMatch

• Redirect

• RedirectMatch

• RedirectPermanent

• RedirectTemp

• ScriptAlias

• ScriptAliasMatch

See also

• MOD REWRITE

• Mapping URLs to the filesystem (p. 36)

Order of Processing

Aliases and Redirects occuring in different contexts are processed like other directives according to standard mergingrules (p. 21) . But when multiple Aliases or Redirects occur in the same context (for example, in the same <VIRTU-ALHOST> section) they are processed in a particular order.

First, all Redirects are processed before Aliases are processed, and therefore a request that matches a REDIRECT orREDIRECTMATCH will never have Aliases applied. Second, the Aliases and Redirects are processed in the order theyappear in the configuration files, with the first match taking precedence.

For this reason, when two or more of these directives apply to the same sub-path, you must list the most specific pathfirst in order for all the directives to have an effect. For example, the following configuration will work as expected:

Alias /foo/bar /baz

Alias /foo /gaq

Page 357: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.6. APACHE MODULE MOD ALIAS 349

But if the above two directives were reversed in order, the /foo ALIAS would always match before the /foo/barALIAS, so the latter directive would be ignored.

Alias Directive

Description: Maps URLs to filesystem locationsSyntax: Alias URL-path file-path|directory-pathContext: server config, virtual hostStatus: BaseModule: mod alias

The ALIAS directive allows documents to be stored in the local filesystem other than under the DOCUMENTROOT.URLs with a (%-decoded) path beginning with url-path will be mapped to local files beginning with directory-path.The url-path is case-sensitive, even on case-insenitive file systems.

Example:Alias /image /ftp/pub/image

A request for http://myserver/image/foo.gif would cause the server to return the file/ftp/pub/image/foo.gif.

Note that if you include a trailing / on the url-path then the server will require a trailing / in order to expand the alias.That is, if you use

Alias /icons/ /usr/local/apache/icons/

then the url /icons will not be aliased.

Note that you may need to specify additional <DIRECTORY> sections which cover the destination of aliases. Aliasingoccurs before <DIRECTORY> sections are checked, so only the destination of aliases are affected. (Note however<LOCATION> sections are run through once before aliases are performed, so they will apply.)

In particular, if you are creating an Alias to a directory outside of your DOCUMENTROOT, you may need to explicitlypermit access to the target directory.

Example:Alias /image /ftp/pub/image<Directory /ftp/pub/image>

Order allow,denyAllow from all

</Directory>

AliasMatch Directive

Description: Maps URLs to filesystem locations using regular expressionsSyntax: AliasMatch regex file-path|directory-pathContext: server config, virtual hostStatus: BaseModule: mod alias

This directive is equivalent to ALIAS, but makes use of standard regular expressions, instead of simple prefix matching.The supplied regular expression is matched against the URL-path, and if it matches, the server will substitute anyparenthesized matches into the given string and use it as a filename. For example, to activate the /icons directory,one might use:

Page 358: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

350 CHAPTER 10. APACHE MODULES

AliasMatch ˆ/icons(.*) /usr/local/apache/icons$1

It is also possible to construct an alias with case-insensitive matching of the url-path:

AliasMatch (?i)ˆ/image(.*) /ftp/pub/image$1

Redirect Directive

Description: Sends an external redirect asking the client to fetch a different URLSyntax: Redirect [status] URL-path URLContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod alias

The Redirect directive maps an old URL into a new one by asking the client to refetch the resource at the new location.

The old URL-path is a case-sensitive (%-decoded) path beginning with a slash. A relative path is not allowed. Thenew URL should be an absolute URL beginning with a scheme and hostname.

Example:Redirect /service http://foo2.bar.com/service

If the client requests http://myserver/service/foo.txt, it will be told to accesshttp://foo2.bar.com/service/foo.txt instead.

=⇒NoteRedirect directives take precedence over Alias and ScriptAlias directives, irrespective of theirordering in the configuration file. Also, URL-path must be a fully qualified URL, not a relativepath, even when used with .htaccess files or inside of <DIRECTORY> sections.

If no status argument is given, the redirect will be "temporary" (HTTP status 302). This indicates to the client thatthe resource has moved temporarily. The status argument can be used to return other HTTP status codes:

permanent Returns a permanent redirect status (301) indicating that the resource has moved permanently.

temp Returns a temporary redirect status (302). This is the default.

seeother Returns a "See Other" status (303) indicating that the resource has been replaced.

gone Returns a "Gone" status (410) indicating that the resource has been permanently removed. When this status isused the URL argument should be omitted.

Other status codes can be returned by giving the numeric status code as the value of status. If the status is between300 and 399, the URL argument must be present, otherwise it must be omitted. Note that the status must be known tothe Apache code (see the function send error response in http protocol.c).

Example:Redirect permanent /one http://example.com/two

Redirect 303 /three http://example.com/other

Page 359: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.6. APACHE MODULE MOD ALIAS 351

RedirectMatch Directive

Description: Sends an external redirect based on a regular expression match of the current URLSyntax: RedirectMatch [status] regex URLContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod alias

This directive is equivalent to REDIRECT, but makes use of standard regular expressions, instead of simple prefixmatching. The supplied regular expression is matched against the URL-path, and if it matches, the server will substituteany parenthesized matches into the given string and use it as a filename. For example, to redirect all GIF files to like-named JPEG files on another server, one might use:

RedirectMatch (.*)\.gif$ http://www.anotherserver.com$1.jpg

RedirectPermanent Directive

Description: Sends an external permanent redirect asking the client to fetch a different URLSyntax: RedirectPermanent URL-path URLContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod alias

This directive makes the client know that the Redirect is permanent (status 301). Exactly equivalent to Redirectpermanent.

RedirectTemp Directive

Description: Sends an external temporary redirect asking the client to fetch a different URLSyntax: RedirectTemp URL-path URLContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod alias

This directive makes the client know that the Redirect is only temporary (status 302). Exactly equivalent to Redirecttemp.

ScriptAlias Directive

Description: Maps a URL to a filesystem location and designates the target as a CGI scriptSyntax: ScriptAlias URL-path file-path|directory-pathContext: server config, virtual hostStatus: BaseModule: mod alias

The SCRIPTALIAS directive has the same behavior as the ALIAS directive, except that in addition it marks the targetdirectory as containing CGI scripts that will be processed by MOD CGI’s cgi-script handler. URLs with a case-sensitive(%-decoded) path beginning with URL-path will be mapped to scripts beginning with the second argument, which isa full pathname in the local filesystem.

Page 360: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

352 CHAPTER 10. APACHE MODULES

Example:ScriptAlias /cgi-bin/ /web/cgi-bin/

A request for http://myserver/cgi-bin/foo would cause the server to run the script/web/cgi-bin/foo. This configuration is essentially equivalent to:

Alias /cgi-bin/ /web/cgi-bin/<Location /cgi-bin >

SetHandler cgi-scriptOptions +ExecCGI

</Location>

! It is safer to avoid placing CGI scripts under the DOCUMENTROOT in order to avoid acci-dentally revealing their source code if the configuration is ever changed. The SCRIPTALIASmakes this easy by mapping a URL and designating CGI scripts at the same time. If you dochoose to place your CGI scripts in a directory already accessible from the web, do not useSCRIPTALIAS. Instead, use <DIRECTORY>, SETHANDLER, and OPTIONS as in:

<Directory /usr/local/apache2/htdocs/cgi-bin >

SetHandler cgi-scriptOptions ExecCGI

</Directory>

This is necessary since multiple URL-paths can map to the same filesystem location, potentiallybypassing the SCRIPTALIAS and revealing the source code of the CGI scripts if they are notrestricted by a DIRECTORY section.

See also

• CGI Tutorial (p. 185)

ScriptAliasMatch Directive

Description: Maps a URL to a filesystem location using a regular expression and designates the target as aCGI script

Syntax: ScriptAliasMatch regex file-path|directory-pathContext: server config, virtual hostStatus: BaseModule: mod alias

This directive is equivalent to SCRIPTALIAS, but makes use of standard regular expressions, instead of simple prefixmatching. The supplied regular expression is matched against the URL-path, and if it matches, the server will sub-stitute any parenthesized matches into the given string and use it as a filename. For example, to activate the standard/cgi-bin, one might use:

ScriptAliasMatch ˆ/cgi-bin(.*) /usr/local/apache/cgi-bin$1

Page 361: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.7. APACHE MODULE MOD ASIS 353

10.7 Apache Module mod asis

Description: Sends files that contain their own HTTP headersStatus: BaseModuleIdentifier: asis moduleSourceFile: mod asis.c

Summary

This module provides the handler send-as-is which causes Apache to send the document without adding most ofthe usual HTTP headers.

This can be used to send any kind of data from the server, including redirects and other special HTTP responses,without requiring a cgi-script or an nph script.

For historical reasons, this module will also process any file with the mime type httpd/send-as-is.

Directives This module provides no directives.

See also

• MOD HEADERS

• MOD CERN META

• Apache’s Handler Use (p. 65)

Usage

In the server configuration file, associate files with the send-as-is handler e.g.

AddHandler send-as-is asis

The contents of any file with a .asis extension will then be sent by Apache to the client with almost no changes. Inparticular, HTTP headers are derived from the file itself according to MOD CGI rules, so an asis file must include validheaders, and may also use the CGI Status: header to determine the HTTP response code.

Here’s an example of a file whose contents are sent as is so as to tell the client that a file has redirected.

Status: 301 Now where did I leave that URLLocation: http://xyz.abc.com/foo/bar.htmlContent-type: text/html

<html><head><title>Lame excuses’R’us</title></head><body><h1>Fred’s exceptionally wonderful page has moved to<a href="http://xyz.abc.com/foo/bar.html">Joe’s</a> site.</h1></body>

</html>

Page 362: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

354 CHAPTER 10. APACHE MODULES

=⇒Notes:The server always adds a Date: and Server: header to the data returned to the client, sothese should not be included in the file. The server does not add a Last-Modified header;it probably should.

Page 363: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.8. APACHE MODULE MOD AUTH 355

10.8 Apache Module mod auth

Description: User authentication using text filesStatus: BaseModuleIdentifier: auth moduleSourceFile: mod auth.cCompatibility: Available only in versions prior to 2.1

Summary

This module allows the use of HTTP Basic Authentication to restrict access by looking up users in plain text pass-word and group files. Similar functionality and greater scalability is provided by MOD AUTH DBM. HTTP DigestAuthentication is provided by MOD AUTH DIGEST.

Directives

• AuthAuthoritative

• AuthGroupFile

• AuthUserFile

See also

• REQUIRE

• SATISFY

• AUTHNAME

• AUTHTYPE

AuthAuthoritative Directive

Description: Sets whether authorization and authentication are passed to lower level modulesSyntax: AuthAuthoritative On|OffDefault: AuthAuthoritative OnContext: directory, .htaccessOverride: AuthConfigStatus: BaseModule: mod auth

Setting the AUTHAUTHORITATIVE directive explicitly to Off allows for both authentication and authorization to bepassed on to lower level modules (as defined in the modules.c files) if there is no userID or rule matching thesupplied userID. If there is a userID and/or rule specified; the usual password and access checks will be applied and afailure will give an "Authentication Required" reply.

So if a userID appears in the database of more than one module; or if a valid REQUIRE directive applies to morethan one module; then the first module will verify the credentials; and no access is passed on; regardless of theAUTHAUTHORITATIVE setting.

A common use for this is in conjunction with one of the database modules; such as MOD AUTH DBM,mod auth msql, and MOD AUTH ANON. These modules supply the bulk of the user credential checking; but afew (administrator) related accesses fall through to a lower level with a well protected AUTHUSERFILE.

By default control is not passed on and an unknown userID or rule will result in an "Authentication Required" reply.Not setting it thus keeps the system secure and forces an NCSA compliant behaviour.

Page 364: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

356 CHAPTER 10. APACHE MODULES

! SecurityDo consider the implications of allowing a user to allow fall-through in his .htaccess file; andverify that this is really what you want; Generally it is easier to just secure a single .htpasswdfile, than it is to secure a database such as mSQL. Make sure that the AUTHUSERFILE and theAUTHGROUPFILE are stored outside the document tree of the web-server; do not put them inthe directory that they protect. Otherwise, clients will be able to download the AUTHUSER-FILE and the AUTHGROUPFILE.

AuthGroupFile Directive

Description: Sets the name of a text file containing the list of user groups for authenticationSyntax: AuthGroupFile file-pathContext: directory, .htaccessOverride: AuthConfigStatus: BaseModule: mod auth

The AUTHGROUPFILE directive sets the name of a textual file containing the list of user groups for user authentication.File-path is the path to the group file. If it is not absolute, it is treated as relative to the SERVERROOT.

Each line of the group file contains a groupname followed by a colon, followed by the member usernames separatedby spaces.

Example:mygroup: bob joe anne

Note that searching large text files is very inefficient; AUTHDBMGROUPFILE provides a much better performance.

! SecurityMake sure that the AUTHGROUPFILE is stored outside the document tree of the web-server;do not put it in the directory that it protects. Otherwise, clients may be able to download theAUTHGROUPFILE.

AuthUserFile Directive

Description: Sets the name of a text file containing the list of users and passwords for authenticationSyntax: AuthUserFile file-pathContext: directory, .htaccessOverride: AuthConfigStatus: BaseModule: mod auth

The AUTHUSERFILE directive sets the name of a textual file containing the list of users and passwords for userauthentication. File-path is the path to the user file. If it is not absolute (i.e., if it doesn’t begin with a slash), it istreated as relative to the SERVERROOT.

Each line of the user file contains a username followed by a colon, followed by the encrypted password. If the sameuser ID is defined multiple times, MOD AUTH will use the first occurrence to verify the password.

The utility htpasswd which is installed as part of the binary distribution, or which can be found in src/support,is used to maintain this password file. See the man page (p. 263) for more details. In short:

Create a password file Filename with username as the initial ID. It will prompt for the password:

Page 365: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.8. APACHE MODULE MOD AUTH 357

htpasswd -c Filename username

Add or modify username2 in the password file Filename:

htpasswd Filename username2

Note that searching large text files is very inefficient; AUTHDBMUSERFILE should be used instead.

! SecurityMake sure that the AUTHUSERFILE is stored outside the document tree of the web-server. Donot put it in the directory that it protects. Otherwise, clients may be able to download theAUTHUSERFILE.

Page 366: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

358 CHAPTER 10. APACHE MODULES

10.9 Apache Module mod auth anon

Description: Allows "anonymous" user access to authenticated areasStatus: ExtensionModuleIdentifier: auth anon moduleSourceFile: mod auth anon.cCompatibility: Available only in versions prior to 2.1

Summary

This module does access control in a manner similar to anonymous-ftp sites; i.e. have a ’magic’ user id ’anonymous’and the email address as a password. These email addresses can be logged.

Combined with other (database) access control methods, this allows for effective user tracking and customizationaccording to a user profile while still keeping the site open for ’unregistered’ users. One advantage of using Auth-based user tracking is that, unlike magic-cookies and funny URL pre/postfixes, it is completely browser independentand it allows users to share URLs.

Directives

• Anonymous

• Anonymous Authoritative

• Anonymous LogEmail

• Anonymous MustGiveEmail

• Anonymous NoUserID

• Anonymous VerifyEmail

Example

The example below (when combined with the Auth directives of a htpasswd-file based (or GDM, mSQL etc.) baseaccess control system allows users in as ’guests’ with the following properties:

• It insists that the user enters a userID. (Anonymous NoUserID)

• It insists that the user enters a password. (Anonymous MustGiveEmail)

• The password entered must be a valid email address, ie. contain at least one ’@’ and a ’.’.(Anonymous VerifyEmail)

• The userID must be one of anonymous guest www test welcome and comparison is not case sensi-tive. (Anonymous)

• And the Email addresses entered in the passwd field are logged to the error log file. (Anonymous LogEmail)

Page 367: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.9. APACHE MODULE MOD AUTH ANON 359

Excerpt of httpd.conf:Anonymous NoUserID offAnonymous MustGiveEmail onAnonymous VerifyEmail onAnonymous LogEmail onAnonymous anonymous guest www test welcome

AuthName "Use ’anonymous’ & Email address for guest entry"AuthType basic

# An AuthUserFile/AuthDBUserFile/AuthDBMUserFile# directive must be specified, or use# Anonymous Authoritative for public access.# In the .htaccess for the public directory, add:<Files *>

Order Deny,AllowAllow from all

Require valid-user

</Files>

Anonymous Directive

Description: Specifies userIDs that are allowed access without password verificationSyntax: Anonymous user [user] ...Context: directory, .htaccessOverride: AuthConfigStatus: ExtensionModule: mod auth anon

A list of one or more ’magic’ userIDs which are allowed access without password verification. The userIDs are spaceseparated. It is possible to use the ’ and " quotes to allow a space in a userID as well as the \escape character.

Please note that the comparison is case-IN-sensitive.I strongly suggest that the magic username ’anonymous’ is always one of the allowed userIDs.

Example:Anonymous anonymous "Not Registered" "I don’t know"

This would allow the user to enter without password verification by using the userIDs "anonymous", "AnonyMous","Not Registered" and "I Don’t Know".

Anonymous Authoritative Directive

Description: Configures if authorization will fall-through to other methodsSyntax: Anonymous Authoritative On|OffDefault: Anonymous Authoritative OffContext: directory, .htaccessOverride: AuthConfigStatus: ExtensionModule: mod auth anon

When set On, there is no fall-through to other authentication methods. So if a userID does not match the valuesspecified in the ANONYMOUS directive, access is denied.

Page 368: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

360 CHAPTER 10. APACHE MODULES

Be sure you know what you are doing when you decide to switch it on. And remember that the order in which theAuthentication modules are queried is defined in the modules.c files at compile time.

Anonymous LogEmail Directive

Description: Sets whether the password entered will be logged in the error logSyntax: Anonymous LogEmail On|OffDefault: Anonymous LogEmail OnContext: directory, .htaccessOverride: AuthConfigStatus: ExtensionModule: mod auth anon

When set On, the default, the ’password’ entered (which hopefully contains a sensible email address) is logged in theerror log.

Anonymous MustGiveEmail Directive

Description: Specifies whether blank passwords are allowedSyntax: Anonymous MustGiveEmail On|OffDefault: Anonymous MustGiveEmail OnContext: directory, .htaccessOverride: AuthConfigStatus: ExtensionModule: mod auth anon

Specifies whether the user must specify an email address as the password. This prohibits blank passwords.

Anonymous NoUserID Directive

Description: Sets whether the userID field may be emptySyntax: Anonymous NoUserID On|OffDefault: Anonymous NoUserID OffContext: directory, .htaccessOverride: AuthConfigStatus: ExtensionModule: mod auth anon

When set On, users can leave the userID (and perhaps the password field) empty. This can be very convenient forMS-Explorer users who can just hit return or click directly on the OK button; which seems a natural reaction.

Anonymous VerifyEmail Directive

Description: Sets whether to check the password field for a correctly formatted email addressSyntax: Anonymous VerifyEmail On|OffDefault: Anonymous VerifyEmail OffContext: directory, .htaccessOverride: AuthConfigStatus: ExtensionModule: mod auth anon

When set On the ’password’ entered is checked for at least one ’@’ and a ’.’ to encourage users to enter valid emailaddresses (see the above ANONYMOUS LOGEMAIL).

Page 369: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.10. APACHE MODULE MOD AUTH DBM 361

10.10 Apache Module mod auth dbm

Description: Provides for user authentication using DBM filesStatus: ExtensionModuleIdentifier: auth dbm moduleSourceFile: mod auth dbm.cCompatibility: Available only in versions prior to 2.1

Summary

This module provides for HTTP Basic Authentication, where the usernames and passwords are stored in DBM typedatabase files. It is an alternative to the plain text password files provided by MOD AUTH.

Directives

• AuthDBMAuthoritative

• AuthDBMGroupFile

• AuthDBMType

• AuthDBMUserFile

See also

• AUTHNAME

• AUTHTYPE

• REQUIRE

• SATISFY

AuthDBMAuthoritative Directive

Description: Sets whether authentication and authorization will be passed on to lower level modulesSyntax: AuthDBMAuthoritative On|OffDefault: AuthDBMAuthoritative OnContext: directory, .htaccessOverride: AuthConfigStatus: ExtensionModule: mod auth dbm

Setting the AUTHDBMAUTHORITATIVE directive explicitly to Off allows for both authentication and authorizationto be passed on to lower level modules (as defined in the modules.c files) if there is no userID or rule matchingthe supplied userID. If there is a userID and/or rule specified; the usual password and access checks will be appliedand a failure will give an "Authentication Required" reply.

So if a userID appears in the database of more than one module; or if a valid REQUIRE directive applies to morethan one module; then the first module will verify the credentials; and no access is passed on; regardless of theAUTHDBMAUTHORITATIVE setting.

A common use for this is in conjunction with one of the basic auth modules; such as MOD AUTH. Whereas this DBMmodule supplies the bulk of the user credential checking; a few (administrator) related accesses fall through to a lowerlevel with a well protected .htpasswd file.

By default, control is not passed on and an unknown userID or rule will result in an "Authentication Required" reply.Not setting it thus keeps the system secure and forces an NCSA compliant behaviour.

Page 370: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

362 CHAPTER 10. APACHE MODULES

! Security:Do consider the implications of allowing a user to allow fall-through in his .htaccessfile; and verify that this is really what you want; Generally it is easier to just secure a sin-gle .htpasswd file, than it is to secure a database which might have more access interfaces.

AuthDBMGroupFile Directive

Description: Sets the name of the database file containing the list of user groups for authenticationSyntax: AuthDBMGroupFile file-pathContext: directory, .htaccessOverride: AuthConfigStatus: ExtensionModule: mod auth dbm

The AUTHDBMGROUPFILE directive sets the name of a DBM file containing the list of user groups for user authen-tication. File-path is the absolute path to the group file.

The group file is keyed on the username. The value for a user is a comma-separated list of the groups to which theusers belongs. There must be no whitespace within the value, and it must never contain any colons.

Security: make sure that the AUTHDBMGROUPFILE is stored outside the document tree of the web-server; do notput it in the directory that it protects. Otherwise, clients will be able to download the AUTHDBMGROUPFILE unlessotherwise protected.

Combining Group and Password DBM files: In some cases it is easier to manage a single database which containsboth the password and group details for each user. This simplifies any support programs that need to be written: theynow only have to deal with writing to and locking a single DBM file. This can be accomplished by first setting thegroup and password files to point to the same DBM:

AuthDBMGroupFile /www/userbase

AuthDBMUserFile /www/userbase

The key for the single DBM is the username. The value consists of

Unix Crypt-ed Password:List of Groups[:(ignored)]

The password section contains the encrypted password as before. This is followed by a colon and the comma separatedlist of groups. Other data may optionally be left in the DBM file after another colon; it is ignored by the authenticationmodule. This is what www.telescope.org uses for its combined password and group database.

AuthDBMType Directive

Description: Sets the type of database file that is used to store passwordsSyntax: AuthDBMType default|SDBM|GDBM|NDBM|DBDefault: AuthDBMType defaultContext: directory, .htaccessOverride: AuthConfigStatus: ExtensionModule: mod auth dbmCompatibility: Available in version 2.0.30 and later.

Sets the type of database file that is used to store the passwords. The default database type is determined at compiletime. The availability of other types of database files also depends on compile-time settings (p. 10) .

Page 371: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.10. APACHE MODULE MOD AUTH DBM 363

It is crucial that whatever program you use to create your password files is configured to use the same type of database.

AuthDBMUserFile Directive

Description: Sets thename of a database file containing the list of users and passwords for authenticationSyntax: AuthDBMUserFile file-pathContext: directory, .htaccessOverride: AuthConfigStatus: ExtensionModule: mod auth dbm

The AUTHDBMUSERFILE directive sets the name of a DBM file containing the list of users and passwords for userauthentication. File-path is the absolute path to the user file.

The user file is keyed on the username. The value for a user is the encrypted password, optionally followed by a colonand arbitrary data. The colon and the data following it will be ignored by the server.

! Security:Make sure that the AUTHDBMUSERFILE is stored outside the document tree of the web-server; do not put it in the directory that it protects. Otherwise, clients will be able to downloadthe AUTHDBMUSERFILE.

Important compatibility note: The implementation of "dbmopen" in the apache modules reads the string length ofthe hashed values from the DBM data structures, rather than relying upon the string being NULL-appended. Someapplications, such as the Netscape web server, rely upon the string being NULL-appended, so if you are having troubleusing DBM files interchangeably between applications this may be a part of the problem.

A perl script called dbmmanage is included with Apache. This program can be used to create and update DBMformat password files for use with this module.

Page 372: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

364 CHAPTER 10. APACHE MODULES

10.11 Apache Module mod auth digest

Description: User authentication using MD5 Digest Authentication.Status: ExperimentalModuleIdentifier: auth digest moduleSourceFile: mod auth digest.c

Summary

This module implements HTTP Digest Authentication. However, it has not been extensively tested and is thereforemarked experimental.

Directives

• AuthDigestAlgorithm

• AuthDigestDomain

• AuthDigestFile

• AuthDigestGroupFile

• AuthDigestNcCheck

• AuthDigestNonceFormat

• AuthDigestNonceLifetime

• AuthDigestQop

• AuthDigestShmemSize

See also

• AUTHNAME

• AUTHTYPE

• REQUIRE

• SATISFY

Using Digest Authentication

Using MD5 Digest authentication is very simple. Simply set up authentication normally, using AuthType Digestand AUTHDIGESTFILE instead of the normal AuthType Basic and AUTHUSERFILE; also, replace any AUTH-GROUPFILE with AUTHDIGESTGROUPFILE. Then add a AUTHDIGESTDOMAIN directive containing at least theroot URI(s) for this protection space.

Appropriate user (text) files can be created using the htdigest tool.

Example:<Location /private/>

AuthType DigestAuthName "private area"AuthDigestDomain /private/ http://mirror.my.dom/private2/AuthDigestFile /web/auth/.digest pwRequire valid-user

</Location>

Page 373: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.11. APACHE MODULE MOD AUTH DIGEST 365

=⇒NoteDigest authentication provides a more secure password system than Basic authentication, butonly works with supporting browsers. As of November 2002, the major browsers that supportdigest authentication are Operaa, MS Internet Explorerb (fails when used with a query string- see "Working with MS Internet Explorer" below for a workaround), Amayac, Mozillad andNetscapee since version 7. Since digest authentication is not as widely implemented as basicauthentication, you should use it only in controlled environments.

ahttp://www.opera.com/bhttp://www.microsoft.com/windows/ie/chttp://www.w3.org/Amaya/dhttp://www.mozilla.orgehttp://channels.netscape.com/ns/browsers/download.jsp

Working with MS Internet Explorer

The Digest authentication implementation in previous Internet Explorer for Windows versions (5 and 6) had issues,namely that GET requests with a query string were not RFC compliant. There are a few ways to work around thisissue.

The first way is to use POST requests instead of GET requests to pass data to your program. This method is the simplestapproach if your application can work with this limitation.

Since version 2.0.51 Apache also provides a workaround in the AuthDigestEnableQueryStringHack envi-ronment variable. If AuthDigestEnableQueryStringHack is set for the request, Apache will take steps towork around the MSIE bug and remove the query string from the digest comparison. Using this method would looksimilar to the following.

Using Digest Authentication with MSIE:BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On

This workaround is not necessary for MSIE 7, though enabling it does not cause any compatibility issues or significantoverhead.

See the BROWSERMATCH directive for more details on conditionally setting environment variables

AuthDigestAlgorithm Directive

Description: Selects the algorithm used to calculate the challenge and response hases in digest authenticationSyntax: AuthDigestAlgorithm MD5|MD5-sessDefault: AuthDigestAlgorithm MD5Context: directory, .htaccessOverride: AuthConfigStatus: ExperimentalModule: mod auth digest

The AUTHDIGESTALGORITHM directive selects the algorithm used to calculate the challenge and response hashes.

=⇒MD5-sess is not correctly implemented yet.

Page 374: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

366 CHAPTER 10. APACHE MODULES

AuthDigestDomain Directive

Description: URIs that are in the same protection space for digest authenticationSyntax: AuthDigestDomain URI [URI] ...Context: directory, .htaccessOverride: AuthConfigStatus: ExperimentalModule: mod auth digest

The AUTHDIGESTDOMAIN directive allows you to specify one or more URIs which are in the same protection space(i.e. use the same realm and username/password info). The specified URIs are prefixes, i.e. the client will assume thatall URIs "below" these are also protected by the same username/password. The URIs may be either absolute URIs(i.e. including a scheme, host, port, etc) or relative URIs.

This directive should always be specified and contain at least the (set of) root URI(s) for this space. Omitting to do sowill cause the client to send the Authorization header for every request sent to this server. Apart from increasing thesize of the request, it may also have a detrimental effect on performance if AUTHDIGESTNCCHECK is on.

The URIs specified can also point to different servers, in which case clients (which understand this) will then shareusername/password info across multiple servers without prompting the user each time.

AuthDigestFile Directive

Description: Location of the text file containing the list of users and encoded passwords for digest authenti-cation

Syntax: AuthDigestFile file-pathContext: directory, .htaccessOverride: AuthConfigStatus: ExperimentalModule: mod auth digest

The AUTHDIGESTFILE directive sets the name of a textual file containing the list of users and encoded passwords fordigest authentication. File-path is the absolute path to the user file.

The digest file uses a special format. Files in this format can be created using the htdigest utility found in thesupport/ subdirectory of the Apache distribution.

AuthDigestGroupFile Directive

Description: Name of the text file containing the list of groups for digest authenticationSyntax: AuthDigestGroupFile file-pathContext: directory, .htaccessOverride: AuthConfigStatus: ExperimentalModule: mod auth digest

The AUTHDIGESTGROUPFILE directive sets the name of a textual file containing the list of groups and their members(user names). File-path is the absolute path to the group file.

Each line of the group file contains a groupname followed by a colon, followed by the member usernames separatedby spaces. Example:

mygroup: bob joe anne

Note that searching large text files is very inefficient.

Page 375: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.11. APACHE MODULE MOD AUTH DIGEST 367

! Security:Make sure that the AUTHGROUPFILE is stored outside the document tree of the web-server;do not put it in the directory that it protects. Otherwise, clients may be able to download theAUTHGROUPFILE.

AuthDigestNcCheck Directive

Description: Enables or disables checking of the nonce-count sent by the serverSyntax: AuthDigestNcCheck On|OffDefault: AuthDigestNcCheck OffContext: server configStatus: ExperimentalModule: mod auth digest

=⇒Not implemented yet.

AuthDigestNonceFormat Directive

Description: Determines how the nonce is generatedSyntax: AuthDigestNonceFormat formatContext: directory, .htaccessOverride: AuthConfigStatus: ExperimentalModule: mod auth digest

=⇒Not implemented yet.

AuthDigestNonceLifetime Directive

Description: How long the server nonce is validSyntax: AuthDigestNonceLifetime secondsDefault: AuthDigestNonceLifetime 300Context: directory, .htaccessOverride: AuthConfigStatus: ExperimentalModule: mod auth digest

The AUTHDIGESTNONCELIFETIME directive controls how long the server nonce is valid. When the client contactsthe server using an expired nonce the server will send back a 401 with stale=true. If seconds is greater than 0 thenit specifies the amount of time for which the nonce is valid; this should probably never be set to less than 10 seconds.If seconds is less than 0 then the nonce never expires.

Page 376: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

368 CHAPTER 10. APACHE MODULES

AuthDigestQop Directive

Description: Determines the quality-of-protection to use in digest authenticationSyntax: AuthDigestQop none|auth|auth-int [auth|auth-int]Default: AuthDigestQop authContext: directory, .htaccessOverride: AuthConfigStatus: ExperimentalModule: mod auth digest

The AUTHDIGESTQOP directive determines the quality-of-protection to use. auth will only do authentication (user-name/password); auth-int is authentication plus integrity checking (an MD5 hash of the entity is also computedand checked); none will cause the module to use the old RFC-2069 digest algorithm (which does not include integritychecking). Both auth and auth-int may be specified, in which the case the browser will choose which of these touse. none should only be used if the browser for some reason does not like the challenge it receives otherwise.

=⇒auth-int is not implemented yet.

AuthDigestShmemSize Directive

Description: The amount of shared memory to allocate for keeping track of clientsSyntax: AuthDigestShmemSize sizeDefault: AuthDigestShmemSize 1000Context: server configStatus: ExperimentalModule: mod auth digest

The AUTHDIGESTSHMEMSIZE directive defines the amount of shared memory, that will be allocated at the serverstartup for keeping track of clients. Note that the shared memory segment cannot be set less than the space that isneccessary for tracking at least one client. This value is dependant on your system. If you want to find out the exactvalue, you may simply set AUTHDIGESTSHMEMSIZE to the value of 0 and read the error message after trying to startthe server.

The size is normally expressed in Bytes, but you may let the number follow a K or an M to express your value as KBytesor MBytes. For example, the following directives are all equivalent:

AuthDigestShmemSize 1048576AuthDigestShmemSize 1024K

AuthDigestShmemSize 1M

Page 377: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.12. APACHE MODULE MOD AUTH LDAP 369

10.12 Apache Module mod auth ldap

Description: Allows an LDAP directory to be used to store the database for HTTP Basic authentica-tion.

Status: ExperimentalModuleIdentifier: auth ldap moduleSourceFile: mod auth ldap.cCompatibility: Available in version 2.0.41 and later

Summary

MOD AUTH LDAP supports the following features:

• Known to support the OpenLDAP SDK4 (both 1.x and 2.x), Novell LDAP SDK5 and the iPlanet (Netscape)6

SDK.

• Complex authorization policies can be implemented by representing the policy with LDAP filters.

• Support for Microsoft FrontPage allows FrontPage users to control access to their webs, while retaining LDAPfor user authentication.

• Uses extensive caching of LDAP operations via mod ldap (p. 465) .

• Support for LDAP over SSL (requires the Netscape SDK) or TLS (requires the OpenLDAP 2.x SDK or NovellLDAP SDK).

Directives

• AuthLDAPAuthoritative

• AuthLDAPBindDN

• AuthLDAPBindPassword

• AuthLDAPCharsetConfig

• AuthLDAPCompareDNOnServer

• AuthLDAPDereferenceAliases

• AuthLDAPEnabled

• AuthLDAPFrontPageHack

• AuthLDAPGroupAttribute

• AuthLDAPGroupAttributeIsDN

• AuthLDAPRemoteUserIsDN

• AuthLDAPUrl

See also

• MOD LDAP

4http://www.openldap.org/5http://developer.novell.com/ndk/cldap.htm6http://www.iplanet.com/downloads/developer/

Page 378: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

370 CHAPTER 10. APACHE MODULES

Contents

• Operation

– The Authentication Phase– The Authorization Phase

• The Require Directives

– Require valid-user– Require user– Require group– Require dn– Require ldap-attribute

• Examples

• Using TLS

• Using SSL

• Using Microsoft FrontPage with MOD AUTH LDAP

– How It Works– Caveats

Operation

There are two phases in granting access to a user. The first phase is authentication, in which MOD AUTH LDAPverifies that the user’s credentials are valid. This also called the search/bind phase. The second phase is authorization,in which MOD AUTH LDAP determines if the authenticated user is allowed access to the resource in question. This isalso known as the compare phase.

The Authentication Phase

During the authentication phase, MOD AUTH LDAP searches for an entry in the directory that matches the usernamethat the HTTP client passes. If a single unique match is found, then MOD AUTH LDAP attempts to bind to the directoryserver using the DN of the entry plus the password provided by the HTTP client. Because it does a search, then a bind,it is often referred to as the search/bind phase. Here are the steps taken during the search/bind phase.

1. Generate a search filter by combining the attribute and filter provided in the AUTHLDAPURL directive withthe username passed by the HTTP client.

2. Search the directory using the generated filter. If the search does not return exactly one entry, deny or declineaccess.

3. Fetch the distinguished name of the entry retrieved from the search and attempt to bind to the LDAP serverusing the DN and the password passed by the HTTP client. If the bind is unsuccessful, deny or decline access.

The following directives are used during the search/bind phase

AUTHLDAPURL Specifies the LDAP server, the base DN, the attribute to use in the search, as well as theextra search filter to use.

AUTHLDAPBINDDN An optional DN to bind with during the search phase.AUTHLDAPBINDPASSWORD An optional password to bind with during the search phase.

Page 379: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.12. APACHE MODULE MOD AUTH LDAP 371

The Authorization Phase

During the authorization phase, MOD AUTH LDAP attempts to determine if the user is authorized to access the re-source. Many of these checks require MOD AUTH LDAP to do a compare operation on the LDAP server. This is whythis phase is often referred to as the compare phase. MOD AUTH LDAP accepts the following REQUIRE directives todetermine if the credentials are acceptable:

• Grant access if there is a Require valid-user directive.

• Grant access if there is a Require user directive, and the username in the directive matches the usernamepassed by the client.

• Grant access if there is a Require dn directive, and the DN in the directive matches the DN fetched from theLDAP directory.

• Grant access if there is a Require group directive, and the DN fetched from the LDAP directory (or theusername passed by the client) occurs in the LDAP group.

• Grant access if there is a Require ldap-attribute directive, and the attribute fetched from the LDAPdirectory matches the given value.

• otherwise, deny or decline access

MOD AUTH LDAP uses the following directives during the compare phase:

AUTHLDAPURL The attribute specified in the URL is used in compare operations for theRequire user operation.

AUTHLDAPCOMPAREDNONSERVER Determines the behavior of the Require dn directive.AUTHLDAPGROUPATTRIBUTE Determines the attribute to use for comparisons in the Require group di-

rective.AUTHLDAPGROUPATTRIBUTEISDN Specifies whether to use the user DN or the username when doing comparisons

for the Require group directive.

The Require Directives

Apache’s REQUIRE directives are used during the authorization phase to ensure that a user is allowed to access aresource.

Require valid-user

If this directive exists, MOD AUTH LDAP grants access to any user that has successfully authenticated during thesearch/bind phase.

Require user

The Require user directive specifies what usernames can access the resource. Once MOD AUTH LDAP has re-trieved a unique DN from the directory, it does an LDAP compare operation using the username specified in theRequire user to see if that username is part of the just-fetched LDAP entry. Multiple users can be granted accessby putting multiple usernames on the line, separated with spaces. If a username has a space in it, then it must be sur-rounded with double quotes. Multiple users can also be granted access by using multiple Require user directives,with one user per line. For example, with a AUTHLDAPURL of ldap://ldap/o=Airius?cn (i.e., cn is usedfor searches), the following Require directives could be used to restrict access:

Require user "Barbara Jenson"Require user "Fred User"

Require user "Joe Manager"

Page 380: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

372 CHAPTER 10. APACHE MODULES

Because of the way that MOD AUTH LDAP handles this directive, Barbara Jenson could sign on as Barbara Jenson,Babs Jenson or any other cn that she has in her LDAP entry. Only the single Require user line is needed tosupport all values of the attribute in the user’s entry.

If the uid attribute was used instead of the cn attribute in the URL above, the above three lines could be condensedto

Require user bjenson fuser jmanager

Require group

This directive specifies an LDAP group whose members are allowed access. It takes the distinguished name of theLDAP group. Note: Do not surround the group name with quotes. For example, assume that the following entryexisted in the LDAP directory:

dn: cn=Administrators, o=AiriusobjectClass: groupOfUniqueNamesuniqueMember: cn=Barbara Jenson, o=Airius

uniqueMember: cn=Fred User, o=Airius

The following directive would grant access to both Fred and Barbara:

Require group cn=Administrators, o=Airius

Behavior of this directive is modified by the AUTHLDAPGROUPATTRIBUTE and AUTHLDAPGROUPAT-TRIBUTEISDN directives.

Require dn

The Require dn directive allows the administrator to grant access based on distinguished names. It specifies a DNthat must match for access to be granted. If the distinguished name that was retrieved from the directory server matchesthe distinguished name in the Require dn, then authorization is granted. Note: do not surround the distinguishedname with quotes.

The following directive would grant access to a specific DN:

Require dn cn=Barbara Jenson, o=Airius

Behavior of this directive is modified by the AUTHLDAPCOMPAREDNONSERVER directive.

Require ldap-attribute

The Require ldap-attribute directive allows the administrator to grant access based on attributes of theauthenticated user in the LDAP directory. If the attribute in the directory matches the value given in the configuration,access is granted.

The following directive would grant access to anyone with the attribute employeeType = active

Require ldap-attribute employeeType=active

Page 381: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.12. APACHE MODULE MOD AUTH LDAP 373

Multiple attribute/value pairs can be specified on the same line separated by spaces or they can be specified in multipleRequire ldap-attribute directives. The effect of listing multiple attribute/values pairs is an OR operation.Access will be granted if any of the listed attribute values match the value of a corresponding attribute in the userobject. If the value of the attribute contains a space, only the value must be within double quotes.

The following directive would grant access to anyone with the city attribute equal to "San Jose" or status equal to"Active"

Require ldap-attribute city="San Jose" status=active

Examples

• Grant access to anyone who exists in the LDAP directory, using their UID for searches.

AuthLDAPURL "ldap://ldap1.airius.com:389/ou=People,o=Airius?uid?sub?(objectClass=*)"

Require valid-user

• The next example is the same as above; but with the fields that have useful defaults omitted. Also, note the useof a redundant LDAP server.

AuthLDAPURL "ldap://ldap1.airius.com ldap2.airius.com/ou=People,o=Airius"

Require valid-user

• The next example is similar to the previous one, but is uses the common name instead of the UID. Note thatthis could be problematical if multiple people in the directory share the same cn, because a search on cn mustreturn exactly one entry. That’s why this approach is not recommended: it’s a better idea to choose an attributethat is guaranteed unique in your directory, such as uid.

AuthLDAPURL "ldap://ldap.airius.com/ou=People, o=Airius?cn"

Require valid-user

• Grant access to anybody in the Administrators group. The users must authenticate using their UID.

AuthLDAPURL ldap://ldap.airius.com/o=Airius?uid

Require group cn=Administrators, o=Airius

• The next example assumes that everyone at Airius who carries an alphanumeric pager will have an LDAPattribute of qpagePagerID. The example will grant access only to people (authenticated via their UID) whohave alphanumeric pagers:

AuthLDAPURL ldap://ldap.airius.com/o=Airius?uid??(qpagePagerID=*)

Require valid-user

• The next example demonstrates the power of using filters to accomplish complicated administrative require-ments. Without filters, it would have been necessary to create a new LDAP group and ensure that the group’smembers remain synchronized with the pager users. This becomes trivial with filters. The goal is to grant accessto anyone who has a filter, plus grant access to Joe Manager, who doesn’t have a pager, but does need to accessthe same resource:

Page 382: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

374 CHAPTER 10. APACHE MODULES

AuthLDAPURLldap://ldap.airius.com/o=Airius?uid??(|(qpagePagerID=*)(uid=jmanager))

Require valid-user

This last may look confusing at first, so it helps to evaluate what the search filter will look like based on whoconnects, as shown below. The text in blue is the part that is filled in using the attribute specified in the URL.The text in red is the part that is filled in using the filter specified in the URL. The text in green is filled in usingthe information that is retrieved from the HTTP client. If Fred User connects as fuser, the filter would looklike

(&(|(qpagePagerID=*)(uid=jmanager))(uid=fuser))

The above search will only succeed if fuser has a pager. When Joe Manager connects as jmanager, the filterlooks like

(&(|(qpagePagerID=*)(uid=jmanager))(uid=jmanager))

The above search will succeed whether jmanager has a pager or not.

Using TLS

To use TLS, see the MOD LDAP directives LDAPTRUSTEDCA and LDAPTRUSTEDCATYPE.

Using SSL

To use SSL, see the MOD LDAP directives LDAPTRUSTEDCA and LDAPTRUSTEDCATYPE.

To specify a secure LDAP server, use ldaps:// in the AUTHLDAPURL directive, instead of ldap://.

Using Microsoft FrontPage with mod auth ldap

Normally, FrontPage uses FrontPage-web-specific user/group files (i.e., the MOD AUTH module) to handle all au-thentication. Unfortunately, it is not possible to just change to LDAP authentication by adding the proper directives,because it will break the Permissions forms in the FrontPage client, which attempt to modify the standard text-basedauthorization files.

Once a FrontPage web has been created, adding LDAP authentication to it is a matter of adding the following directivesto every .htaccess file that gets created in the web

AuthLDAPURL "the url"AuthLDAPAuthoritative offAuthLDAPFrontPageHack on

AUTHLDAPAUTHORITATIVE must be off to allow MOD AUTH LDAP to decline group authentication so that Apachewill fall back to file authentication for checking group membership. This allows the FrontPage-managed group file tobe used.

Page 383: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.12. APACHE MODULE MOD AUTH LDAP 375

How It Works

FrontPage restricts access to a web by adding the Require valid-user directive to the .htaccess files. IfAUTHLDAPFRONTPAGEHACK is not on, the Require valid-user directive will succeed for any user who isvalid as far as LDAP is concerned. This means that anybody who has an entry in the LDAP directory is considered avalid user, whereas FrontPage considers only those people in the local user file to be valid. The purpose of the hack isto force Apache to consult the local user file (which is managed by FrontPage) - instead of LDAP - when handling theRequire valid-user directive.

Once directives have been added as specified above, FrontPage users will be able to perform all management operationsfrom the FrontPage client.

Caveats

• When choosing the LDAP URL, the attribute to use for authentication should be something that will also bevalid for putting into a MOD AUTH user file. The user ID is ideal for this.

• When adding users via FrontPage, FrontPage administrators should choose usernames that already exist in theLDAP directory (for obvious reasons). Also, the password that the administrator enters into the form is ignored,since Apache will actually be authenticating against the password in the LDAP database, and not against thepassword in the local user file. This could cause confusion for web administrators.

• Apache must be compiled with MOD AUTH in order to use FrontPage support. This is because Apache will stilluse the MOD AUTH group file for determine the extent of a user’s access to the FrontPage web.

• The directives must be put in the .htaccess files. Attempting to put them inside <LOCATION> or <DIREC-TORY> directives won’t work. This is because MOD AUTH LDAP has to be able to grab the AUTHUSERFILEdirective that is found in FrontPage .htaccess files so that it knows where to look for the valid user list. Ifthe MOD AUTH LDAP directives aren’t in the same .htaccess file as the FrontPage directives, then the hackwon’t work, because MOD AUTH LDAP will never get a chance to process the .htaccess file, and won’t beable to find the FrontPage-managed user file.

AuthLDAPAuthoritative Directive

Description: Prevent other authentication modules from authenticating the user if this one failsSyntax: AuthLDAPAuthoritative on|offDefault: AuthLDAPAuthoritative onContext: directory, .htaccessOverride: AuthConfigStatus: ExperimentalModule: mod auth ldap

Set to off if this module should let other authentication modules attempt to authenticate the user, should authenticationwith this module fail. Control is only passed on to lower modules if there is no DN or rule that matches the supplieduser name (as passed by the client).

AuthLDAPBindDN Directive

Description: Optional DN to use in binding to the LDAP serverSyntax: AuthLDAPBindDN distinguished-nameContext: directory, .htaccessOverride: AuthConfigStatus: ExperimentalModule: mod auth ldap

Page 384: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

376 CHAPTER 10. APACHE MODULES

An optional DN used to bind to the server when searching for entries. If not provided, MOD AUTH LDAP will use ananonymous bind.

AuthLDAPBindPassword Directive

Description: Password used in conjuction with the bind DNSyntax: AuthLDAPBindPassword passwordContext: directory, .htaccessOverride: AuthConfigStatus: ExperimentalModule: mod auth ldap

A bind password to use in conjunction with the bind DN. Note that the bind password is probably sensitive data, andshould be properly protected. You should only use the AUTHLDAPBINDDN and AUTHLDAPBINDPASSWORD ifyou absolutely need them to search the directory.

AuthLDAPCharsetConfig Directive

Description: Language to charset conversion configuration fileSyntax: AuthLDAPCharsetConfig file-pathContext: server configStatus: ExperimentalModule: mod auth ldap

The AUTHLDAPCHARSETCONFIG directive sets the location of the language to charset conversion configuration file.File-path is relative to the SERVERROOT. This file specifies the list of language extensions to character sets. Mostadministrators use the provided charset.conv file, which associates common language extensions to charactersets.

The file contains lines in the following format:

Language-Extension charset [Language-String] ...

The case of the extension does not matter. Blank lines, and lines beginning with a hash character (#) are ignored.

AuthLDAPCompareDNOnServer Directive

Description: Use the LDAP server to compare the DNsSyntax: AuthLDAPCompareDNOnServer on|offDefault: AuthLDAPCompareDNOnServer onContext: directory, .htaccessOverride: AuthConfigStatus: ExperimentalModule: mod auth ldap

When set, MOD AUTH LDAP will use the LDAP server to compare the DNs. This is the only foolproof way to compareDNs. MOD AUTH LDAP will search the directory for the DN specified with the Require dn directive, then, retrievethe DN and compare it with the DN retrieved from the user entry. If this directive is not set, MOD AUTH LDAP simplydoes a string comparison. It is possible to get false negatives with this approach, but it is much faster. Note theMOD LDAP cache can speed up DN comparison in most situations.

Page 385: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.12. APACHE MODULE MOD AUTH LDAP 377

AuthLDAPDereferenceAliases Directive

Description: When will the module de-reference aliasesSyntax: AuthLDAPDereferenceAliases never|searching|finding|alwaysDefault: AuthLDAPDereferenceAliases AlwaysContext: directory, .htaccessOverride: AuthConfigStatus: ExperimentalModule: mod auth ldap

This directive specifies when MOD AUTH LDAP will de-reference aliases during LDAP operations. The default isalways.

AuthLDAPEnabled Directive

Description: Turn on or off LDAP authenticationSyntax: AuthLDAPEnabled on|offDefault: AuthLDAPEnabled onContext: directory, .htaccessOverride: AuthConfigStatus: ExperimentalModule: mod auth ldap

Set to off to disable MOD AUTH LDAP in certain directories. This is useful if you have MOD AUTH LDAP enabled ator near the top of your tree, but want to disable it completely in certain locations.

AuthLDAPFrontPageHack Directive

Description: Allow LDAP authentication to work with MS FrontPageSyntax: AuthLDAPFrontPageHack on|offDefault: AuthLDAPFrontPageHack offContext: directory, .htaccessOverride: AuthConfigStatus: ExperimentalModule: mod auth ldap

See the section on using Microsoft FrontPage with MOD AUTH LDAP.

AuthLDAPGroupAttribute Directive

Description: LDAP attributes used to check for group membershipSyntax: AuthLDAPGroupAttribute attributeContext: directory, .htaccessOverride: AuthConfigStatus: ExperimentalModule: mod auth ldap

This directive specifies which LDAP attributes are used to check for group membership. Multiple attributes canbe used by specifying this directive multiple times. If not specified, then MOD AUTH LDAP uses the member anduniquemember attributes.

Page 386: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

378 CHAPTER 10. APACHE MODULES

AuthLDAPGroupAttributeIsDN Directive

Description: Use the DN of the client username when checking for group membershipSyntax: AuthLDAPGroupAttributeIsDN on|offDefault: AuthLDAPGroupAttributeIsDN onContext: directory, .htaccessOverride: AuthConfigStatus: ExperimentalModule: mod auth ldap

When set on, this directive says to use the distinguished name of the client username when checking for group mem-bership. Otherwise, the username will be used. For example, assume that the client sent the username bjenson,which corresponds to the LDAP DN cn=Babs Jenson, o=Airius. If this directive is set, MOD AUTH LDAPwill check if the group has cn=Babs Jenson, o=Airius as a member. If this directive is not set, thenMOD AUTH LDAP will check if the group has bjenson as a member.

AuthLDAPRemoteUserIsDN Directive

Description: Use the DN of the client username to set the REMOTE USER environment variableSyntax: AuthLDAPRemoteUserIsDN on|offDefault: AuthLDAPRemoteUserIsDN offContext: directory, .htaccessOverride: AuthConfigStatus: ExperimentalModule: mod auth ldap

If this directive is set to on, the value of the REMOTE USER environment variable will be set to the full distinguishedname of the authenticated user, rather than just the username that was passed by the client. It is turned off by default.

AuthLDAPUrl Directive

Description: URL specifying the LDAP search parametersSyntax: AuthLDAPUrl urlContext: directory, .htaccessOverride: AuthConfigStatus: ExperimentalModule: mod auth ldap

An RFC 2255 URL which specifies the LDAP search parameters to use. The syntax of the URL is

ldap://host:port/basedn?attribute?scope?filter

ldap For regular ldap, use the string ldap. For secure LDAP, use ldaps instead. Secure LDAP is only available ifApache was linked to an LDAP library with SSL support.

host:port The name/port of the ldap server (defaults to localhost:389 for ldap, and localhost:636for ldaps). To specify multiple, redundant LDAP servers, just list all servers, separated by spaces.MOD AUTH LDAP will try connecting to each server in turn, until it makes a successful connection.

Once a connection has been made to a server, that connection remains active for the life of the httpd process,or until the LDAP server goes down.

If the LDAP server goes down and breaks an existing connection, MOD AUTH LDAP will attempt to re-connect,starting with the primary server, and trying each redundant server in turn. Note that this is different than a trueround-robin search.

Page 387: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.12. APACHE MODULE MOD AUTH LDAP 379

basedn The DN of the branch of the directory where all searches should start from. At the very least, this must be thetop of your directory tree, but could also specify a subtree in the directory.

attribute The attribute to search for. Although RFC 2255 allows a comma-separated list of attributes, only the firstattribute will be used, no matter how many are provided. If no attributes are provided, the default is to use uid.It’s a good idea to choose an attribute that will be unique across all entries in the subtree you will be using.

scope The scope of the search. Can be either one or sub. Note that a scope of base is also supported by RFC 2255,but is not supported by this module. If the scope is not provided, or if base scope is specified, the default is touse a scope of sub.

filter A valid LDAP search filter. If not provided, defaults to (objectClass=*), which will search for all objectsin the tree. Filters are limited to approximately 8000 characters (the definition of MAX STRING LEN in theApache source code). This should be than sufficient for any application.

When doing searches, the attribute, filter and username passed by the HTTP client are combined to create a searchfilter that looks like (&(filter)(attribute=username)).

For example, consider an URL of ldap://ldap.airius.com/o=Airius?cn?sub?(posixid=*). Whena client attempts to connect using a username of Babs Jenson, the resulting search filter will be(&(posixid=*)(cn=Babs Jenson)).

See above for examples of AUTHLDAPURL URLs.

Page 388: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

380 CHAPTER 10. APACHE MODULES

10.13 Apache Module mod autoindex

Description: Generates directory indexes, automatically, similar to the Unix ls command or theWin32 dir shell command

Status: BaseModuleIdentifier: autoindex moduleSourceFile: mod autoindex.c

Summary

The index of a directory can come from one of two sources:

• A file written by the user, typically called index.html. The DIRECTORYINDEX directive sets the name ofthis file. This is controlled by MOD DIR.

• Otherwise, a listing generated by the server. The other directives control the format of this listing. The AD-DICON, ADDICONBYENCODING and ADDICONBYTYPE are used to set a list of icons to display for variousfile types; for each file listed, the first icon listed that matches the file is displayed. These are controlled byMOD AUTOINDEX.

The two functions are separated so that you can completely remove (or replace) automatic index generation shouldyou want to.

Automatic index generation is enabled with using Options +Indexes. See the OPTIONS directive for moredetails.

If the FancyIndexing option is given with the INDEXOPTIONS directive, the column headers are links that controlthe order of the display. If you select a header link, the listing will be regenerated, sorted by the values in that column.Selecting the same header repeatedly toggles between ascending and descending order. These column header links aresuppressed with INDEXOPTIONS directive’s SuppressColumnSorting option.

Note that when the display is sorted by "Size", it’s the actual size of the files that’s used, not the displayed value -so a 1010-byte file will always be displayed before a 1011-byte file (if in ascending order) even though they both areshown as "1K".

Directives

• AddAlt

• AddAltByEncoding

• AddAltByType

• AddDescription

• AddIcon

• AddIconByEncoding

• AddIconByType

• DefaultIcon

• HeaderName

• IndexIgnore

• IndexOptions

• IndexOrderDefault

• ReadmeName

Page 389: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.13. APACHE MODULE MOD AUTOINDEX 381

Autoindex Request Query Arguments

Apache 2.0.23 reorganized the Query Arguments for Column Sorting, and introduced an entire group of new queryoptions. To effectively eliminate all client control over the output, the IndexOptions IgnoreClient optionwas introduced.

The column sorting headers themselves are self-referencing hyperlinks that add the sort query options shown below.Any option below may be added to any request for the directory resource.

• C=N sorts the directory by file name

• C=M sorts the directory by last-modified date, then file name

• C=S sorts the directory by size, then file name

• C=D sorts the directory by description, then file name

• O=A sorts the listing in Ascending Order

• O=D sorts the listing in Descending Order

• F=0 formats the listing as a simple list (not FancyIndexed)

• F=1 formats the listing as a FancyIndexed list

• F=2 formats the listing as an HTMLTable FancyIndexed list

• V=0 disables version sorting

• V=1 enables version sorting

• P=pattern lists only files matching the given pattern

Note that the ’P’attern query argument is tested after the usual INDEXIGNORE directives are processed, and allfile names are still subjected to the same criteria as any other autoindex listing. The Query Arguments parser inMOD AUTOINDEX will stop abruptly when an unrecognized option is encountered. The Query Arguments must bewell formed, according to the table above.

The simple example below, which can be clipped and saved in a header.html file, illustrates these query options. Notethat the unknown "X" argument, for the submit button, is listed last to assure the arguments are all parsed beforemod autoindex encounters the X=Go input.

Page 390: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

382 CHAPTER 10. APACHE MODULES

<form action="" method="get">

Show me a <select name="F">

<option value="0"> Plain list</option><option value="1" selected="selected"> Fancy list</option><option value="2"> Table list</option>

</select>Sorted by <select name="C">

<option value="N" selected="selected"> Name</option><option value="M"> Date Modified</option><option value="S"> Size</option><option value="D"> Description</option>

</select><select name="O">

<option value="A" selected="selected"> Ascending</option><option value="D"> Descending</option>

</select><select name="V">

<option value="0" selected="selected"> in Normalorder</option><option value="1"> in Version order</option>

</select>Matching <input type="text" name="P" value="*" /><input type="submit" name="X" value="Go" />

</form>

AddAlt Directive

Description: Alternate text to display for a file, instead of an icon selected by filenameSyntax: AddAlt string file [file] ...Context: server config, virtual host, directory, .htaccessOverride: IndexesStatus: BaseModule: mod autoindex

ADDALT provides the alternate text to display for a file, instead of an icon, for FancyIndexing. File is a file ex-tension, partial filename, wild-card expression or full filename for files to describe. If String contains any whitespace,you have to enclose it in quotes (" or ’). This alternate text is displayed if the client is image-incapable, has imageloading disabled, or fails to retrieve the icon.

ExamplesAddAlt "PDF file" *.pdf

AddAlt Compressed *.gz *.zip *.Z

Page 391: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.13. APACHE MODULE MOD AUTOINDEX 383

AddAltByEncoding Directive

Description: Alternate text to display for a file instead of an icon selected by MIME-encodingSyntax: AddAltByEncoding string MIME-encoding [MIME-encoding] ...Context: server config, virtual host, directory, .htaccessOverride: IndexesStatus: BaseModule: mod autoindex

ADDALTBYENCODING provides the alternate text to display for a file, instead of an icon, for FancyIndexing.MIME-encoding is a valid content-encoding, such as x-compress. If String contains any whitespace, you haveto enclose it in quotes (" or ’). This alternate text is displayed if the client is image-incapable, has image loadingdisabled, or fails to retrieve the icon.

ExampleAddAltByEncoding gzip x-gzip

AddAltByType Directive

Description: Alternate text to display for a file, instead of an icon selected by MIME content-typeSyntax: AddAltByType string MIME-type [MIME-type] ...Context: server config, virtual host, directory, .htaccessOverride: IndexesStatus: BaseModule: mod autoindex

ADDALTBYTYPE sets the alternate text to display for a file, instead of an icon, for FancyIndexing. MIME-typeis a valid content-type, such as text/html. If String contains any whitespace, you have to enclose it in quotes (" or’). This alternate text is displayed if the client is image-incapable, has image loading disabled, or fails to retrieve theicon.

ExampleAddAltByType ’plain text’ text/plain

AddDescription Directive

Description: Description to display for a fileSyntax: AddDescription string file [file] ...Context: server config, virtual host, directory, .htaccessOverride: IndexesStatus: BaseModule: mod autoindex

This sets the description to display for a file, for FancyIndexing. File is a file extension, partial filename, wild-cardexpression or full filename for files to describe. String is enclosed in double quotes (").

ExampleAddDescription "The planet Mars" /web/pics/mars.gif

Page 392: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

384 CHAPTER 10. APACHE MODULES

The typical, default description field is 23 bytes wide. 6 more bytes are added by the IndexOptionsSuppressIcon option, 7 bytes are added by the IndexOptions SuppressSize option, and 19 bytes areadded by the IndexOptions SuppressLastModified option. Therefore, the widest default the descriptioncolumn is ever assigned is 55 bytes.

See the DescriptionWidth INDEXOPTIONS keyword for details on overriding the size of this column, or allowingdescriptions of unlimited length.

=⇒CautionDescriptive text defined with ADDDESCRIPTION may contain HTML markup, such as tags andcharacter entities. If the width of the description column should happen to truncate a taggedelement (such as cutting off the end of a bolded phrase), the results may affect the rest of thedirectory listing.

AddIcon Directive

Description: Icon to display for a file selected by nameSyntax: AddIcon icon name [name] ...Context: server config, virtual host, directory, .htaccessOverride: IndexesStatus: BaseModule: mod autoindex

This sets the icon to display next to a file ending in name for FancyIndexing. Icon is either a (%-escaped) relativeURL to the icon, a fully qualified remote URL, or of the format (alttext,url) where alttext is the text tag givenfor an icon for non-graphical browsers.

Name is either ˆˆDIRECTORYˆˆ for directories, ˆˆBLANKICONˆˆ for blank lines (to format the list correctly), afile extension, a wildcard expression, a partial filename or a complete filename.

ˆˆBLANKICONˆˆ is only used for formatting, and so is unnecessary if you’re using IndexOptions HTMLTable.

ExamplesAddIcon (IMG,/icons/image.xbm) .gif .jpg .xbmAddIcon /icons/dir.xbm ˆˆDIRECTORYˆˆ

AddIcon /icons/backup.xbm *˜

ADDICONBYTYPE should be used in preference to ADDICON, when possible.

AddIconByEncoding Directive

Description: Icon to display next to files selected by MIME content-encodingSyntax: AddIconByEncoding icon MIME-encoding [MIME-encoding] ...Context: server config, virtual host, directory, .htaccessOverride: IndexesStatus: BaseModule: mod autoindex

This sets the icon to display next to files with FancyIndexing. Icon is either a (%-escaped) relative URL to theicon, a fully qualified remote URL, or of the format (alttext,url) where alttext is the text tag given for an iconfor non-graphical browsers.

MIME-encoding is a wildcard expression matching required the content-encoding.

Page 393: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.13. APACHE MODULE MOD AUTOINDEX 385

ExampleAddIconByEncoding /icons/compress.xbm x-compress

AddIconByType Directive

Description: Icon to display next to files selected by MIME content-typeSyntax: AddIconByType icon MIME-type [MIME-type] ...Context: server config, virtual host, directory, .htaccessOverride: IndexesStatus: BaseModule: mod autoindex

This sets the icon to display next to files of type MIME-type for FancyIndexing. Icon is either a (%-escaped)relative URL to the icon, a fully qualified remote URL, or of the format (alttext,url) where alttext is the texttag given for an icon for non-graphical browsers.

MIME-type is a wildcard expression matching required the mime types.

ExampleAddIconByType (IMG,/icons/image.xbm) image/*

DefaultIcon Directive

Description: Icon to display for files when no specific icon is configuredSyntax: DefaultIcon url-pathContext: server config, virtual host, directory, .htaccessOverride: IndexesStatus: BaseModule: mod autoindex

The DEFAULTICON directive sets the icon to display for files when no specific icon is known, for FancyIndexing.Url-path is a (%-escaped) relative URL to the icon, or a fully qualified remote URL.

ExampleDefaultIcon /icon/unknown.xbm

HeaderName Directive

Description: Name of the file that will be inserted at the top of the index listingSyntax: HeaderName filenameContext: server config, virtual host, directory, .htaccessOverride: IndexesStatus: BaseModule: mod autoindex

The HEADERNAME directive sets the name of the file that will be inserted at the top of the index listing. Filename isthe name of the file to include.

ExampleHeaderName HEADER.html

Page 394: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

386 CHAPTER 10. APACHE MODULES

=⇒Both HeaderName and READMENAME now treat Filename as a URI path relative to the oneused to access the directory being indexed. If Filename begins with a slash, it will be taken tobe relative to the DOCUMENTROOT.

ExampleHeaderName /include/HEADER.html

Filename must resolve to a document with a major content type of text/* (e.g.,text/html, text/plain, etc.). This means that filename may refer to a CGI script ifthe script’s actual file type (as opposed to its output) is marked as text/html such as with adirective like:

AddType text/html .cgi

Content negotiation (p. 47) will be performed if OPTIONS MultiViews is in effect. If file-name resolves to a static text/html document (not a CGI script) and either one of the OP-TIONS Includes or IncludesNOEXEC is enabled, the file will be processed for server-sideincludes (see the MOD INCLUDE documentation).

If the file specified by HEADERNAME contains the beginnings of an HTML document (<html>, <head>, etc.) thenyou will probably want to set IndexOptions +SuppressHTMLPreamble, so that these tags are not repeated.

IndexIgnore Directive

Description: Adds to the list of files to hide when listing a directorySyntax: IndexIgnore file [file] ...Default: IndexIgnore "."Context: server config, virtual host, directory, .htaccessOverride: IndexesStatus: BaseModule: mod autoindex

The INDEXIGNORE directive adds to the list of files to hide when listing a directory. File is a shell-style wildcardexpression or full filename. Multiple IndexIgnore directives add to the list, rather than the replacing the list of ignoredfiles. By default, the list contains . (the current directory).

IndexIgnore .??* *˜ *# HEADER* README* RCS CVS *,v *,t

IndexOptions Directive

Description: Various configuration settings for directory indexingSyntax: IndexOptions [+|-]option [[+|-]option] ...Default: By default, no options are enabled.Context: server config, virtual host, directory, .htaccessOverride: IndexesStatus: BaseModule: mod autoindex

The INDEXOPTIONS directive specifies the behavior of the directory indexing. Option can be one of

Charset=character-set (Apache 2.0.61 and later) The Charset keyword allows you to specify the character set ofthe generated page. The default is either ISO-8859-1 or UTF-8, depending on whether the underlying file systemis unicode or not.

Page 395: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.13. APACHE MODULE MOD AUTOINDEX 387

Example:IndexOptions Charset=UTF-8

Type=MIME content-type (Apache 2.0.61 and later) The Type keyword allows you to specify the MIME content-type of the generated page. The default is text/html.

Example:IndexOptions Type=text/plain

DescriptionWidth=[n — *] (Apache 2.0.23 and later) The DescriptionWidth keyword allows you to specifythe width of the description column in characters.

-DescriptionWidth (or unset) allows MOD AUTOINDEX to calculate the best width.

DescriptionWidth=n fixes the column width to n bytes wide.

DescriptionWidth=* grows the column to the width necessary to accommodate the longest descriptionstring.

See the section on ADDDESCRIPTION for dangers inherent in truncating descriptions.

FancyIndexing This turns on fancy indexing of directories.

FoldersFirst (Apache 2.0.23 and later) If this option is enabled, subdirectory listings will always appear first, fol-lowed by normal files in the directory. The listing is basically broken into two components, the files and thesubdirectories, and each is sorted separately and then displayed subdirectories-first. For instance, if the sortorder is descending by name, and FoldersFirst is enabled, subdirectory Zed will be listed before subdi-rectory Beta, which will be listed before normal files Gamma and Alpha. This option only has an effect ifFancyIndexing is also enabled.

HTMLTable (Experimental, Apache 2.0.23 and later) This experimental option with FancyIndexing constructsa simple table for the fancy directory listing. Note this will confuse older browsers. It is particularly necessaryif file names or description text will alternate between left-to-right and right-to-left reading order, as can happenon WinNT or other utf-8 enabled platforms.

IconsAreLinks This makes the icons part of the anchor for the filename, for fancy indexing.

IconHeight[=pixels] Presence of this option, when used with IconWidth, will cause the server to include heightand width attributes in the img tag for the file icon. This allows browser to precalculate the page layoutwithout having to wait until all the images have been loaded. If no value is given for the option, it defaults tothe standard height of the icons supplied with the Apache software.

IconWidth[=pixels] Presence of this option, when used with IconHeight, will cause the server to include heightand width attributes in the img tag for the file icon. This allows browser to precalculate the page layout withouthaving to wait until all the images have been loaded. If no value is given for the option, it defaults to the standardwidth of the icons supplied with the Apache software.

IgnoreCase If this option is enabled, names are sorted in a case-insensitive manner. For instance, if the sort order isascending by name, and IgnoreCase is enabled, file Zeta will be listed after file alfa (Note: file GAMMAwill always be listed before file gamma).

IgnoreClient This option causes MOD AUTOINDEX to ignore all query variables from the client, including sort order(implies SuppressColumnSorting.)

NameWidth=[n — *] The NameWidth keyword allows you to specify the width of the filename column in bytes.

-NameWidth (or unset) allows MOD AUTOINDEX to calculate the best width.

NameWidth=n fixes the column width to n bytes wide.

NameWidth=* grows the column to the necessary width.

Page 396: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

388 CHAPTER 10. APACHE MODULES

ScanHTMLTitles This enables the extraction of the title from HTML documents for fancy indexing. If the file doesnot have a description given by ADDDESCRIPTION then httpd will read the document for the value of the titleelement. This is CPU and disk intensive.

SuppressColumnSorting If specified, Apache will not make the column headings in a FancyIndexed directory listinginto links for sorting. The default behavior is for them to be links; selecting the column heading will sort thedirectory listing by the values in that column. Prior to Apache 2.0.23, this also disabled parsing the QueryArguments for the sort string. That behavior is now controlled by IndexOptions IgnoreClient inApache 2.0.23.

SuppressDescription This will suppress the file description in fancy indexing listings. By default, no file descriptionsare defined, and so the use of this option will regain 23 characters of screen space to use for something else.See ADDDESCRIPTION for information about setting the file description. See also the DescriptionWidthindex option to limit the size of the description column.

SuppressHTMLPreamble If the directory actually contains a file specified by the HEADERNAME directive, the mod-ule usually includes the contents of the file after a standard HTML preamble (<html>, <head>, et cetera).The SuppressHTMLPreamble option disables this behaviour, causing the module to start the display withthe header file contents. The header file must contain appropriate HTML instructions in this case. If there is noheader file, the preamble is generated as usual.

SuppressIcon (Apache 2.0.23 and later) This will suppress the icon in fancy indexing listings. Combining bothSuppressIcon and SuppressRules yields proper HTML 3.2 output, which by the final specificationprohibits img and hr elements from the pre block (used to format FancyIndexed listings.)

SuppressLastModified This will suppress the display of the last modification date, in fancy indexing listings.

SuppressRules (Apache 2.0.23 and later) This will suppress the horizontal rule lines (hr elements) in directory list-ings. Combining both SuppressIcon and SuppressRules yields proper HTML 3.2 output, which by thefinal specification prohibits img and hr elements from the pre block (used to format FancyIndexed listings.)

SuppressSize This will suppress the file size in fancy indexing listings.

TrackModified (Apache 2.0.23 and later) This returns the Last-Modified and ETag values for the listed direc-tory in the HTTP header. It is only valid if the operating system and file system return appropriate stat() results.Some Unix systems do so, as do OS2’s JFS and Win32’s NTFS volumes. OS2 and Win32 FAT volumes, forexample, do not. Once this feature is enabled, the client or proxy can track changes to the list of files when theyperform a HEAD request. Note some operating systems correctly track new and removed files, but do not trackchanges for sizes or dates of the files within the directory. Changes to the size or date stamp of an existing filewill not update the Last-Modified header on all Unix platforms. If this is a concern, leave this optiondisabled.

VersionSort (Apache 2.0a3 and later) The VersionSort keyword causes files containing version numbers to sortin a natural way. Strings are sorted as usual, except that substrings of digits in the name and description arecompared according to their numeric value.

Example:foo-1.7foo-1.7.2foo-1.7.12foo-1.8.2foo-1.8.2a

foo-1.12

If the number starts with a zero, then it is considered to be a fraction:

Page 397: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.13. APACHE MODULE MOD AUTOINDEX 389

foo-1.001foo-1.002foo-1.030

foo-1.04

XHTML (Apache 2.0.49 and later) The XHTML keyword forces MOD AUTOINDEX to emit XHTML 1.0 code insteadof HTML 3.2.

Incremental IndexOptions Apache 1.3.3 introduced some significant changes in the handling of INDEXOPTIONSdirectives. In particular:

• Multiple INDEXOPTIONS directives for a single directory are now merged together. The result of:

<Directory /foo>IndexOptions HTMLTableIndexOptions SuppressColumnsorting

</Directory>

will be the equivalent of

IndexOptions HTMLTable SuppressColumnsorting

• The addition of the incremental syntax (i.e., prefixing keywords with + or -).

Whenever a ’+’ or ’-’ prefixed keyword is encountered, it is applied to the current INDEXOPTIONS settings(which may have been inherited from an upper-level directory). However, whenever an unprefixed keyword isprocessed, it clears all inherited options and any incremental settings encountered so far. Consider the followingexample:

IndexOptions +ScanHTMLTitles -IconsAreLinks FancyIndexing

IndexOptions +SuppressSize

The net effect is equivalent to IndexOptions FancyIndexing +SuppressSize, because the unpre-fixed FancyIndexing discarded the incremental keywords before it, but allowed them to start accumulatingagain afterward.

To unconditionally set the INDEXOPTIONS for a particular directory, clearing the inherited settings, specifykeywords without any + or - prefixes.

IndexOrderDefault Directive

Description: Sets the default ordering of the directory indexSyntax: IndexOrderDefault Ascending|Descending Name|Date|Size|DescriptionDefault: IndexOrderDefault Ascending NameContext: server config, virtual host, directory, .htaccessOverride: IndexesStatus: BaseModule: mod autoindex

The INDEXORDERDEFAULT directive is used in combination with the FancyIndexing index option. By default,fancyindexed directory listings are displayed in ascending order by filename; the INDEXORDERDEFAULT allows youto change this initial display order.

Page 398: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

390 CHAPTER 10. APACHE MODULES

INDEXORDERDEFAULT takes two arguments. The first must be either Ascending or Descending, indicating thedirection of the sort. The second argument must be one of the keywords Name, Date, Size, or Description, andidentifies the primary key. The secondary key is always the ascending filename.

You can, if desired, prevent the client from reordering the list by also adding the SuppressColumnSorting indexoption to remove the sort link from the top of the column, along with the IgnoreClient index option to preventthem from manually adding sort options to the query string in order to override your ordering preferences.

ReadmeName Directive

Description: Name of the file that will be inserted at the end of the index listingSyntax: ReadmeName filenameContext: server config, virtual host, directory, .htaccessOverride: IndexesStatus: BaseModule: mod autoindex

The READMENAME directive sets the name of the file that will be appended to the end of the index listing. Filenameis the name of the file to include, and is taken to be relative to the location being indexed. If Filename begins with aslash, it will be taken to be relative to the DOCUMENTROOT.

ExampleReadmeName FOOTER.html

Example 2ReadmeName /include/FOOTER.html

See also HEADERNAME, where this behavior is described in greater detail.

Page 399: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.14. APACHE MODULE MOD CACHE 391

10.14 Apache Module mod cache

Description: Content cache keyed to URIs.Status: ExperimentalModuleIdentifier: cache moduleSourceFile: mod cache.c

Summary

! This module is experimental. Documentation is still under development...

MOD CACHE implements an RFC 26167 compliant HTTP content cache that can be used to cache either local orproxied content. MOD CACHE requires the services of one or more storage management modules. Two storagemanagement modules are included in the base Apache distribution:

MOD DISK CACHE implements a disk based storage manager.

MOD MEM CACHE implements a memory based storage manager. MOD MEM CACHE can be configured to operatein two modes: caching open file descriptors or caching objects in heap storage. MOD MEM CACHE can be usedto cache locally generated content or to cache backend server content for MOD PROXY when configured usingPROXYPASS (aka reverse proxy)

Content is stored in and retrieved from the cache using URI based keys. Content with access protection is not cached.

Directives

• CacheDefaultExpire

• CacheDisable

• CacheEnable

• CacheForceCompletion

• CacheIgnoreCacheControl

• CacheIgnoreHeaders

• CacheIgnoreNoLastMod

• CacheLastModifiedFactor

• CacheMaxExpire

7http://www.ietf.org/rfc/rfc2616.txt

Page 400: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

392 CHAPTER 10. APACHE MODULES

Related Modules and Directives

Related ModulesMOD DISK CACHEMOD MEM CACHE

Related DirectivesCACHEROOTCACHESIZECACHEGCINTERVALCACHEDIRLEVELSCACHEDIRLENGTHCACHEEXPIRYCHECKCACHEMINFILESIZECACHEMAXFILESIZECACHETIMEMARGINCACHEGCDAILYCACHEGCUNUSEDCACHEGCCLEANCACHEGCMEMUSAGEMCACHESIZEMCACHEMAXOBJECTCOUNTMCACHEMINOBJECTSIZEMCACHEMAXOBJECTSIZEMCACHEREMOVALALGORITHMMCACHEMAXSTREAMINGBUFFER

Sample Configuration

Sample httpd.conf## Sample Cache Configuration#LoadModule cache module modules/mod cache.so

<IfModule mod cache.c>

#LoadModule disk cache module modules/mod disk cache.so<IfModule mod disk cache.c>

CacheRoot c:/cacherootCacheSize 256CacheEnable disk /CacheDirLevels 5CacheDirLength 3

</IfModule>

LoadModule mem cache module modules/mod mem cache.so<IfModule mod mem cache.c>

CacheEnable mem /MCacheSize 4096MCacheMaxObjectCount 100MCacheMinObjectSize 1MCacheMaxObjectSize 2048

</IfModule>

</IfModule>

Page 401: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.14. APACHE MODULE MOD CACHE 393

CacheDefaultExpire Directive

Description: The default duration to cache a document when no expiry date is specified.Syntax: CacheDefaultExpire secondsDefault: CacheDefaultExpire 3600 (one hour)Context: server config, virtual hostStatus: ExperimentalModule: mod cache

The CACHEDEFAULTEXPIRE directive specifies a default time, in seconds, to cache a document if neither an ex-piry date nor last-modified date are provided with the document. The value specified with the CACHEMAXEXPIREdirective does not override this setting.

CacheDefaultExpire 86400

CacheDisable Directive

Description: Disable caching of specified URLsSyntax: CacheDisable url-stringContext: server config, virtual hostStatus: ExperimentalModule: mod cache

The CACHEDISABLE directive instructs MOD CACHE to not cache urls at or below url-string.

ExampleCacheDisable /local files

CacheEnable Directive

Description: Enable caching of specified URLs using a specified storage managerSyntax: CacheEnable cache type url-stringContext: server config, virtual hostStatus: ExperimentalModule: mod cache

The CACHEENABLE directive instructs MOD CACHE to cache urls at or below url-string. The cache storage manageris specified with the cache type argument. cache type mem instructs MOD CACHE to use the memory based storagemanager implemented by MOD MEM CACHE. cache type disk instructs MOD CACHE to use the disk based storagemanager implemented by MOD DISK CACHE. cache type fd instructs MOD CACHE to use the file descriptor cacheimplemented by MOD MEM CACHE.

In the event that the URL space overlaps between different CACHEENABLE directives (as in the example below), eachpossible storage manager will be run until the first one that actually processes the request. The order in which thestorage managers are run is determined by the order of the CACHEENABLE directives in the configuration file.

CacheEnable mem /manualCacheEnable fd /images

CacheEnable disk /

Page 402: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

394 CHAPTER 10. APACHE MODULES

CacheForceCompletion Directive

Description: Percentage of document served, after which the server will complete caching the file even ifthe request is cancelled.

Syntax: CacheForceCompletion PercentageDefault: CacheForceCompletion 60Context: server config, virtual hostStatus: ExperimentalModule: mod cache

Ordinarily, if a request is cancelled while the response is being cached and delivered to the client the processing ofthe response will stop and the cache entry will be removed. The CACHEFORCECOMPLETION directive specifies athreshold beyond which the document will continue to be cached to completion, even if the request is cancelled.

The threshold is a percentage specified as a value between 1 and 100. A value of 0 specifies that the default be used. Avalue of 100 will only cache documents that are served in their entirety. A value between 60 and 90 is recommended.

CacheForceCompletion 80

! Note:This feature is currently not implemented.

CacheIgnoreCacheControl Directive

Description: Ignore the fact that the client requested the content not be cached.Syntax: CacheIgnoreCacheControl On|OffDefault: CacheIgnoreCacheControl OffContext: server config, virtual hostStatus: ExperimentalModule: mod cache

Ordinarily, documents with no-cache or no-store header values will not be stored in the cache. The CACHEIGNORE-CACHECONTROL directive allows this behavior to be overridden. CACHEIGNORECACHECONTROL On tells theserver to attempt to cache the document even if it contains no-cache or no-store header values. Documents requiringauthorization will never be cached.

CacheIgnoreCacheControl On

CacheIgnoreHeaders Directive

Description: Do not store the given HTTP header(s) in the cache.Syntax: CacheIgnoreHeaders header-string [header-string] ...Default: CacheIgnoreHeaders NoneContext: server config, virtual hostStatus: ExperimentalModule: mod cache

According to RFC 2616, hop-by-hop HTTP headers are not stored in the cache. The following HTTP headers arehop-by-hop headers and thus do not get stored in the cache in any case regardless of the setting of CACHEIGNORE-HEADERS:

Page 403: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.14. APACHE MODULE MOD CACHE 395

• Connection

• Keep-Alive

• Proxy-Authenticate

• Proxy-Authorization

• TE

• Trailers

• Transfer-Encoding

• Upgrade

CACHEIGNOREHEADERS specifies additional HTTP headers that should not to be stored in the cache. For example,it makes sense in some cases to prevent cookies from being stored in the cache.

CACHEIGNOREHEADERS takes a space separated list of HTTP headers that should not be stored in the cache. If onlyhop-by-hop headers not should be stored in the cache (the RFC 2616 compliant behaviour), CACHEIGNOREHEADERScan be set to None.

Example 1CacheIgnoreHeaders Set-Cookie

Example 2CacheIgnoreHeaders None

! Warning:If headers like Expires which are needed for proper cache management are not stored dueto a CACHEIGNOREHEADERS setting, the behaviour of mod cache is undefined.

CacheIgnoreNoLastMod Directive

Description: Ignore the fact that a response has no Last Modified header.Syntax: CacheIgnoreNoLastMod On|OffDefault: CacheIgnoreNoLastMod OffContext: server config, virtual hostStatus: ExperimentalModule: mod cache

Ordinarily, documents without a last-modified date are not cached. Under some circumstances the last-modified dateis removed (during MOD INCLUDE processing for example) or not provided at all. The CACHEIGNORENOLASTMODdirective provides a way to specify that documents without last-modified dates should be considered for caching, evenwithout a last-modified date. If neither a last-modified date nor an expiry date are provided with the document thenthe value specified by the CACHEDEFAULTEXPIRE directive will be used to generate an expiration date.

CacheIgnoreNoLastMod On

Page 404: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

396 CHAPTER 10. APACHE MODULES

CacheLastModifiedFactor Directive

Description: The factor used to compute an expiry date based on the LastModified date.Syntax: CacheLastModifiedFactor floatDefault: CacheLastModifiedFactor 0.1Context: server config, virtual hostStatus: ExperimentalModule: mod cache

In the event that a document does not provide an expiry date but does provide a last-modified date, an expiry date canbe calculated based on the time since the document was last modified. The CACHELASTMODIFIEDFACTOR directivespecifies a factor to be used in the generation of this expiry date according to the following formula:

expiry-period = time-since-last-modified-date * factor expiry-date =current-date + expiry-period

For example, if the document was last modified 10 hours ago, and factor is 0.1 then the expiry-period will be set to10*0.1 = 1 hour. If the current time was 3:00pm then the computed expiry-date would be 3:00pm + 1hour = 4:00pm.

If the expiry-period would be longer than that set by CACHEMAXEXPIRE, then the latter takes precedence.

CacheLastModifiedFactor 0.5

CacheMaxExpire Directive

Description: The maximum time in seconds to cache a documentSyntax: CacheMaxExpire secondsDefault: CacheMaxExpire 86400 (one day)Context: server config, virtual hostStatus: ExperimentalModule: mod cache

The CACHEMAXEXPIRE directive specifies the maximum number of seconds for which cachable HTTP documentswill be retained without checking the origin server. Thus, documents will be out of date at most this number ofseconds. This maximum value is enforced even if an expiry date was supplied with the document.

CacheMaxExpire 604800

Page 405: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.15. APACHE MODULE MOD CERN META 397

10.15 Apache Module mod cern meta

Description: CERN httpd metafile semanticsStatus: ExtensionModuleIdentifier: cern meta moduleSourceFile: mod cern meta.c

Summary

Emulate the CERN HTTPD Meta file semantics. Meta files are HTTP headers that can be output in addition to thenormal range of headers for each file accessed. They appear rather like the Apache .asis files, and are able to provide acrude way of influencing the Expires: header, as well as providing other curiosities. There are many ways to managemeta information, this one was chosen because there is already a large number of CERN users who can exploit thismodule.

More information on the CERN metafile semantics8 is available.

Directives

• MetaDir

• MetaFiles

• MetaSuffix

See also

• MOD HEADERS

• MOD ASIS

MetaDir Directive

Description: Name of the directory to find CERN-style meta information filesSyntax: MetaDir directoryDefault: MetaDir .webContext: server config, virtual host, directory, .htaccessOverride: IndexesStatus: ExtensionModule: mod cern meta

Specifies the name of the directory in which Apache can find meta information files. The directory is usually a ’hidden’subdirectory of the directory that contains the file being accessed. Set to "." to look in the same directory as the file:

MetaDir .

Or, to set it to a subdirectory of the directory containing the files:

MetaDir .meta

8http://www.w3.org/pub/WWW/Daemon/User/Config/General.html#MetaDir

Page 406: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

398 CHAPTER 10. APACHE MODULES

MetaFiles Directive

Description: Activates CERN meta-file processingSyntax: MetaFiles on|offDefault: MetaFiles offContext: server config, virtual host, directory, .htaccessOverride: IndexesStatus: ExtensionModule: mod cern meta

Turns on/off Meta file processing on a per-directory basis.

MetaSuffix Directive

Description: File name suffix for the file containg CERN-style meta informationSyntax: MetaSuffix suffixDefault: MetaSuffix .metaContext: server config, virtual host, directory, .htaccessOverride: IndexesStatus: ExtensionModule: mod cern meta

Specifies the file name suffix for the file containing the meta information. For example, the default val-ues for the two directives will cause a request to DOCUMENT ROOT/somedir/index.html to look inDOCUMENT ROOT/somedir/.web/index.html.meta and will use its contents to generate additional MIMEheader information.

Example:MetaSuffix .meta

Page 407: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.16. APACHE MODULE MOD CGI 399

10.16 Apache Module mod cgi

Description: Execution of CGI scriptsStatus: BaseModuleIdentifier: cgi moduleSourceFile: mod cgi.c

Summary

Any file that has the mime type application/x-httpd-cgi or handler cgi-script (Apache 1.1 or later)will be treated as a CGI script, and run by the server, with its output being returned to the client. Files acquire this typeeither by having a name containing an extension defined by the ADDTYPE directive, or by being in a SCRIPTALIASdirectory.

When the server invokes a CGI script, it will add a variable called DOCUMENT ROOT to the environment. This variablewill contain the value of the DOCUMENTROOT configuration variable.

For an introduction to using CGI scripts with Apache, see our tutorial on Dynamic Content With CGI (p. 185) .

When using a multi-threaded MPM under unix, the module MOD CGID should be used in place of this module. At theuser level, the two modules are essentially identical.

Directives

• ScriptLog

• ScriptLogBuffer

• ScriptLogLength

See also

• ACCEPTPATHINFO

• OPTIONS

• SCRIPTALIAS

• ADDHANDLER

• Running CGI programs under different user IDs (p. 68)

• CGI Specification9

CGI Environment variables

The server will set the CGI environment variables as described in the CGI specification10, with the following provi-sions:

PATH INFO This will not be available if the ACCEPTPATHINFO directive is explicitly set to off. The default behav-ior, if ACCEPTPATHINFO is not given, is that MOD CGI will accept path info (trailing /more/path/infofollowing the script filename in the URI), while the core server will return a 404 NOT FOUND error for re-quests with additional path info. Omitting the ACCEPTPATHINFO directive has the same effect as setting it Onfor MOD CGI requests.

9http://hoohoo.ncsa.uiuc.edu/cgi/10http://hoohoo.ncsa.uiuc.edu/cgi/

Page 408: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

400 CHAPTER 10. APACHE MODULES

REMOTE HOST This will only be set if HOSTNAMELOOKUPS is set to on (it is off by default), and if a reverseDNS lookup of the accessing host’s address indeed finds a host name.

REMOTE IDENT This will only be set if IDENTITYCHECK is set to on and the accessing host supports the identprotocol. Note that the contents of this variable cannot be relied upon because it can easily be faked, and if thereis a proxy between the client and the server, it is usually totally useless.

REMOTE USER This will only be set if the CGI script is subject to authentication.

CGI Debugging

Debugging CGI scripts has traditionally been difficult, mainly because it has not been possible to study the output(standard output and error) for scripts which are failing to run properly. These directives, included in Apache 1.2 andlater, provide more detailed logging of errors when they occur.

CGI Logfile Format

When configured, the CGI error log logs any CGI which does not execute properly. Each CGI script which fails tooperate causes several lines of information to be logged. The first two lines are always of the format:

%% [time] request-line

%% HTTP-status CGI-script-filename

If the error is that CGI script cannot be run, the log file will contain an extra two lines:

%%error

error-message

Alternatively, if the error is the result of the script returning incorrect header information (often due to a bug in thescript), the following information is logged:

%requestAll HTTP request headers receivedPOST or PUT entity (if any)%responseAll headers output by the CGI script%stdoutCGI standard output%stderr

CGI standard error

(The %stdout and %stderr parts may be missing if the script did not output anything on standard output or standarderror).

ScriptLog Directive

Description: Location of the CGI script error logfileSyntax: ScriptLog file-pathContext: server config, virtual hostStatus: BaseModule: MOD CGI, MOD CGID

Page 409: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.16. APACHE MODULE MOD CGI 401

The SCRIPTLOG directive sets the CGI script error logfile. If no SCRIPTLOG is given, no error log is created. If given,any CGI errors are logged into the filename given as argument. If this is a relative file or path it is taken relative to theSERVERROOT.

ExampleScriptLog logs/cgi log

This log will be opened as the user the child processes run as, i.e. the user specified in the main USER directive. Thismeans that either the directory the script log is in needs to be writable by that user or the file needs to be manuallycreated and set to be writable by that user. If you place the script log in your main logs directory, do NOT change thedirectory permissions to make it writable by the user the child processes run as.

Note that script logging is meant to be a debugging feature when writing CGI scripts, and is not meant to be activatedcontinuously on running servers. It is not optimized for speed or efficiency, and may have security problems if used ina manner other than that for which it was designed.

ScriptLogBuffer Directive

Description: Maximum amount of PUT or POST requests that will be recorded in the scriptlogSyntax: ScriptLogBuffer bytesDefault: ScriptLogBuffer 1024Context: server config, virtual hostStatus: BaseModule: MOD CGI, MOD CGID

The size of any PUT or POST entity body that is logged to the file is limited, to prevent the log file growing too bigtoo quickly if large bodies are being received. By default, up to 1024 bytes are logged, but this can be changed withthis directive.

ScriptLogLength Directive

Description: Size limit of the CGI script logfileSyntax: ScriptLogLength bytesDefault: ScriptLogLength 10385760Context: server config, virtual hostStatus: BaseModule: MOD CGI, MOD CGID

SCRIPTLOGLENGTH can be used to limit the size of the CGI script logfile. Since the logfile logs a lot of informationper CGI error (all request headers, all script output) it can grow to be a big file. To prevent problems due to unboundedgrowth, this directive can be used to set an maximum file-size for the CGI logfile. If the file exceeds this size, no moreinformation will be written to it.

Page 410: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

402 CHAPTER 10. APACHE MODULES

10.17 Apache Module mod cgid

Description: Execution of CGI scripts using an external CGI daemonStatus: BaseModuleIdentifier: cgid moduleSourceFile: mod cgid.cCompatibility: Unix threaded MPMs only

Summary

Except for the optimizations and the additional SCRIPTSOCK directive noted below, MOD CGID behaves similarly toMOD CGI. See the MOD CGI summary for additional details about Apache and CGI.

On certain unix operating systems, forking a process from a multi-threaded server is a very expensive operationbecause the new process will replicate all the threads of the parent process. In order to avoid incurring this expenseon each CGI invocation, MOD CGID creates an external daemon that is responsible for forking child processes to runCGI scripts. The main server communicates with this daemon using a unix domain socket.

This module is used by default instead of MOD CGI whenever a multi-threaded MPM is selected during the compilationprocess. At the user level, this module is identical in configuration and operation to MOD CGI. The only exceptionis the additional directive ScriptSock which gives the name of the socket to use for communication with the cgidaemon.

Directives

• ScriptLog (p. 400)

• ScriptLogBuffer (p. 401)

• ScriptLogLength (p. 401)

• ScriptSock

See also

• MOD CGI

• Running CGI programs under different user IDs (p. 68)

ScriptSock Directive

Description: The name of the socket to use for communication with the cgi daemonSyntax: ScriptSock file-pathDefault: ScriptSock logs/cgisockContext: server config, virtual hostStatus: BaseModule: mod cgid

This directive sets the name of the socket to use for communication with the CGI daemon. The socket will be openedusing the permissions of the user who starts Apache (usually root). To maintain the security of communications withCGI scripts, it is important that no other user has permission to write in the directory where the socket is located.

ExampleScriptSock /var/run/cgid.sock

Page 411: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.18. APACHE MODULE MOD CHARSET LITE 403

10.18 Apache Module mod charset lite

Description: Specify character set translation or recodingStatus: ExperimentalModuleIdentifier: charset lite moduleSourceFile: mod charset lite.c

Summary

This is an experimental module and should be used with care. Experiment with your MOD CHARSET LITE configu-ration to ensure that it performs the desired function.

MOD CHARSET LITE allows the administrator to specify the source character set of objects as well as the characterset they should be translated into before sending to the client. MOD CHARSET LITE does not translate the data itselfbut instead tells Apache what translation to perform. MOD CHARSET LITE is applicable to EBCDIC and ASCIIhost environments. In an EBCDIC environment, Apache normally translates text content from the code page of theApache process locale to ISO-8859-1. MOD CHARSET LITE can be used to specify that a different translation is to beperformed. In an ASCII environment, Apache normally performs no translation, so MOD CHARSET LITE is needed inorder for any translation to take place.

This module provides a small subset of configuration mechanisms implemented by Russian Apache and its associatedmod charset.

Directives

• CharsetDefault

• CharsetOptions

• CharsetSourceEnc

Common Problems

Invalid character set names

The character set name parameters of CHARSETSOURCEENC and CHARSETDEFAULT must be acceptable to thetranslation mechanism used by APR on the system where MOD CHARSET LITE is deployed. These character setnames are not standardized and are usually not the same as the corresponding values used in http headers. Currently,APR can only use iconv(3), so you can easily test your character set names using the iconv(1) program, as follows:

iconv -f charsetsourceenc-value -t charsetdefault-value

Mismatch between character set of content and translation rules

If the translation rules don’t make sense for the content, translation can fail in various ways, including:

• The translation mechanism may return a bad return code, and the connection will be aborted.

• The translation mechanism may silently place special characters (e.g., question marks) in the output buffer whenit cannot translate the input buffer.

Page 412: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

404 CHAPTER 10. APACHE MODULES

CharsetDefault Directive

Description: Charset to translate intoSyntax: CharsetDefault charsetContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: ExperimentalModule: mod charset lite

The CHARSETDEFAULT directive specifies the charset that content in the associated container should be translated to.

The value of the charset argument must be accepted as a valid character set name by the character set support in APR.Generally, this means that it must be supported by iconv.

Example<Directory /export/home/trawick/apacheinst/htdocs/convert>

CharsetSourceEnc UTF-16BECharsetDefault ISO-8859-1

</Directory>

CharsetOptions Directive

Description: Configures charset translation behaviorSyntax: CharsetOptions option [option] ...Default: CharsetOptions DebugLevel=0 NoImplicitAddContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: ExperimentalModule: mod charset lite

The CHARSETOPTIONS directive configures certain behaviors of MOD CHARSET LITE. Option can be one of

DebugLevel=n The DebugLevel keyword allows you to specify the level of debug messages generated byMOD CHARSET LITE. By default, no messages are generated. This is equivalent to DebugLevel=0. Withhigher numbers, more debug messages are generated, and server performance will be degraded. The actualmeanings of the numeric values are described with the definitions of the DBGLVL constants near the begin-ning of mod charset lite.c.

ImplicitAdd | NoImplicitAdd The ImplicitAdd keyword specifies that MOD CHARSET LITE shouldimplicitly insert its filter when the configuration specifies that the character set of content should be translated.If the filter chain is explicitly configured using the ADDOUTPUTFILTER directive, NoImplicitAdd shouldbe specified so that MOD CHARSET LITE doesn’t add its filter.

CharsetSourceEnc Directive

Description: Source charset of filesSyntax: CharsetSourceEnc charsetContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: ExperimentalModule: mod charset lite

The CHARSETSOURCEENC directive specifies the source charset of files in the associated container.

Page 413: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.18. APACHE MODULE MOD CHARSET LITE 405

The value of the charset argument must be accepted as a valid character set name by the character set support in APR.Generally, this means that it must be supported by iconv.

Example<Directory /export/home/trawick/apacheinst/htdocs/convert>

CharsetSourceEnc UTF-16BECharsetDefault ISO-8859-1

</Directory>

The character set names in this example work with the iconv translation support in Solaris 8.

Page 414: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

406 CHAPTER 10. APACHE MODULES

10.19 Apache Module mod dav

Description: Distributed Authoring and Versioning (WebDAV11) functionalityStatus: ExtensionModuleIdentifier: dav moduleSourceFile: mod dav.c

Summary

This module provides class 1 and class 2 WebDAV12 (’Web-based Distributed Authoring and Versioning’) function-ality for Apache. This extension to the HTTP protocol allows creating, moving, copying, and deleting resources andcollections on a remote web server.

Directives

• Dav

• DavDepthInfinity

• DavMinTimeout

See also

• DAVLOCKDB

• LIMITXMLREQUESTBODY

• WebDAV Resources13

Enabling WebDAV

To enable MOD DAV, add the following to a container in your httpd.conf file:

Dav On

This enables the DAV file system provider, which is implemented by the MOD DAV FS module. Therefore, that modulemust be compiled into the server or loaded at runtime using the LOADMODULE directive.

In addition, a location for the DAV lock database must be specified in the global section of your httpd.conf fileusing the DAVLOCKDB directive:

DavLockDB /usr/local/apache2/var/DavLock

The directory containing the lock database file must be writable by the USER and GROUP under which Apache isrunning.

You may wish to add a <LIMIT> clause inside the <LOCATION> directive to limit access to DAV-enabled locations.If you want to set the maximum amount of bytes that a DAV client can send at one request, you have to use theLIMITXMLREQUESTBODY directive. The "normal" LIMITREQUESTBODY directive has no effect on DAV requests.

12http://www.webdav.org13http://www.webdav.org

Page 415: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.19. APACHE MODULE MOD DAV 407

Full ExampleDavLockDB /usr/local/apache2/var/DavLock

<Location /foo>

Dav On

AuthType BasicAuthName DAVAuthUserFile user.passwd

<LimitExcept GET OPTIONS>

require user admin

</LimitExcept>

</Location>

MOD DAV is a descendent of Greg Stein’s mod dav for Apache 1.314. More information about the module is availablefrom that site.

Security Issues

Since DAV access methods allow remote clients to manipulate files on the server, you must take particular care toassure that your server is secure before enabling MOD DAV.

Any location on the server where DAV is enabled should be protected by authentication. The use of HTTP BasicAuthentication is not recommended. You should use at least HTTP Digest Authentication, which is provided by theMOD AUTH DIGEST module. Nearly all WebDAV clients support this authentication method. An alternative is BasicAuthentication over an SSL (p. 146) enabled connection.

In order for MOD DAV to manage files, it must be able to write to the directories and files under its control using theUSER and GROUP under which Apache is running. New files created will also be owned by this USER and GROUP.For this reason, it is important to control access to this account. The DAV repository is considered private to Apache;modifying files outside of Apache (for example using FTP or filesystem-level tools) should not be allowed.

MOD DAV may be subject to various kinds of denial-of-service attacks. The LIMITXMLREQUESTBODY directive canbe used to limit the amount of memory consumed in parsing large DAV requests. The DAVDEPTHINFINITY directivecan be used to prevent PROPFIND requests on a very large repository from consuming large amounts of memory.Another possible denial-of-service attack involves a client simply filling up all available disk space with many largefiles. There is no direct way to prevent this in Apache, so you should avoid giving DAV access to untrusted users.

Complex Configurations

One common request is to use MOD DAV to manipulate dynamic files (PHP scripts, CGI scripts, etc). This is difficultbecause a GET request will always run the script, rather than downloading its contents. One way to avoid this is to maptwo different URLs to the content, one of which will run the script, and one of which will allow it to be downloadedand manipulated with DAV.

Alias /phparea /home/gstein/php filesAlias /php-source /home/gstein/php files<Location /php-source>

DAV OnForceType text/plain

</Location>

14http://www.webdav.org/mod dav/

Page 416: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

408 CHAPTER 10. APACHE MODULES

With this setup, http://example.com/phparea can be used to access the output of the PHP scripts, andhttp://example.com/php-source can be used with a DAV client to manipulate them.

Dav Directive

Description: Enable WebDAV HTTP methodsSyntax: Dav On|Off|provider-nameDefault: Dav OffContext: directoryStatus: ExtensionModule: mod dav

Use the DAV directive to enable the WebDAV HTTP methods for the given container:

<Location /foo>

Dav On

</Location>

The value On is actually an alias for the default provider filesystem which is served by the MOD DAV FS module.Note, that once you have DAV enabled for some location, it cannot be disabled for sublocations. For a completeconfiguration example have a look at the section above.

! Do not enable WebDAV until you have secured your server. Otherwise everyone will be ableto distribute files on your system.

DavDepthInfinity Directive

Description: Allow PROPFIND, Depth: Infinity requestsSyntax: DavDepthInfinity on|offDefault: DavDepthInfinity offContext: server config, virtual host, directoryStatus: ExtensionModule: mod dav

Use the DAVDEPTHINFINITY directive to allow the processing of PROPFIND requests containing the header ’Depth:Infinity’. Because this type of request could constitute a denial-of-service attack, by default it is not allowed.

DavMinTimeout Directive

Description: Minimum amount of time the server holds a lock on a DAV resourceSyntax: DavMinTimeout secondsDefault: DavMinTimeout 0Context: server config, virtual host, directoryStatus: ExtensionModule: mod dav

When a client requests a DAV resource lock, it can also specify a time when the lock will be automatically removedby the server. This value is only a request, and the server can ignore it or inform the client of an arbitrary value.

Use the DAVMINTIMEOUT directive to specify, in seconds, the minimum lock timeout to return to a client. MicrosoftWeb Folders defaults to a timeout of 120 seconds; the DAVMINTIMEOUT can override this to a higher value (like 600seconds) to reduce the chance of the client losing the lock due to network latency.

Page 417: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.19. APACHE MODULE MOD DAV 409

Example<Location /MSWord>

DavMinTimeout 600

</Location>

Page 418: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

410 CHAPTER 10. APACHE MODULES

10.20 Apache Module mod dav fs

Description: filesystem provider for MOD DAVStatus: ExtensionModuleIdentifier: dav fs moduleSourceFile: mod dav fs.c

Summary

This module requires the service of MOD DAV. It acts as a support module for MOD DAV and provides access toresources located in the server’s file system. The formal name of this provider is filesystem. MOD DAV backendproviders will be invoked by using the DAV directive:

ExampleDav filesystem

Since filesystem is the default provider for MOD DAV, you may simply use the value On instead.

Directives

• DavLockDB

See also

• MOD DAV

DavLockDB Directive

Description: Location of the DAV lock databaseSyntax: DavLockDB file-pathContext: server config, virtual hostStatus: ExtensionModule: mod dav fs

Use the DAVLOCKDB directive to specify the full path to the lock database, excluding an extension. If the path is notabsolute, it will be taken relative to SERVERROOT. The implementation of MOD DAV FS uses a SDBM database totrack user locks.

ExampleDavLockDB var/DavLock

The directory containing the lock database file must be writable by the USER and GROUP under which Apache isrunning. For security reasons, you should create a directory for this purpose rather than changing the permissions onan existing directory. In the above example, Apache will create files in the var/ directory under the SERVERROOTwith the base filename DavLock and extension name chosen by the server.

Page 419: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.21. APACHE MODULE MOD DEFLATE 411

10.21 Apache Module mod deflate

Description: Compress content before it is delivered to the clientStatus: ExtensionModuleIdentifier: deflate moduleSourceFile: mod deflate.c

Summary

The MOD DEFLATE module provides the DEFLATE output filter that allows output from your server to be compressedbefore being sent to the client over the network.

Directives

• DeflateBufferSize

• DeflateCompressionLevel

• DeflateFilterNote

• DeflateMemLevel

• DeflateWindowSize

See also

• Filters (p. 67)

Sample Configurations

This is a simple sample configuration for the impatient.

Compress only a few typesAddOutputFilterByType DEFLATE text/html text/plain text/xml

The following configuration, while resulting in more compressed content, is also much more complicated. Do not usethis unless you fully understand all the configuration details.

Page 420: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

412 CHAPTER 10. APACHE MODULES

Compress everything except images<Location />

# Insert filterSetOutputFilter DEFLATE

# Netscape 4.x has some problems...BrowserMatch ˆMozilla/4 gzip-only-text/html

# Netscape 4.06-4.08 have some more problemsBrowserMatch ˆMozilla/4\.0[678] no-gzip

# MSIE masquerades as Netscape, but it is fine# BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

# NOTE: Due to a bug in mod setenvif up to Apache 2.0.48# the above regex won’t work. You can use the following# workaround to get the desired effect:BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

# Don’t compress imagesSetEnvIfNoCase Request URI \

\.(?:gif|jpe?g|png)$ no-gzip dont-vary

# Make sure proxies don’t deliver the wrong contentHeader append Vary User-Agent env=!dont-vary

</Location>

Enabling Compression

Output Compression

Compression is implemented by the DEFLATE filter (p. 67) . The following directive will enable compression fordocuments in the container where it is placed:

SetOutputFilter DEFLATE

Some popular browsers cannot handle compression of all content so you may want to set thegzip-only-text/html note to 1 to only allow html files to be compressed (see below). If you setthis to anything but 1 it will be ignored.

If you want to restrict the compression to particular MIME types in general, you may use the ADDOUTPUTFILTER-BYTYPE directive. Here is an example of enabling compression only for the html files of the Apache documentation:

<Directory "/your-server-root/manual">

AddOutputFilterByType DEFLATE text/html

</Directory>

For browsers that have problems even with compression of all file types, use the BROWSERMATCH directive to set theno-gzip note for that particular browser so that no compression will be performed. You may combine no-gzipwith gzip-only-text/html to get the best results. In that case the former overrides the latter. Take a look at thefollowing excerpt from the configuration example defined in the section above:

BrowserMatch ˆMozilla/4 gzip-only-text/htmlBrowserMatch ˆMozilla/4\.0[678] no-gzip

BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

Page 421: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.21. APACHE MODULE MOD DEFLATE 413

At first we probe for a User-Agent string that indicates a Netscape Navigator version of 4.x. These versions cannothandle compression of types other than text/html. The versions 4.06, 4.07 and 4.08 also have problems withdecompressing html files. Thus, we completely turn off the deflate filter for them.

The third BROWSERMATCH directive fixes the guessed identity of the user agent, because the Microsoft InternetExplorer identifies itself also as "Mozilla/4" but is actually able to handle requested compression. Therefore wematch against the additional string "MSIE" (\b means "word boundary") in the User-Agent Header and turn offthe restrictions defined before.

=⇒NoteThe DEFLATE filter is always inserted after RESOURCE filters like PHP or SSI. It nevertouches internal subrequests.

Input Decompression

The MOD DEFLATE module also provides a filter for decompressing a gzip compressed request body . In order toactivate this feature you have to insert the DEFLATE filter into the input filter chain using SETINPUTFILTER orADDINPUTFILTER, for example:

<Location /dav-area>

SetInputFilter DEFLATE

</Location>

Now if a request contains a Content-Encoding: gzip header, the body will be automatically decompressed.Few browsers have the ability to gzip request bodies. However, some special applications actually do support requestcompression, for instance some WebDAV15 clients.

! Note on Content-LengthIf you evaluate the request body yourself, don’t trust the Content-Length header! TheContent-Length header reflects the length of the incoming data from the client and not the bytecount of the decompressed data stream.

Dealing with proxy servers

The MOD DEFLATE module sends a Vary: Accept-Encoding HTTP response header to alert proxies that acached response should be sent only to clients that send the appropriate Accept-Encoding request header. Thisprevents compressed content from being sent to a client that will not understand it.

If you use some special exclusions dependent on, for example, the User-Agent header, you must manually configurean addition to the Vary header to alert proxies of the additional restrictions. For example, in a typical configurationwhere the addition of the DEFLATE filter depends on the User-Agent, you should add:

Header append Vary User-Agent

If your decision about compression depends on other information than request headers (e.g. HTTP version), you haveto set the Vary header to the value *. This prevents compliant proxies from caching entirely.

ExampleHeader set Vary *

15http://www.webdav.org

Page 422: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

414 CHAPTER 10. APACHE MODULES

DeflateBufferSize Directive

Description: Fragment size to be compressed at one time by zlibSyntax: DeflateBufferSize valueDefault: DeflateBufferSize 8096Context: server config, virtual hostStatus: ExtensionModule: mod deflate

The DEFLATEBUFFERSIZE directive specifies the size in bytes of the fragments that zlib should compress at one time.

DeflateCompressionLevel Directive

Description: How much compression do we apply to the outputSyntax: DeflateCompressionLevel valueDefault: Zlib’s defaultContext: server config, virtual hostStatus: ExtensionModule: mod deflateCompatibility: This directive is available since Apache 2.0.45

The DEFLATECOMPRESSIONLEVEL directive specifies what level of compression should be used, the higher thevalue, the better the compression, but the more CPU time is required to achieve this.

The value must between 1 (less compression) and 9 (more compression).

DeflateFilterNote Directive

Description: Places the compression ratio in a note for loggingSyntax: DeflateFilterNote [type] notenameContext: server config, virtual hostStatus: ExtensionModule: mod deflateCompatibility: type is available since Apache 2.0.45

The DEFLATEFILTERNOTE directive specifies that a note about compression ratios should be attached to the request.The name of the note is the value specified for the directive. You can use that note for statistical purposes by addingthe value to your access log (p. 29) .

ExampleDeflateFilterNote ratio

LogFormat ’"%r" %b (%{ratio}n) "%{User-agent}i"’ deflate

CustomLog logs/deflate log deflate

If you want to extract more accurate values from your logs, you can use the type argument to specify the type of dataleft as note for logging. type can be one of:

Input Store the byte count of the filter’s input stream in the note.

Output Store the byte count of the filter’s output stream in the note.

Ratio Store the compression ratio (output/input * 100) in the note. This is the default, if the type argumentis omitted.

Page 423: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.21. APACHE MODULE MOD DEFLATE 415

Thus you may log it this way:

Accurate LoggingDeflateFilterNote Input instreamDeflateFilterNote Output outstreamDeflateFilterNote Ratio ratio

LogFormat ’"%r" %{outstream}n/%{instream}n (%{ratio}n%%)’ deflate

CustomLog logs/deflate log deflate

See also

• MOD LOG CONFIG

DeflateMemLevel Directive

Description: How much memory should be used by zlib for compressionSyntax: DeflateMemLevel valueDefault: DeflateMemLevel 9Context: server config, virtual hostStatus: ExtensionModule: mod deflate

The DEFLATEMEMLEVEL directive specifies how much memory should be used by zlib for compression (a valuebetween 1 and 9).

DeflateWindowSize Directive

Description: Zlib compression window sizeSyntax: DeflateWindowSize valueDefault: DeflateWindowSize 15Context: server config, virtual hostStatus: ExtensionModule: mod deflate

The DEFLATEWINDOWSIZE directive specifies the zlib compression window size (a value between 1 and 15). Gen-erally, the higher the window size, the higher can the compression ratio be expected.

Page 424: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

416 CHAPTER 10. APACHE MODULES

10.22 Apache Module mod dir

Description: Provides for "trailing slash" redirects and serving directory index filesStatus: BaseModuleIdentifier: dir moduleSourceFile: mod dir.c

Summary

The index of a directory can come from one of two sources:

• A file written by the user, typically called index.html. The DIRECTORYINDEX directive sets the name ofthis file. This is controlled by MOD DIR.

• Otherwise, a listing generated by the server. This is provided by MOD AUTOINDEX.

The two functions are separated so that you can completely remove (or replace) automatic index generation shouldyou want to.

A "trailing slash" redirect is issued when the server receives a request for a URLhttp://servername/foo/dirname where dirname is a directory. Directories require a trailingslash, so MOD DIR issues a redirect to http://servername/foo/dirname/.

Directives

• DirectoryIndex

• DirectorySlash

DirectoryIndex Directive

Description: List of resources to look for when the client requests a directorySyntax: DirectoryIndex local-url [local-url] ...Default: DirectoryIndex index.htmlContext: server config, virtual host, directory, .htaccessOverride: IndexesStatus: BaseModule: mod dir

The DIRECTORYINDEX directive sets the list of resources to look for, when the client requests an index of the directoryby specifying a / at the end of the directory name. Local-url is the (%-encoded) URL of a document on the serverrelative to the requested directory; it is usually the name of a file in the directory. Several URLs may be given, inwhich case the server will return the first one that it finds. If none of the resources exist and the Indexes option isset, the server will generate its own listing of the directory.

ExampleDirectoryIndex index.html

then a request for http://myserver/docs/ would return http://myserver/docs/index.html if itexists, or would list the directory if it did not.

Note that the documents do not need to be relative to the directory;

Page 425: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.22. APACHE MODULE MOD DIR 417

DirectoryIndex index.html index.txt /cgi-bin/index.pl

would cause the CGI script /cgi-bin/index.pl to be executed if neither index.html or index.txt existedin a directory.

DirectorySlash Directive

Description: Toggle trailing slash redirects on or offSyntax: DirectorySlash On|OffDefault: DirectorySlash OnContext: server config, virtual host, directory, .htaccessOverride: IndexesStatus: BaseModule: mod dirCompatibility: Available in version 2.0.51 and later

The DIRECTORYSLASH directive determines, whether MOD DIR should fixup URLs pointing to a directory or not.

Typically if a user requests a resource without a trailing slash, which points to a directory, MOD DIR redirects him tothe same resource, but with trailing slash for some good reasons:

• The user is finally requesting the canonical URL of the resource

• MOD AUTOINDEX works correctly. Since it doesn’t emit the path in the link, it would point to the wrong path.

• DIRECTORYINDEX will be evaluated only for directories requested with trailing slash.

• Relative URL references inside html pages will work correctly.

Well, if you don’t want this effect and the reasons above don’t apply to you, you can turn off the redirect with:

# see security warning below!<Location /some/path>

DirectorySlash OffSetHandler some-handler

</Location>

! Security WarningTurning off the trailing slash redirect may result in an information disclosure. Consider asituation where MOD AUTOINDEX is active (Options +Indexes) and DIRECTORYINDEXis set to a valid resource (say, index.html) and there’s no other special handler defined forthat URL. In this case a request with a trailing slash would show the index.html file. Buta request without trailing slash would list the directory contents.

Page 426: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

418 CHAPTER 10. APACHE MODULES

10.23 Apache Module mod disk cache

Description: Content cache storage manager keyed to URIsStatus: ExperimentalModuleIdentifier: disk cache moduleSourceFile: mod disk cache.c

Summary

! This module is experimental. Documentation is still under development...

MOD DISK CACHE implements a disk based storage manager. It is primarily of use in conjunction with MOD PROXY.

Content is stored in and retrieved from the cache using URI based keys. Content with access protection is not cached.

=⇒Note:MOD DISK CACHE requires the services of MOD CACHE.

Directives

• CacheDirLength

• CacheDirLevels

• CacheExpiryCheck

• CacheGcClean

• CacheGcDaily

• CacheGcInterval

• CacheGcMemUsage

• CacheGcUnused

• CacheMaxFileSize

• CacheMinFileSize

• CacheRoot

• CacheSize

• CacheTimeMargin

CacheDirLength Directive

Description: The number of characters in subdirectory namesSyntax: CacheDirLength lengthDefault: CacheDirLength 2Context: server config, virtual hostStatus: ExperimentalModule: mod disk cache

The CACHEDIRLENGTH directive sets the number of characters for each subdirectory name in the cache hierarchy.

=⇒The result of CACHEDIRLEVELS* CACHEDIRLENGTH must not be higher than 20.

CacheDirLength 4

Page 427: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.23. APACHE MODULE MOD DISK CACHE 419

CacheDirLevels Directive

Description: The number of levels of subdirectories in the cache.Syntax: CacheDirLevels levelsDefault: CacheDirLevels 3Context: server config, virtual hostStatus: ExperimentalModule: mod disk cache

The CACHEDIRLEVELS directive sets the number of subdirectory levels in the cache. Cached data will be saved thismany directory levels below the CACHEROOT directory.

=⇒The result of CACHEDIRLEVELS* CACHEDIRLENGTH must not be higher than 20.

CacheDirLevels 5

CacheExpiryCheck Directive

Description: Indicates if the cache observes Expires dates when seeking filesSyntax: CacheExpiryCheck On|OffDefault: CacheExpiryCheck OnContext: server config, virtual hostStatus: ExperimentalModule: mod disk cache

More detail will be added here, when the function is implemented.

CacheExpiryCheck Off

! The CACHEEXPIRYCHECK directive is currently not implemented.

CacheGcClean Directive

Description: The time to retain unchanged cached files that match a URLSyntax: CacheGcClean hours url-stringDefault: CacheGcClean ?Context: server config, virtual hostStatus: ExperimentalModule: mod disk cache

More detail will be added here, when the function is implemented.

CacheGcClean 12 /daily scripts

! The CACHEGCCLEAN directive is currently not implemented.

Page 428: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

420 CHAPTER 10. APACHE MODULES

CacheGcDaily Directive

Description: The recurring time each day for garbage collection to be run. (24 hour clock)Syntax: CacheGcDaily timeDefault: CacheGcDaily ?Context: server config, virtual hostStatus: ExperimentalModule: mod disk cache

More detail will be added here, when the function is implemented.

CacheGcDaily 23:59

! The CACHEGCDAILY directive is currently not implemented.

CacheGcInterval Directive

Description: The interval between garbage collection attempts.Syntax: CacheGcInterval hoursContext: server config, virtual hostStatus: ExperimentalModule: mod disk cache

The CACHEGCINTERVAL directive specifies the number of hours to wait between attempts to free up disk space.

More detail will be added here, when the function is implemented.

CacheGcInterval 24

! The CACHEGCINTERVAL directive is currently not implemented.

CacheGcMemUsage Directive

Description: The maximum kilobytes of memory used for garbage collectionSyntax: CacheGcMemUsage KBytesDefault: CacheGcMemUsage ?Context: server config, virtual hostStatus: ExperimentalModule: mod disk cache

More detail will be added here, when the function is implemented.

CacheGcMemUsage 16

! The CACHEGCMEMUSAGE directive is currently not implemented.

Page 429: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.23. APACHE MODULE MOD DISK CACHE 421

CacheGcUnused Directive

Description: The time to retain unreferenced cached files that match a URL.Syntax: CacheGcUnused hours url-stringDefault: CacheGcUnused ?Context: server config, virtual hostStatus: ExperimentalModule: mod disk cache

More detail will be added here, when the function is implemented.

CacheGcUnused 12 /local images

! The CACHEGCUNUSED directive is currently not implemented.

CacheMaxFileSize Directive

Description: The maximum size (in bytes) of a document to be placed in the cacheSyntax: CacheMaxFileSize bytesDefault: CacheMaxFileSize 1000000Context: server config, virtual hostStatus: ExperimentalModule: mod disk cache

The CACHEMAXFILESIZE directive sets the maximum size, in bytes, for a document to be considered for storage inthe cache.

CacheMaxFileSize 64000

CacheMinFileSize Directive

Description: The minimum size (in bytes) of a document to be placed in the cacheSyntax: CacheMinFileSize bytesDefault: CacheMinFileSize 1Context: server config, virtual hostStatus: ExperimentalModule: mod disk cache

The CACHEMINFILESIZE directive sets the minimum size, in bytes, for a document to be considered for storage inthe cache.

CacheMinFileSize 64

CacheRoot Directive

Description: The directory root under which cache files are storedSyntax: CacheRoot directoryContext: server config, virtual hostStatus: ExperimentalModule: mod disk cache

Page 430: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

422 CHAPTER 10. APACHE MODULES

The CACHEROOT directive defines the name of the directory on the disk to contain cache files. If theMOD DISK CACHE module has been loaded or compiled in to the Apache server, this directive must be defined. Fail-ing to provide a value for CACHEROOT will result in a configuration file processing error. The CACHEDIRLEVELSand CACHEDIRLENGTH directives define the structure of the directories under the specified root directory.

CacheRoot c:/cacheroot

CacheSize Directive

Description: The maximum amount of disk space that will be used by the cache in KBytesSyntax: CacheSize KBytesDefault: CacheSize 1000000Context: server config, virtual hostStatus: ExperimentalModule: mod disk cache

The CACHESIZE directive sets the desired disk space usage of the cache, in KBytes (1024-byte units). This directivedoes not put a hard limit on the size of the cache. The garbage collector will delete files until the usage is at or belowthe settings. Always use a value that is lower than the available disk space.

CacheSize 5000000

CacheTimeMargin Directive

Description: The minimum time margin to cache a documentSyntax: CacheTimeMargin ?Default: CacheTimeMargin ?Context: server config, virtual hostStatus: ExperimentalModule: mod disk cache

More detail will be added here, when the function is implemented.

CacheTimeMargin X

! The CACHETIMEMARGIN directive is currently not implemented.

Page 431: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.24. APACHE MODULE MOD DUMPIO 423

10.24 Apache Module mod dumpio

Description: Dumps all I/O to error log as desired.Status: ExperimentalModuleIdentifier: dumpio moduleSourceFile: mod dumpio.c

Summary

mod dumpio allows for the logging of all input received by Apache and/or all output sent by Apache to be logged(dumped) to the error.log file.

The data logging is done right after SSL decoding (for input) and right before SSL encoding (for output). As can beexpected, this can produce extreme volumes of data, and should only be used when debugging problems.

Directives

• DumpIOInput

• DumpIOOutput

Enabling dumpio Support

To enable the module, it should be compiled and loaded in to your running Apache configuration. Logging can thenbe enabled or disabled via the below directives.

In order for dumping to work LOGLEVEL must be set to debug.

DumpIOInput Directive

Description: Dump all input data to the error logSyntax: DumpIOInput On|OffDefault: DumpIOInput OffContext: server configStatus: ExperimentalModule: mod dumpioCompatibility: DumpIOInput is only available in Apache 2.0.53 and later.

Enable dumping of all input.

ExampleDumpIOInput On

DumpIOOutput Directive

Description: Dump all output data to the error logSyntax: DumpIOOutput On|OffDefault: DumpIOOutput OffContext: server configStatus: ExperimentalModule: mod dumpioCompatibility: DumpIOOutput is only available in Apache 2.0.53 and later.

Page 432: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

424 CHAPTER 10. APACHE MODULES

Enable dumping of all output.

ExampleDumpIOOutput On

Page 433: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.25. APACHE MODULE MOD ECHO 425

10.25 Apache Module mod echo

Description: A simple echo server to illustrate protocol modulesStatus: ExperimentalModuleIdentifier: echo moduleSourceFile: mod echo.cCompatibility: Available in Apache 2.0 and later

Summary

This module provides an example protocol module to illustrate the concept. It provides a simple echo server. Telnetto it and type stuff, and it will echo it.

Directives

• ProtocolEcho

ProtocolEcho Directive

Description: Turn the echo server on or offSyntax: ProtocolEcho On|OffDefault: ProtocolEcho OffContext: server config, virtual hostStatus: ExperimentalModule: mod echoCompatibility: ProtocolEcho is only available in 2.0 and later.

The PROTOCOLECHO directive enables or disables the echo server.

ExampleProtocolEcho On

Page 434: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

426 CHAPTER 10. APACHE MODULES

10.26 Apache Module mod env

Description: Modifies the environment which is passed to CGI scripts and SSI pagesStatus: BaseModuleIdentifier: env moduleSourceFile: mod env.c

Summary

This module allows for control of the environment that will be provided to CGI scripts and SSI pages. Environmentvariables may be passed from the shell which invoked the httpd process. Alternatively, environment variables maybe set or unset within the configuration process.

Directives

• PassEnv

• SetEnv

• UnsetEnv

See also

• Environment Variables (p. 60)

PassEnv Directive

Description: Passes environment variables from the shellSyntax: PassEnv env-variable [env-variable] ...Context: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod env

Specifies one or more environment variables to pass to CGI scripts and SSI pages from the environment of the shellwhich invoked the httpd process.

ExamplePassEnv LD LIBRARY PATH

SetEnv Directive

Description: Sets environment variablesSyntax: SetEnv env-variable valueContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod env

Sets an environment variable, which is then passed on to CGI scripts and SSI pages.

ExampleSetEnv SPECIAL PATH /foo/bin

Page 435: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.26. APACHE MODULE MOD ENV 427

UnsetEnv Directive

Description: Removes variables from the environmentSyntax: UnsetEnv env-variable [env-variable] ...Context: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod env

Removes one or more environment variables from those passed on to CGI scripts and SSI pages.

ExampleUnsetEnv LD LIBRARY PATH

Page 436: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

428 CHAPTER 10. APACHE MODULES

10.27 Apache Module mod example

Description: Illustrates the Apache module APIStatus: ExperimentalModuleIdentifier: example moduleSourceFile: mod example.c

Summary

! This document has not been updated to take into account changes made in the 2.0 version ofthe Apache HTTP Server. Some of the information may still be relevant, but please use it withcare.

The files in the src/modules/example directory under the Apache distribution directory tree are providedas an example to those that wish to write modules that use the Apache API.

The main file is mod example.c, which illustrates all the different callback mechanisms and call syntaxes. By nomeans does an add-on module need to include routines for all of the callbacks - quite the contrary!

The example module is an actual working module. If you link it into your server, enable the "example-handler"handler for a location, and then browse to that location, you will see a display of some of the tracing the examplemodule did as the various callbacks were made.

Directives

• Example

Compiling the example module

To include the example module in your server, follow the steps below:

1. Uncomment the "AddModule modules/example/mod example" line near the bottom of thesrc/Configuration file. If there isn’t one, add it; it should look like this:

AddModule modules/example/mod example.o

2. Run the src/Configure script ("cdsrc;./Configure"). This will build the Makefile for the serveritself, and update the src/modules/Makefile for any additional modules you have requested from beneaththat subdirectory.

3. Make the server (run "make" in the src directory).

To add another module of your own:

1. mkdir src/modules/mymodule

2. cp src/modules/example/* src/modules/mymodule

3. Modify the files in the new directory.

4. Follow steps [1] through [3] above, with appropriate changes.

Page 437: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.27. APACHE MODULE MOD EXAMPLE 429

Using the mod example Module

To activate the example module, include a block similar to the following in your srm.conf file:

<Location /example-info>SetHandler example-handler

</Location>

As an alternative, you can put the following into a .htaccess (p. 302) file and then request the file "test.example"from that location:

AddHandler example-handler .example

After reloading/restarting your server, you should be able to browse to this location and see the brief display mentionedearlier.

Example Directive

Description: Demonstration directive to illustrate the Apache module APISyntax: ExampleContext: server config, virtual host, directory, .htaccessStatus: ExperimentalModule: mod example

The EXAMPLE directive just sets a demonstration flag which the example module’s content handler displays. It takesno arguments. If you browse to an URL to which the example content-handler applies, you will get a display of theroutines within the module and how and in what order they were called to service the document request. The effect ofthis directive one can observe under the point "Example directive declared here: YES/NO".

Page 438: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

430 CHAPTER 10. APACHE MODULES

10.28 Apache Module mod expires

Description: Generation of Expires and Cache-Control HTTP headers according to user-specified criteria

Status: ExtensionModuleIdentifier: expires moduleSourceFile: mod expires.c

Summary

This module controls the setting of the Expires HTTP header and the max-age directive of the Cache-ControlHTTP header in server responses. The expiration date can set to be relative to either the time the source file was lastmodified, or to the time of the client access.

These HTTP headers are an instruction to the client about the document’s validity and persistence. If cached, thedocument may be fetched from the cache rather than from the source until this time has passed. After that, the cachecopy is considered "expired" and invalid, and a new copy must be obtained from the source.

To modify Cache-Control directives other than max-age (see RFC 2616 section 14.916), you can use theHEADER directive.

Directives

• ExpiresActive

• ExpiresByType

• ExpiresDefault

Alternate Interval Syntax

The EXPIRESDEFAULT and EXPIRESBYTYPE directives can also be defined in a more readable syntax of the form:

ExpiresDefault "<base> [plus] {<num> <type>}*"ExpiresByType type/encoding "<base> [plus] {<num> <type>}*"

where <base> is one of:

• access

• now (equivalent to ’access’)

• modification

The plus keyword is optional. <num> should be an integer value [acceptable to atoi()], and <type> is one of:

• years

• months

• weeks

• days

• hours

16http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9

Page 439: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.28. APACHE MODULE MOD EXPIRES 431

• minutes

• seconds

For example, any of the following directives can be used to make documents expire 1 month after being accessed, bydefault:

ExpiresDefault "access plus 1 month"ExpiresDefault "access plus 4 weeks"

ExpiresDefault "access plus 30 days"

The expiry time can be fine-tuned by adding several ’<num> <type>’ clauses:

ExpiresByType text/html "access plus 1 month 15 days 2 hours"

ExpiresByType image/gif "modification plus 5 hours 3 minutes"

Note that if you use a modification date based setting, the Expires header will not be added to content that does notcome from a file on disk. This is due to the fact that there is no modification time for such content.

ExpiresActive Directive

Description: Enables generation of Expires headersSyntax: ExpiresActive On|OffContext: server config, virtual host, directory, .htaccessOverride: IndexesStatus: ExtensionModule: mod expires

This directive enables or disables the generation of the Expires and Cache-Control headers for the documentrealm in question. (That is, if found in an .htaccess file, for instance, it applies only to documents generated fromthat directory.) If set to Off, the headers will not be generated for any document in the realm (unless overridden ata lower level, such as an .htaccess file overriding a server config file). If set to On, the headers will be added toserved documents according to the criteria defined by the EXPIRESBYTYPE and EXPIRESDEFAULT directives (q.v.).

Note that this directive does not guarantee that an Expires or Cache-Control header will be generated. If thecriteria aren’t met, no header will be sent, and the effect will be as though this directive wasn’t even specified.

ExpiresByType Directive

Description: Value of the Expires header configured by MIME typeSyntax: ExpiresByType MIME-type <code>secondsContext: server config, virtual host, directory, .htaccessOverride: IndexesStatus: ExtensionModule: mod expires

This directive defines the value of the Expires header and the max-age directive of the Cache-Control headergenerated for documents of the specified type (e.g., text/html). The second argument sets the number of secondsthat will be added to a base time to construct the expiration date. The Cache-Control: max-age is calculatedby subtracting the request time from the expiration date and expressing the result in seconds.

The base time is either the last modification time of the file, or the time of the client’s access to the document. Whichshould be used is specified by the <code> field; M means that the file’s last modification time should be used as thebase time, and A means the client’s access time should be used.

Page 440: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

432 CHAPTER 10. APACHE MODULES

The difference in effect is subtle. If M is used, all current copies of the document in all caches will expire at the sametime, which can be good for something like a weekly notice that’s always found at the same URL. If A is used, thedate of expiration is different for each client; this can be good for image files that don’t change very often, particularlyfor a set of related documents that all refer to the same images (i.e., the images will be accessed repeatedly within arelatively short timespan).

Example:# enable expirationsExpiresActive On# expire GIF images after a month in the client’s cacheExpiresByType image/gif A2592000# HTML documents are good for a week from the# time they were changed

ExpiresByType text/html M604800

Note that this directive only has effect if ExpiresActive On has been specified. It overrides, for the specifiedMIME type only, any expiration date set by the EXPIRESDEFAULT directive.

You can also specify the expiration time calculation using an alternate syntax, described earlier in this document.

ExpiresDefault Directive

Description: Default algorithm for calculating expiration timeSyntax: ExpiresDefault <code>secondsContext: server config, virtual host, directory, .htaccessOverride: IndexesStatus: ExtensionModule: mod expires

This directive sets the default algorithm for calculating the expiration time for all documents in the affected realm. Itcan be overridden on a type-by-type basis by the EXPIRESBYTYPE directive. See the description of that directive fordetails about the syntax of the argument, and the alternate syntax description as well.

Page 441: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.29. APACHE MODULE MOD EXT FILTER 433

10.29 Apache Module mod ext filter

Description: Pass the response body through an external program before delivery to the clientStatus: ExtensionModuleIdentifier: ext filter moduleSourceFile: mod ext filter.c

Summary

MOD EXT FILTER presents a simple and familiar programming model for filters (p. 67) . With this module, a programwhich reads from stdin and writes to stdout (i.e., a Unix-style filter command) can be a filter for Apache. This filteringmechanism is much slower than using a filter which is specially written for the Apache API and runs inside of theApache server process, but it does have the following benefits:

• the programming model is much simpler

• any programming/scripting language can be used, provided that it allows the program to read from standardinput and write to standard output

• existing programs can be used unmodified as Apache filters

Even when the performance characteristics are not suitable for production use, MOD EXT FILTER can be used as aprototype environment for filters.

Directives

• ExtFilterDefine

• ExtFilterOptions

See also

• Filters (p. 67)

Page 442: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

434 CHAPTER 10. APACHE MODULES

Examples

Generating HTML from some other type of response

# mod ext filter directive to define a filter# to HTML-ize text/c files using the external# program /usr/bin/enscript, with the type of# the result set to text/htmlExtFilterDefine c-to-html mode=output \

intype=text/c outtype=text/html \cmd="/usr/bin/enscript --color -W html -Ec -o - -"

<Directory "/export/home/trawick/apacheinst/htdocs/c">

# core directive to cause the new filter to# be run on outputSetOutputFilter c-to-html

# mod mime directive to set the type of .c# files to text/cAddType text/c .c

# mod ext filter directive to set the debug# level just high enough to see a log message# per request showing the configuration in forceExtFilterOptions DebugLevel=1

</Directory>

Implementing a content encoding filter

Note: this gzip example is just for the purposes of illustration. Please refer to MOD DEFLATE for a practical imple-mentation.

# mod ext filter directive to define the external filterExtFilterDefine gzip mode=output cmd=/bin/gzip

<Location /gzipped>

# core directive to cause the gzip filter to be# run on outputSetOutputFilter gzip

# mod header directive to add# "Content-Encoding: gzip" header fieldHeader set Content-Encoding gzip

</Location>

Page 443: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.29. APACHE MODULE MOD EXT FILTER 435

Slowing down the server

# mod ext filter directive to define a filter# which runs everything through cat; cat doesn’t# modify anything; it just introduces extra pathlength# and consumes more resourcesExtFilterDefine slowdown mode=output cmd=/bin/cat \

preservescontentlength

<Location />

# core directive to cause the slowdown filter to# be run several times on output#SetOutputFilter slowdown;slowdown;slowdown

</Location>

Using sed to replace text in the response

# mod ext filter directive to define a filter which# replaces text in the response#ExtFilterDefine fixtext mode=output intype=text/html \

cmd="/bin/sed s/verdana/arial/g"

<Location />

# core directive to cause the fixtext filter to# be run on outputSetOutputFilter fixtext

</Location>

Page 444: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

436 CHAPTER 10. APACHE MODULES

Tracing another filter

# Trace the data read and written by mod deflate# for a particular client (IP 192.168.1.31)# experiencing compression problems.# This filter will trace what goes into mod deflate.ExtFilterDefine tracebefore \

cmd="/bin/tracefilter.pl /tmp/tracebefore" \EnableEnv=trace this client

# This filter will trace what goes after mod deflate.# Note that without the ftype parameter, the default# filter type of AP FTYPE RESOURCE would cause the# filter to be placed *before* mod deflate in the filter# chain. Giving it a numeric value slightly higher than# AP FTYPE CONTENT SET will ensure that it is placed# after mod deflate.ExtFilterDefine traceafter \

cmd="/bin/tracefilter.pl /tmp/traceafter" \EnableEnv=trace this client ftype=21

<Directory /usr/local/docs>

SetEnvIf Remote Addr 192.168.1.31 trace this clientSetOutputFilter tracebefore;deflate;traceafter

</Directory>

Here is the filter which traces the data:#!/usr/local/bin/perl -wuse strict;

open(SAVE, ">$ARGV[0]")

or die "can’t open $ARGV[0]: $?";

while (<STDIN>) {print SAVE $ ;print $ ;

}close(SAVE);

ExtFilterDefine Directive

Description: Define an external filterSyntax: ExtFilterDefine filtername parametersContext: server configStatus: ExtensionModule: mod ext filter

The EXTFILTERDEFINE directive defines the characteristics of an external filter, including the program to run and itsarguments.

filtername specifies the name of the filter being defined. This name can then be used in SetOutputFilter directives. Itmust be unique among all registered filters. At the present time, no error is reported by the register-filter API, so aproblem with duplicate names isn’t reported to the user.

Subsequent parameters can appear in any order and define the external command to run and certain other characteris-tics. The only required parameter is cmd=. These parameters are:

Page 445: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.29. APACHE MODULE MOD EXT FILTER 437

cmd=cmdline The cmd= keyword allows you to specify the external command to run. If there are arguments afterthe program name, the command line should be surrounded in quotation marks (e.g., cmd="/bin/mypgmarg1 arg2". Normal shell quoting is not necessary since the program is run directly, bypassing the shell.Program arguments are blank-delimited. A backslash can be used to escape blanks which should be part of aprogram argument. Any backslashes which are part of the argument must be escaped with backslash themselves.In addition to the standard CGI environment variables, DOCUMENT URI, DOCUMENT PATH INFO, andQUERY STRING UNESCAPED will also be set for the program.

mode=mode mode should be output for now (the default). In the future, mode=input will be used to specify afilter for request bodies.

intype=imt This parameter specifies the internet media type (i.e., MIME type) of documents which should befiltered. By default, all documents are filtered. If intype= is specified, the filter will be disabled for documentsof other types.

outtype=imt This parameter specifies the internet media type (i.e., MIME type) of filtered documents. It is usefulwhen the filter changes the internet media type as part of the filtering operation. By default, the internet mediatype is unchanged.

PreservesContentLength The PreservesContentLength keyword specifies that the filter preserves thecontent length. This is not the default, as most filters change the content length. In the event that the filterdoesn’t modify the length, this keyword should be specified.

ftype=filtertype This parameter specifies the numeric value for filter type that the filter should be registered as.The default value, AP FTYPE RESOURCE, is sufficient in most cases. If the filter needs to operate at a differentpoint in the filter chain than resource filters, then this parameter will be necessary. See the AP FTYPE foodefinitions in util filter.h for appropriate values.

disableenv=env This parameter specifies the name of an environment variable which, if set, will disable thefilter.

enableenv=env This parameter specifies the name of an environment variable which must be set, or the filter willbe disabled.

ExtFilterOptions Directive

Description: Configure MOD EXT FILTER optionsSyntax: ExtFilterOptions option [option] ...Default: ExtFilterOptions DebugLevel=0 NoLogStderrContext: directoryStatus: ExtensionModule: mod ext filter

The EXTFILTEROPTIONS directive specifies special processing options for MOD EXT FILTER. Option can be one of

DebugLevel=n The DebugLevel keyword allows you to specify the level of debug messages generated byMOD EXT FILTER. By default, no debug messages are generated. This is equivalent to DebugLevel=0.With higher numbers, more debug messages are generated, and server performance will be degraded. The ac-tual meanings of the numeric values are described with the definitions of the DBGLVL constants near thebeginning of mod ext filter.c.

Note: The core directive LOGLEVEL should be used to cause debug messages to be stored in the Apache errorlog.

LogStderr | NoLogStderr The LogStderr keyword specifies that messages written to standard error by theexternal filter program will be saved in the Apache error log. NoLogStderr disables this feature.

Page 446: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

438 CHAPTER 10. APACHE MODULES

ExampleExtFilterOptions LogStderr DebugLevel=0

Messages written to the filter’s standard error will be stored in the Apache error log. No debug messages will begenerated by MOD EXT FILTER.

Page 447: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.30. APACHE MODULE MOD FILE CACHE 439

10.30 Apache Module mod file cache

Description: Caches a static list of files in memoryStatus: ExperimentalModuleIdentifier: file cache moduleSourceFile: mod file cache.c

Summary

! This module should be used with care. You can easily create a broken site usingMOD FILE CACHE, so read this document carefully.

Caching frequently requested files that change very infrequently is a technique for reducing server load.MOD FILE CACHE provides two techniques for caching frequently requested static files. Through configuration di-rectives, you can direct MOD FILE CACHE to either open then mmap() a file, or to pre-open a file and save the file’sopen file handle. Both techniques reduce server load when processing requests for these files by doing part of the work(specifically, the file I/O) for serving the file when the server is started rather than during each request.

Notice: You cannot use this for speeding up CGI programs or other files which are served by special content handlers.It can only be used for regular files which are usually served by the Apache core content handler.

This module is an extension of and borrows heavily from the mod mmap static module in Apache 1.3.

Directives

• CacheFile

• MMapFile

Using mod file cache

MOD FILE CACHE caches a list of statically configured files via MMAPFILE or CACHEFILE directives in the mainserver configuration.

Not all platforms support both directives. For example, Apache on Windows does not currently support the MMAP-STATIC directive, while other platforms, like AIX, support both. You will receive an error message in the server errorlog if you attempt to use an unsupported directive. If given an unsupported directive, the server will start but the filewill not be cached. On platforms that support both directives, you should experiment with both to see which worksbest for you.

MMapFile Directive

The MMAPFILE directive of MOD FILE CACHE maps a list of statically configured files into memory through thesystem call mmap(). This system call is available on most modern Unix derivates, but not on all. There are sometimessystem-specific limits on the size and number of files that can be mmap()ed, experimentation is probably the easiestway to find out.

This mmap()ing is done once at server start or restart, only. So whenever one of the mapped files changes onthe filesystem you have to restart the server (see the Stopping and Restarting (p. 16) documentation). To reiteratethat point: if the files are modified in place without restarting the server you may end up serving requests that arecompletely bogus. You should update files by unlinking the old copy and putting a new copy in place. Most tools suchas rdist and mv do this. The reason why this modules doesn’t take care of changes to the files is that this checkwould need an extra stat() every time which is a waste and against the intent of I/O reduction.

Page 448: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

440 CHAPTER 10. APACHE MODULES

CacheFile Directive

The CACHEFILE directive of MOD FILE CACHE opens an active handle or file descriptor to the file (or files) listedin the configuration directive and places these open file handles in the cache. When the file is requested, the serverretrieves the handle from the cache and passes it to the sendfile() (or TransmitFile() on Windows), socketAPI.

This file handle caching is done once at server start or restart, only. So whenever one of the cached files changeson the filesystem you have to restart the server (see the Stopping and Restarting (p. 16) documentation). To reiteratethat point: if the files are modified in place without restarting the server you may end up serving requests that arecompletely bogus. You should update files by unlinking the old copy and putting a new copy in place. Most tools suchas rdist and mv do this.

=⇒NoteDon’t bother asking for a directive which recursively caches all the files in a directory. Try thisinstead... See the INCLUDE directive, and consider this command:

find /www/htdocs -type f -print \| sed -e ’s/.*/mmapfile &/’ > /www/conf/mmap.conf

CacheFile Directive

Description: Cache a list of file handles at startup timeSyntax: CacheFile file-path [file-path] ...Context: server configStatus: ExperimentalModule: mod file cache

The CACHEFILE directive opens handles to one or more files (given as whitespace separated arguments) and placesthese handles into the cache at server startup time. Handles to cached files are automatically closed on a servershutdown. When the files have changed on the filesystem, the server should be restarted to to re-cache them.

Be careful with the file-path arguments: They have to literally match the filesystem path Apache’s URL-to-filenametranslation handlers create. We cannot compare inodes or other stuff to match paths through symbolic links etc.because that again would cost extra stat() system calls which is not acceptable. This module may or may not workwith filenames rewritten by MOD ALIAS or MOD REWRITE.

ExampleCacheFile /usr/local/apache/htdocs/index.html

MMapFile Directive

Description: Map a list of files into memory at startup timeSyntax: MMapFile file-path [file-path] ...Context: server configStatus: ExperimentalModule: mod file cache

The MMAPFILE directive maps one or more files (given as whitespace separated arguments) into memory at serverstartup time. They are automatically unmapped on a server shutdown. When the files have changed on the filesystemat least a HUP or USR1 signal should be send to the server to re-mmap() them.

Page 449: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.30. APACHE MODULE MOD FILE CACHE 441

Be careful with the file-path arguments: They have to literally match the filesystem path Apache’s URL-to-filenametranslation handlers create. We cannot compare inodes or other stuff to match paths through symbolic links etc.because that again would cost extra stat() system calls which is not acceptable. This module may or may not workwith filenames rewritten by MOD ALIAS or MOD REWRITE.

ExampleMMapFile /usr/local/apache/htdocs/index.html

Page 450: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

442 CHAPTER 10. APACHE MODULES

10.31 Apache Module mod headers

Description: Customization of HTTP request and response headersStatus: ExtensionModuleIdentifier: headers moduleSourceFile: mod headers.c

Summary

This module provides directives to control and modify HTTP request and response headers. Headers can be merged,replaced or removed.

Directives

• Header

• RequestHeader

Order of Processing

The directives provided by MOD HEADERS can occur almost anywhere within the server configuration. They are validin the main server config and virtual host sections, inside <DIRECTORY>, <LOCATION> and <FILES> sections,and within .htaccess files.

The directives are processed in the following order:

1. main server

2. virtual host

3. <DIRECTORY> sections and .htaccess

4. <FILES>

5. <LOCATION>

Order is important. These two headers have a different effect if reversed:

RequestHeader append MirrorID "mirror 12"

RequestHeader unset MirrorID

This way round, the MirrorID header is not set. If reversed, the MirrorID header is set to "mirror 12".

Examples

1. Copy all request headers that begin with "TS" to the response headers:

Header echo ˆTS

2. Add a header, MyHeader, to the response including a timestamp for when the request was received and howlong it took to begin serving the request. This header can be used by the client to intuit load on the server or inisolating bottlenecks between the client and the server.

Page 451: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.31. APACHE MODULE MOD HEADERS 443

Header add MyHeader "%D %t"

results in this header being added to the response:

MyHeader: D=3775428 t=991424704447256

3. Say hello to Joe

Header add MyHeader "Hello Joe. It took %D microseconds \for Apache to serve this request."

results in this header being added to the response:

MyHeader: Hello Joe. It took D=3775428 microseconds for Apache to

serve this request.

4. Conditionally send MyHeader on the response if and only if header "MyRequestHeader" is present on therequest. This is useful for constructing headers in response to some client stimulus. Note that this examplerequires the services of the MOD SETENVIF module.

SetEnvIf MyRequestHeader value HAVE MyRequestHeader

Header add MyHeader "%D %t mytext" env=HAVE MyRequestHeader

If the header MyRequestHeader: value is present on the HTTP request, the response will contain thefollowing header:

MyHeader: D=3775428 t=991424704447256 mytext

Header Directive

Description: Configure HTTP response headersSyntax: Header [condition] set|append|add|unset|echo header [value]

[env=[!]variable]Context: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: ExtensionModule: mod headersCompatibility: Condition is available in version 2.0.51 and later

This directive can replace, merge or remove HTTP response headers. The header is modified just after the contenthandler and output filters are run, allowing outgoing headers to be modified.

The optional condition can be either onsuccess or always. It determines, which internal header table should beoperated on. onsuccess stands for 2xx status codes and always for all status codes (including 2xx). Especiallyif you want to unset headers set by certain modules, you should try out, which table is affected.

The action it performs is determined by the second argument. This can be one of the following values:

set The response header is set, replacing any previous header with this name. The value may be a format string.

Page 452: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

444 CHAPTER 10. APACHE MODULES

append The response header is appended to any existing header of the same name. When a new value is mergedonto an existing header it is separated from the existing header with a comma. This is the HTTP standard wayof giving a header multiple values.

add The response header is added to the existing set of headers, even if this header already exists. This can resultin two (or more) headers having the same name. This can lead to unforeseen consequences, and in general"append" should be used instead.

unset The response header of this name is removed, if it exists. If there are multiple headers of the same name, allwill be removed.

echo Request headers with this name are echoed back in the response headers. header may be a regular expression.

This argument is followed by a header name, which can include the final colon, but it is not required. Case is ignoredfor set, append, add and unset. The header name for echo is case sensitive and may be a regular expression.

For add, append and set a value is specified as the third argument. If value contains spaces, it should be surroundedby doublequotes. value may be a character string, a string containing format specifiers or a combination of both. Thefollowing format specifiers are supported in value:

%t The time the request was received in Universal Coordinated Time since the epoch (Jan. 1, 1970)measured in microseconds. The value is preceded by t=.

%D The time from when the request was received to the time the headers are sent on the wire. This isa measure of the duration of the request. The value is preceded by D=.

%{FOOBAR}e The contents of the environment variable (p. 60) FOOBAR.

When the HEADER directive is used with the add, append, or set argument, a fourth argument may be used tospecify conditions under which the action will be taken. If the environment variable (p. 60) specified in the env=...argument exists (or if the environment variable does not exist and env=!... is specified) then the action specifiedby the HEADER directive will take effect. Otherwise, the directive will have no effect on the request.

The HEADER directives are processed just before the response is sent to the network. These means that it is possibleto set and/or override most headers, except for those headers added by the header filter.

RequestHeader Directive

Description: Configure HTTP request headersSyntax: RequestHeader set|append|add|unset header [value

[env=[!]variable]]Context: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: ExtensionModule: mod headers

This directive can replace, merge or remove HTTP request headers. The header is modified just before the contenthandler is run, allowing incoming headers to be modified. The action it performs is determined by the first argument.This can be one of the following values:

set The request header is set, replacing any previous header with this name

append The request header is appended to any existing header of the same name. When a new value is merged ontoan existing header it is separated from the existing header with a comma. This is the HTTP standard way ofgiving a header multiple values.

add The request header is added to the existing set of headers, even if this header already exists. This can result in two(or more) headers having the same name. This can lead to unforeseen consequences, and in general appendshould be used instead.

Page 453: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.31. APACHE MODULE MOD HEADERS 445

unset The request header of this name is removed, if it exists. If there are multiple headers of the same name, allwill be removed.

This argument is followed by a header name, which can include the final colon, but it is not required. Case is ignored.For add, append and set a value is given as the third argument. If value contains spaces, it should be surroundedby double quotes. For unset, no value should be given.

When the REQUESTHEADER directive is used with the add, append, or set argument, a fourth argument maybe used to specify conditions under which the action will be taken. If the environment variable (p. 60) specified inthe env=... argument exists (or if the environment variable does not exist and env=!... is specified) then theaction specified by the REQUESTHEADER directive will take effect. Otherwise, the directive will have no effect onthe request.

The REQUESTHEADER directive is processed just before the request is run by its handler in the fixup phase. Thisshould allow headers generated by the browser, or by Apache input filters to be overridden or modified.

Page 454: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

446 CHAPTER 10. APACHE MODULES

10.32 Apache Module mod imap

Description: Server-side imagemap processingStatus: BaseModuleIdentifier: imap moduleSourceFile: mod imap.c

Summary

This module processes .map files, thereby replacing the functionality of the imagemap CGI program. Any directoryor document type configured to use the handler imap-file (using either ADDHANDLER or SETHANDLER) will beprocessed by this module.

The following directive will activate files ending with .map as imagemap files:

AddHandler imap-file map

Note that the following is still supported:

AddType application/x-httpd-imap map

However, we are trying to phase out "magic MIME types" so we are deprecating this method.

Directives

• ImapBase

• ImapDefault

• ImapMenu

New Features

The imagemap module adds some new features that were not possible with previously distributed imagemap programs.

• URL references relative to the Referer: information.

• Default <base> assignment through a new map directive base.

• No need for imagemap.conf file.

• Point references.

• Configurable generation of imagemap menus.

Imagemap File

The lines in the imagemap files can have one of several formats:

directive value [x,y ...]directive value "Menu text" [x,y ...]

directive value x,y ... "Menu text"

The directive is one of base, default, poly, circle, rect, or point. The value is an absolute or relativeURL, or one of the special values listed below. The coordinates are x,y pairs separated by whitespace. The quotedtext is used as the text of the link if a imagemap menu is generated. Lines beginning with ’#’ are comments.

Page 455: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.32. APACHE MODULE MOD IMAP 447

Imagemap File Directives

There are six directives allowed in the imagemap file. The directives can come in any order, but are processed in theorder they are found in the imagemap file.

base Directive Has the effect of <base href="value"> . The non-absolute URLs of the map-file aretaken relative to this value. The base directive overrides IMAPBASE as set in a .htaccess file or inthe server configuration files. In the absence of an IMAPBASE configuration directive, base defaults tohttp://server name/.

base uri is synonymous with base. Note that a trailing slash on the URL is significant.

default Directive The action taken if the coordinates given do not fit any of the poly, circle or rect di-rectives, and there are no point directives. Defaults to nocontent in the absence of an IMAPDEFAULTconfiguration setting, causing a status code of 204 No Content to be returned. The client should keep thesame page displayed.

poly Directive Takes three to one-hundred points, and is obeyed if the user selected coordinates fall within thepolygon defined by these points.

circle Takes the center coordinates of a circle and a point on the circle. Is obeyed if the user selected point is withthe circle.

rect Directive Takes the coordinates of two opposing corners of a rectangle. Obeyed if the point selected is withinthis rectangle.

point Directive Takes a single point. The point directive closest to the user selected point is obeyed if no otherdirectives are satisfied. Note that default will not be followed if a point directive is present and validcoordinates are given.

Values

The values for each of the directives can any of the following:

a URL The URL can be relative or absolute URL. Relative URLs can contain ’..’ syntax and will be resolved relativeto the base value.

base itself will not resolved according to the current value. A statement base mailto: will work properly,though.

map Equivalent to the URL of the imagemap file itself. No coordinates are sent with this, so a menu will be generatedunless IMAPMENU is set to none.

menu Synonymous with map.

referer Equivalent to the URL of the referring document. Defaults to http://servername/ if no Referer:header was present.

nocontent Sends a status code of 204 No Content, telling the client to keep the same page displayed. Validfor all but base.

error Fails with a 500 Server Error. Valid for all but base, but sort of silly for anything but default.

Coordinates

0,0 200,200 A coordinate consists of an x and a y value separated by a comma. The coordinates are separatedfrom each other by whitespace. To accommodate the way Lynx handles imagemaps, should a user select thecoordinate 0,0, it is as if no coordinate had been selected.

Page 456: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

448 CHAPTER 10. APACHE MODULES

Quoted Text

"Menu Text" After the value or after the coordinates, the line optionally may contain text within double quotes.This string is used as the text for the link if a menu is generated:

<a href="http://foo.com/">Menu text</a>

If no quoted text is present, the name of the link will be used as the text:

<a href="http://foo.com/">http://foo.com</a>

If you want to use double quotes within this text, you have to write them as &quot;.

Example Mapfile

#Comments are printed in a ’formatted’ or ’semiformatted’ menu.#And can contain html tags. <hr>base refererpoly map "Could I have a menu, please?" 0,0 0,10 10,10 10,0rect .. 0,0 77,27 "the directory of the referer"circle http://www.inetnebr.com/lincoln/feedback/ 195,0 305,27rect another file "in same directory as referer" 306,0 419,27point http://www.zyzzyva.com/ 100,100point http://www.tripod.com/ 200,200

rect mailto:[email protected] 100,150 200,0 "Bugs?"

Referencing your mapfile

HTML example<a href="/maps/imagemap1.map">

<img ismap src="/images/imagemap1.gif">

</a>

XHTML example<a href="/maps/imagemap1.map">

<img ismap="ismap" src="/images/imagemap1.gif" />

</a>

ImapBase Directive

Description: Default base for imagemap filesSyntax: ImapBase map|referer|URLDefault: ImapBase http://servername/Context: server config, virtual host, directory, .htaccessOverride: IndexesStatus: BaseModule: mod imap

Page 457: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.32. APACHE MODULE MOD IMAP 449

The IMAPBASE directive sets the default base used in the imagemap files. Its value is overridden by a base directivewithin the imagemap file. If not present, the base defaults to http://servername/.

See also

• USECANONICALNAME

ImapDefault Directive

Description: Default action when an imagemap is called with coordinates that are not explicitly mappedSyntax: ImapDefault error|nocontent|map|referer|URLDefault: ImapDefault nocontentContext: server config, virtual host, directory, .htaccessOverride: IndexesStatus: BaseModule: mod imap

The IMAPDEFAULT directive sets the default default used in the imagemap files. Its value is overridden by adefault directive within the imagemap file. If not present, the default action is nocontent, which means thata 204 No Content is sent to the client. In this case, the client should continue to display the original page.

ImapMenu Directive

Description: Action if no coordinates are given when calling an imagemapSyntax: ImapMenu none|formatted|semiformatted|unformattedContext: server config, virtual host, directory, .htaccessOverride: IndexesStatus: BaseModule: mod imap

The IMAPMENU directive determines the action taken if an imagemap file is called without valid coordinates.

none If ImapMenu is none, no menu is generated, and the default action is performed.

formatted A formatted menu is the simplest menu. Comments in the imagemap file are ignored. A level oneheader is printed, then an hrule, then the links each on a separate line. The menu has a consistent, plain lookclose to that of a directory listing.

semiformatted In the semiformatted menu, comments are printed where they occur in the imagemap file.Blank lines are turned into HTML breaks. No header or hrule is printed, but otherwise the menu is the same asa formatted menu.

unformatted Comments are printed, blank lines are ignored. Nothing is printed that does not appear in the im-agemap file. All breaks and headers must be included as comments in the imagemap file. This gives you themost flexibility over the appearance of your menus, but requires you to treat your map files as HTML instead ofplaintext.

Page 458: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

450 CHAPTER 10. APACHE MODULES

10.33 Apache Module mod include

Description: Server-parsed html documents (Server Side Includes)Status: BaseModuleIdentifier: include moduleSourceFile: mod include.cCompatibility: Implemented as an output filter since Apache 2.0

Summary

This module provides a filter which will process files before they are sent to the client. The processing is controlledby specially formatted SGML comments, referred to as elements. These elements allow conditional text, the inclusionof other files or programs, as well as the setting and printing of environment variables.

Directives

• SSIEndTag

• SSIErrorMsg

• SSIStartTag

• SSITimeFormat

• SSIUndefinedEcho

• XBitHack

See also

• OPTIONS

• ACCEPTPATHINFO

• International Customized Server Error Messages (p. 273)

• Filters (p. 67)

• SSI Tutorial (p. 191)

Enabling Server-Side Includes

Server Side Includes are implemented by the INCLUDES filter (p. 67) . If documents containing server-side includedirectives are given the extension .shtml, the following directives will make Apache parse them and assign the resultingdocument the mime type of text/html:

AddType text/html .shtml

AddOutputFilter INCLUDES .shtml

The following directive must be given for the directories containing the shtml files (typically in a <DIRECTORY>section, but this directive is also valid in .htaccess files if ALLOWOVERRIDE Options is set):

Options +Includes

For backwards compatibility, the server-parsed handler (p. 65) also activates the INCLUDES filter. As well,Apache will activate the INCLUDES filter for any document with mime type text/x-server-parsed-html ortext/x-server-parsed-html3 (and the resulting output will have the mime type text/html).

For more information, see our Tutorial on Server Side Includes (p. 191) .

Page 459: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.33. APACHE MODULE MOD INCLUDE 451

PATH INFO with Server Side Includes

Files processed for server-side includes no longer accept requests with PATH INFO (trailing pathname information)by default. You can use the ACCEPTPATHINFO directive to configure the server to accept requests with PATH INFO.

Basic Elements

The document is parsed as an HTML document, with special commands embedded as SGML comments. A commandhas the syntax:

<!--#element attribute=value attribute=value ... -->

The value will often be enclosed in double quotes, but single quotes (’) and backticks (‘) are also possible. Manycommands only allow a single attribute-value pair. Note that the comment terminator (-->) should be preceded bywhitespace to ensure that it isn’t considered part of an SSI token. Note that the leading <!--# is one token and maynot contain any whitespaces.

The allowed elements are listed in the following table:

Element Descriptionconfig configure output formatsecho print variablesexec execute external programsfsize print size of a fileflastmod print last modification time of a fileinclude include a fileprintenv print all available variablesset set a value of a variable

SSI elements may be defined by modules other than MOD INCLUDE. In fact, the exec element is provided byMOD CGI, and will only be available if this module is loaded.

The config Element

This command controls various aspects of the parsing. The valid attributes are:

errmsg The value is a message that is sent back to the client if an error occurs while parsing the document. Thisoverrides any SSIERRORMSG directives.

sizefmt The value sets the format to be used which displaying the size of a file. Valid values are bytes for a countin bytes, or abbrev for a count in Kb or Mb as appropriate, for example a size of 1024 bytes will be printed as"1K".

timefmt The value is a string to be used by the strftime(3) library routine when printing dates.

The echo Element

This command prints one of the include variables, defined below. If the variable is unset, the result is determined bythe SSIUNDEFINEDECHO directive. Any dates printed are subject to the currently configured timefmt.

Attributes:

var The value is the name of the variable to print.

Page 460: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

452 CHAPTER 10. APACHE MODULES

encoding Specifies how Apache should encode special characters contained in the variable before outputting them.If set to none, no encoding will be done. If set to url, then URL encoding (also known as %-encoding; this isappropriate for use within URLs in links, etc.) will be performed. At the start of an echo element, the default isset to entity, resulting in entity encoding (which is appropriate in the context of a block-level HTML element,e.g. a paragraph of text). This can be changed by adding an encoding attribute, which will remain in effectuntil the next encoding attribute is encountered or the element ends, whichever comes first.

The encoding attribute must precede the corresponding var attribute to be effective, and only special char-acters as defined in the ISO-8859-1 character encoding will be encoded. This encoding process may not havethe desired result if a different character encoding is in use.

! In order to avoid cross-site scripting issues, you should always encode user supplied data.

The exec Element

The exec command executes a given shell command or CGI script. It requires MOD CGI to be present in the server.If OPTIONS IncludesNOEXEC is set, this command is completely disabled. The valid attributes are:

cgi The value specifies a (%-encoded) URL-path to the CGI script. If the path does not begin with a slash (/), then itis taken to be relative to the current document. The document referenced by this path is invoked as a CGI script,even if the server would not normally recognize it as such. However, the directory containing the script must beenabled for CGI scripts (with SCRIPTALIAS or OPTIONS ExecCGI).

The CGI script is given the PATH INFO and query string (QUERY STRING) of the original request from theclient; these cannot be specified in the URL path. The include variables will be available to the script in additionto the standard CGI (p. 399) environment.

Example<!--#exec cgi="/cgi-bin/example.cgi" -->

If the script returns a Location: header instead of output, then this will be translated into an HTML anchor.

The include virtual element should be used in preference to exec cgi. In particular, if you need topass additional arguments to a CGI program, using the query string, this cannot be done with exec cgi, butcan be done with include virtual, as shown here:

<!--#include virtual="/cgi-bin/example.cgi?argument=value" -->

cmd The server will execute the given string using /bin/sh. The include variables are available to the command,in addition to the usual set of CGI variables.

The use of #include virtual is almost always prefered to using either #exec cgi or #exec cmd. Theformer (#include virtual) uses the standard Apache sub-request mechanism to include files or scripts. Itis much better tested and maintained.

In addition, on some platforms, like Win32, and on unix when using suexec (p. 68) , you cannot pass argumentsto a command in an exec directive, or otherwise include spaces in the command. Thus, while the followingwill work under a non-suexec configuration on unix, it will not produce the desired result under Win32, or whenrunning suexec:

<!--#exec cmd="perl /path/to/perlscript arg1 arg2" -->

Page 461: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.33. APACHE MODULE MOD INCLUDE 453

The fsize Element

This command prints the size of the specified file, subject to the sizefmt format specification. Attributes:

file The value is a path relative to the directory containing the current document being parsed.

virtual The value is a (%-encoded) URL-path. If it does not begin with a slash (/) then it is taken to be relative tothe current document. Note, that this does not print the size of any CGI output, but the size of the CGI scriptitself.

The flastmod Element

This command prints the last modification date of the specified file, subject to the timefmt format specification. Theattributes are the same as for the fsize command.

The include Element

This command inserts the text of another document or file into the parsed file. Any included file is subject to the usualaccess control. If the directory containing the parsed file has Options (p. 302) IncludesNOEXEC set, then onlydocuments with a text MIME type (text/plain, text/html etc.) will be included. Otherwise CGI scripts areinvoked as normal using the complete URL given in the command, including any query string.

An attribute defines the location of the document; the inclusion is done for each attribute given to the include command.The valid attributes are:

file The value is a path relative to the directory containing the current document being parsed. It cannot contain../, nor can it be an absolute path. Therefore, you cannot include files that are outside of the document root,or above the current document in the directory structure. The virtual attribute should always be used inpreference to this one.

virtual The value is a (%-encoded) URL-path. The URL cannot contain a scheme or hostname, only a path and anoptional query string. If it does not begin with a slash (/) then it is taken to be relative to the current document.

A URL is constructed from the attribute, and the output the server would return if the URL were accessed bythe client is included in the parsed output. Thus included files can be nested.

If the specified URL is a CGI program, the program will be executed and its output inserted in place of thedirective in the parsed file. You may include a query string in a CGI url:

<!--#include virtual="/cgi-bin/example.cgi?argument=value" -->

include virtual should be used in preference to exec cgi to include the output of CGI programs intoan HTML document.

The printenv Element

This prints out a listing of all existing variables and their values. Special characters are entity encoded (see the echoelement for details) before being output. There are no attributes.

Example<!--#printenv -->

Page 462: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

454 CHAPTER 10. APACHE MODULES

The set Element

This sets the value of a variable. Attributes:

var The name of the variable to set.

value The value to give a variable.

Example<!--#set var="category" value="help" -->

Include Variables

In addition to the variables in the standard CGI environment, these are available for the echo command, for if andelif, and to any program invoked by the document.

DATE GMT The current date in Greenwich Mean Time.

DATE LOCAL The current date in the local time zone.

DOCUMENT NAME The filename (excluding directories) of the document requested by the user.

DOCUMENT URI The (%-decoded) URL path of the document requested by the user. Note that in the case of nestedinclude files, this is not the URL for the current document. Note also that if the URL is modified internally (e.g.by an ALIAS or DIRECTORYINDEX), the modified URL is shown.

LAST MODIFIED The last modification date of the document requested by the user.

QUERY STRING UNESCAPED If a query string is present, this variable contains the (%-decoded) query string, whichis escaped for shell usage (special characters like & etc. are preceded by backslashes).

Variable Substitution

Variable substitution is done within quoted strings in most cases where they may reasonably occur as an argumentto an SSI directive. This includes the config, exec, flastmod, fsize, include, echo, and set directives,as well as the arguments to conditional operators. You can insert a literal dollar sign into the string using backslashquoting:

<!--#if expr="$a = \$test" -->

If a variable reference needs to be substituted in the middle of a character sequence that might otherwise be considereda valid identifier in its own right, it can be disambiguated by enclosing the reference in braces, a la shell substitution:

<!--#set var="Zed" value="${REMOTE HOST} ${REQUEST METHOD}" -->

This will result in the Zed variable being set to "X Y" if REMOTE HOST is "X" and REQUEST METHOD is "Y".

The below example will print "in foo" if the DOCUMENT URI is /foo/file.html, "in bar" if it is/bar/file.html and "in neither" otherwise:

Page 463: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.33. APACHE MODULE MOD INCLUDE 455

<!--#if expr=’"$DOCUMENT URI" = "/foo/file.html"’ -->

in foo

<!--#elif expr=’"$DOCUMENT URI" = "/bar/file.html"’ -->

in bar

<!--#else -->

in neither

<!--#endif -->

Flow Control Elements

The basic flow control elements are:

<!--#if expr="test condition" --><!--#elif expr="test condition" --><!--#else -->

<!--#endif -->

The if element works like an if statement in a programming language. The test condition is evaluated and if the resultis true, then the text until the next elif, else or endif element is included in the output stream.

The elif or else statements are be used to put text into the output stream if the original test condition was false.These elements are optional.

The endif element ends the if element and is required.

test condition is one of the following:

string true if string is not empty

string1 = string2string1 != string2 Compare string1 with string2. If string2 has the form/string2/ then it is treated as a regular expression. Regular expressions are implemented by the PCRE17

engine and have the same syntax as those in perl 518.

If you are matching positive (=), you can capture grouped parts of the regular expression. The captured partsare stored in the special variables $1 .. $9.

Example<!--#if expr="$QUERY STRING = /ˆsid=([a-zA-Z0-9]+)/" -->

<!--#set var="session" value="$1" -->

<!--#endif -->

string1 < string2string1 <= string2string1 > string2string1 >= string2 Comparestring1 with string2. Note, that strings are compared literally (using strcmp(3)). Therefore the string "100"is less than "20".

( test condition ) true if test condition is true

! test condition true if test condition is false

test condition1 && test condition2 true if both test condition1 and test condition2 are true17http://www.pcre.org18http://www.perl.com

Page 464: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

456 CHAPTER 10. APACHE MODULES

test condition1 || test condition2 true if either test condition1 or test condition2 is true

"=" and "!=" bind more tightly than "&&" and "||". "!" binds most tightly. Thus, the following are equivalent:

<!--#if expr="$a = test1 && $b = test2" -->

<!--#if expr="($a = test1) && ($b = test2)" -->

The boolean operators && and || share the same priority. So if you want to bind such an operator more tightly, youshould use parentheses.

Anything that’s not recognized as a variable or an operator is treated as a string. Strings can also be quoted:’string’. Unquoted strings can’t contain whitespace (blanks and tabs) because it is used to separate tokens such asvariables. If multiple strings are found in a row, they are concatenated using blanks. So,

string1string2 results in string1string2

and

’string1string2’ results in string1string2.

=⇒Escaping slashes in regex stringsAll slashes which are not intended to act as delimiters in your regex must be escaped. This isregardless of their meaning to the regex engine.

SSIEndTag Directive

Description: String that ends an include elementSyntax: SSIEndTag tagDefault: SSIEndTag "-->"Context: server config, virtual hostStatus: BaseModule: mod includeCompatibility: Available in version 2.0.30 and later.

This directive changes the string that MOD INCLUDE looks for to mark the end of an include element.

ExampleSSIEndTag "%>"

See also

• SSISTARTTAG

SSIErrorMsg Directive

Description: Error message displayed when there is an SSI errorSyntax: SSIErrorMsg messageDefault: SSIErrorMsg "[an error occurred while processing this

directive]"Context: server config, virtual host, directory, .htaccessOverride: AllStatus: BaseModule: mod includeCompatibility: Available in version 2.0.30 and later.

Page 465: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.33. APACHE MODULE MOD INCLUDE 457

The SSIERRORMSG directive changes the error message displayed when MOD INCLUDE encounters an error. Forproduction servers you may consider changing the default error message to "<!-- Error -->" so that the mes-sage is not presented to the user.

This directive has the same effect as the <!--#config errmsg=message --> element.

ExampleSSIErrorMsg "<!-- Error -->"

SSIStartTag Directive

Description: String that starts an include elementSyntax: SSIStartTag tagDefault: SSIStartTag "<!--#"Context: server config, virtual hostStatus: BaseModule: mod includeCompatibility: Available in version 2.0.30 and later.

This directive changes the string that MOD INCLUDE looks for to mark an include element to process.

You may want to use this option if you have 2 servers parsing the output of a file each processing different commands(possibly at different times).

ExampleSSIStartTag "<%"

SSIEndTag "%>"

The example given above, which also specifies a matching SSIENDTAG, will allow you to use SSI directives as shownin the example below:

SSI directives with alternate start and end tags<%printenv %>

See also

• SSIENDTAG

SSITimeFormat Directive

Description: Configures the format in which date strings are displayedSyntax: SSITimeFormat formatstringDefault: SSITimeFormat "%A, %d-%b-%Y %H:%M:%S %Z"Context: server config, virtual host, directory, .htaccessOverride: AllStatus: BaseModule: mod includeCompatibility: Available in version 2.0.30 and later.

This directive changes the format in which date strings are displayed when echoing DATE environment variables. Theformatstring is as in strftime(3) from the C standard library.

This directive has the same effect as the <!--#config timefmt=formatstring --> element.

Page 466: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

458 CHAPTER 10. APACHE MODULES

ExampleSSITimeFormat "%R, %B %d, %Y"

The above directive would cause times to be displayed in the format "22:26, June 14, 2002".

SSIUndefinedEcho Directive

Description: String displayed when an unset variable is echoedSyntax: SSIUndefinedEcho stringDefault: SSIUndefinedEcho "(none)"Context: server config, virtual hostStatus: BaseModule: mod includeCompatibility: Available in version 2.0.34 and later.

This directive changes the string that MOD INCLUDE displays when a variable is not set and "echoed".

ExampleSSIUndefinedEcho "<!-- undef -->"

XBitHack Directive

Description: Parse SSI directives in files with the execute bit setSyntax: XBitHack on|off|fullDefault: XBitHack offContext: server config, virtual host, directory, .htaccessOverride: OptionsStatus: BaseModule: mod include

The XBITHACK directive controls the parsing of ordinary html documents. This directive only affects files associatedwith the MIME type text/html. XBITHACK can take on the following values:

off No special treatment of executable files.

on Any text/html file that has the user-execute bit set will be treated as a server-parsed html document.

full As for on but also test the group-execute bit. If it is set, then set the Last-modified date of the returnedfile to be the last modified time of the file. If it is not set, then no last-modified date is sent. Setting this bitallows clients and proxies to cache the result of the request.

=⇒NoteYou would not want to use the full option, unless you assure the group-execute bit is unsetfor every SSI script which might #include a CGI or otherwise produces different output oneach hit (or could potentially change on subsequent requests).

Page 467: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.34. APACHE MODULE MOD INFO 459

10.34 Apache Module mod info

Description: Provides a comprehensive overview of the server configurationStatus: ExtensionModuleIdentifier: info moduleSourceFile: mod info.c

Summary

To configure MOD INFO, add the following to your httpd.conf file.

<Location /server-info>

SetHandler server-info

</Location>

You may wish to use MOD ACCESS inside the <LOCATION> directive to limit access to your server configurationinformation:

<Location /server-info>

SetHandler server-infoOrder deny,allowDeny from allAllow from yourcompany.com

</Location>

Once configured, the server information is obtained by accessing http://your.host.dom/server-info

=⇒Note that the configuration files are read by the module at run-time, and therefore the displaymay not reflect the running server’s active configuration if the files have been changed sincethe server was last reloaded. Also, the configuration files must be readable by the user as whichthe server is running (see the USER directive), or else the directive settings will not be listed.It should also be noted that if MOD INFO is compiled into the server, its handler capability isavailable in all configuration files, including per-directory files (e.g., .htaccess). This mayhave security-related ramifications for your site.In particular, this module can leak sensitive information from the configuration directives ofother Apache modules such as system paths, usernames/passwords, database names, etc. Dueto the way this module works there is no way to block information from it. Therefore, thismodule should only be used in a controlled environment and always with caution.

Directives

• AddModuleInfo

AddModuleInfo Directive

Description: Adds additional information to the module information displayed by the server-info handlerSyntax: AddModuleInfo module-name stringContext: server config, virtual hostStatus: ExtensionModule: mod infoCompatibility: Apache 1.3 and above

Page 468: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

460 CHAPTER 10. APACHE MODULES

This allows the content of string to be shown as HTML interpreted, Additional Information for the module module-name. Example:

AddModuleInfo mod auth.c ’See <a \href="http://www.apache.org/docs/2.0/mod/mod auth.html">\http://www.apache.org/docs/2.0/mod/mod auth.html</a>’

Page 469: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.35. APACHE MODULE MOD ISAPI 461

10.35 Apache Module mod isapi

Description: ISAPI Extensions within Apache for WindowsStatus: BaseModuleIdentifier: isapi moduleSourceFile: mod isapi.cCompatibility: Win32 only

Summary

This module implements the Internet Server extension API. It allows Internet Server extensions (e.g. ISAPI .dllmodules) to be served by Apache for Windows, subject to the noted restrictions.

ISAPI extension modules (.dll files) are written by third parties. The Apache Group does not author these modules, sowe provide no support for them. Please contact the ISAPI’s author directly if you are experiencing problems runningtheir ISAPI extension. Please do not post such problems to Apache’s lists or bug reporting pages.

Directives

• ISAPIAppendLogToErrors

• ISAPIAppendLogToQuery

• ISAPICacheFile

• ISAPIFakeAsync

• ISAPILogNotSupported

• ISAPIReadAheadBuffer

Usage

In the server configuration file, use the ADDHANDLER directive to associate ISAPI files with the isapi-handlerhandler, and map it to them with their file extensions. To enable any .dll file to be processed as an ISAPI extension,edit the httpd.conf file and add the following line:

AddHandler isapi-handler .dll

=⇒In versions of the Apache server prior to 2.0.37, use isapi-isa instead ofisapi-handler. The new handler name is not available prior to version 2.0.37. For com-patibility, configurations may continue using isapi-isa through all versions of Apacheprior to 2.3.0.

There is no capability within the Apache server to leave a requested module loaded. However, you may preload andkeep a specific module loaded by using the following syntax in your httpd.conf:

ISAPICacheFile c:/WebWork/Scripts/ISAPI/mytest.dll

Whether or not you have preloaded an ISAPI extension, all ISAPI extensions are governed by the same permissionsand restrictions as CGI scripts. That is, OPTIONS ExecCGI must be set for the directory that contains the ISAPI .dllfile.

Review the Additional Notes and the Programmer’s Journal for additional details and clarification of the specific ISAPIsupport offered by MOD ISAPI.

Page 470: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

462 CHAPTER 10. APACHE MODULES

Additional Notes

Apache’s ISAPI implementation conforms to all of the ISAPI 2.0 specification, except for some "Microsoft-specific"extensions dealing with asynchronous I/O. Apache’s I/O model does not allow asynchronous reading and writingin a manner that the ISAPI could access. If an ISA tries to access unsupported features, including async I/O, amessage is placed in the error log to help with debugging. Since these messages can become a flood, the directiveISAPILogNotSupported Off exists to quiet this noise.

Some servers, like Microsoft IIS, load the ISAPI extension into the server and keep it loaded until memory usage istoo high, or unless configuration options are specified. Apache currently loads and unloads the ISAPI extension eachtime it is requested, unless the ISAPICACHEFILE directive is specified. This is inefficient, but Apache’s memorymodel makes this the most effective method. Many ISAPI modules are subtly incompatible with the Apache server,and unloading these modules helps to ensure the stability of the server.

Also, remember that while Apache supports ISAPI Extensions, it does not support ISAPI Filters. Support for filtersmay be added at a later date, but no support is planned at this time.

Programmer’s Journal

If you are programming Apache 2.0 MOD ISAPI modules, you must limit your calls to ServerSupportFunctionto the following directives:

HSE REQ SEND URL REDIRECT RESP Redirect the user to another location.This must be a fully qualified URL (e.g. http://server/location).

HSE REQ SEND URL Redirect the user to another location.This cannot be a fully qualified URL, you are not allowed to pass the protocol or a server name (e.g. simply/location).This redirection is handled by the server, not the browser.

! WarningIn their recent documentation, Microsoft appears to have abandoned the distinction between thetwo HSE REQ SEND URL functions. Apache continues to treat them as two distinct functionswith different requirements and behaviors.

HSE REQ SEND RESPONSE HEADER Apache accepts a response body following the header if it follows the blankline (two consecutive newlines) in the headers string argument. This body cannot contain NULLs, since theheaders argument is NULL terminated.

HSE REQ DONE WITH SESSION Apache considers this a no-op, since the session will be finished when the ISAPIreturns from processing.

HSE REQ MAP URL TO PATH Apache will translate a virtual name to a physical name.

HSE APPEND LOG PARAMETER This logged message may be captured in any of the following logs:

• in the \"%{isapi-parameter}n\" component in a CUSTOMLOG directive• in the %q log component with the ISAPIAPPENDLOGTOQUERY On directive• in the error log with the ISAPIAPPENDLOGTOERRORS On directive

The first option, the %{isapi-parameter}n component, is always available and preferred.

HSE REQ IS KEEP CONN Will return the negotiated Keep-Alive status.

HSE REQ SEND RESPONSE HEADER EX Will behave as documented, although the fKeepConn flag is ignored.

Page 471: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.35. APACHE MODULE MOD ISAPI 463

HSE REQ IS CONNECTED Will report false if the request has been aborted.

Apache returns FALSE to any unsupported call to ServerSupportFunction, and sets the GetLastErrorvalue to ERROR INVALID PARAMETER.

ReadClient retrieves the request body exceeding the initial buffer (defined by ISAPIREADAHEADBUFFER).Based on the ISAPIREADAHEADBUFFER setting (number of bytes to buffer prior to calling the ISAPI handler)shorter requests are sent complete to the extension when it is invoked. If the request is longer, the ISAPI extensionmust use ReadClient to retrieve the remaining request body.

WriteClient is supported, but only with the HSE IO SYNC flag or no option flag (value of 0). Anyother WriteClient request will be rejected with a return value of FALSE, and a GetLastError value ofERROR INVALID PARAMETER.

GetServerVariable is supported, although extended server variables do not exist (as defined by other servers.)All the usual Apache CGI environment variables are available from GetServerVariable, as well as theALL HTTP and ALL RAW values.

Apache 2.0 MOD ISAPI supports additional features introduced in later versions of the ISAPI specification, as well aslimited emulation of async I/O and the TransmitFile semantics. Apache also supports preloading ISAPI .dlls forperformance, neither of which were not available under Apache 1.3 mod isapi.

ISAPIAppendLogToErrors Directive

Description: Record HSE APPEND LOG PARAMETER requests from ISAPI extensions to the error logSyntax: ISAPIAppendLogToErrors on|offDefault: ISAPIAppendLogToErrors offContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod isapi

Record HSE APPEND LOG PARAMETER requests from ISAPI extensions to the server error log.

ISAPIAppendLogToQuery Directive

Description: Record HSE APPEND LOG PARAMETER requests from ISAPI extensions to the query fieldSyntax: ISAPIAppendLogToQuery on|offDefault: ISAPIAppendLogToQuery onContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod isapi

Record HSE APPEND LOG PARAMETER requests from ISAPI extensions to the query field (appended to the CUS-TOMLOG %q component).

ISAPICacheFile Directive

Description: ISAPI .dll files to be loaded at startupSyntax: ISAPICacheFile file-path [file-path] ...Context: server config, virtual hostStatus: BaseModule: mod isapi

Page 472: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

464 CHAPTER 10. APACHE MODULES

Specifies a space-separated list of file names to be loaded when the Apache server is launched, and remain loaded untilthe server is shut down. This directive may be repeated for every ISAPI .dll file desired. The full path name of eachfile should be specified. If the path name is not absolute, it will be treated relative to SERVERROOT.

ISAPIFakeAsync Directive

Description: Fake asynchronous support for ISAPI callbacksSyntax: ISAPIFakeAsync on|offDefault: ISAPIFakeAsync offContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod isapi

While set to on, asynchronous support for ISAPI callbacks is simulated.

ISAPILogNotSupported Directive

Description: Log unsupported feature requests from ISAPI extensionsSyntax: ISAPILogNotSupported on|offDefault: ISAPILogNotSupported offContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod isapi

Logs all requests for unsupported features from ISAPI extensions in the server error log. This may help administratorsto track down problems. Once set to on and all desired ISAPI modules are functioning, it should be set back to off.

ISAPIReadAheadBuffer Directive

Description: Size of the Read Ahead Buffer sent to ISAPI extensionsSyntax: ISAPIReadAheadBuffer sizeDefault: ISAPIReadAheadBuffer 49152Context: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod isapi

Defines the maximum size of the Read Ahead Buffer sent to ISAPI extensions when they are initially invoked. Allremaining data must be retrieved using the ReadClient callback; some ISAPI extensions may not support theReadClient function. Refer questions to the ISAPI extension’s author.

Page 473: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.36. APACHE MODULE MOD LDAP 465

10.36 Apache Module mod ldap

Description: LDAP connection pooling and result caching services for use by other LDAP modulesStatus: ExperimentalModuleIdentifier: ldap moduleSourceFile: util ldap.cCompatibility: Available in version 2.0.41 and later

Summary

This module was created to improve the performance of websites relying on backend connections to LDAP servers.In addition to the functions provided by the standard LDAP libraries, this module adds an LDAP connection pool andan LDAP shared memory cache.

To enable this module, LDAP support must be compiled into apr-util. This is achieved by adding the --with-ldapflag to the configure script when building Apache.

SSL support requires that MOD LDAP be linked with one of the following LDAP SDKs: OpenLDAP SDK19 (both 1.xand 2.x), Novell LDAP SDK20 or the iPlanet(Netscape)21 SDK.

Directives

• LDAPCacheEntries

• LDAPCacheTTL

• LDAPConnectionTimeout

• LDAPOpCacheEntries

• LDAPOpCacheTTL

• LDAPSharedCacheFile

• LDAPSharedCacheSize

• LDAPTrustedCA

• LDAPTrustedCAType

Example Configuration

The following is an example configuration that uses MOD LDAP to increase the performance of HTTP Basic authenti-cation provided by MOD AUTH LDAP.

19http://www.openldap.org/20http://developer.novell.com/ndk/cldap.htm21http://www.iplanet.com/downloads/developer/

Page 474: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

466 CHAPTER 10. APACHE MODULES

# Enable the LDAP connection pool and shared# memory cache. Enable the LDAP cache status# handler. Requires that mod ldap and mod auth ldap# be loaded. Change the "yourdomain.example.com" to# match your domain.

LDAPSharedCacheSize 200000LDAPCacheEntries 1024LDAPCacheTTL 600LDAPOpCacheEntries 1024LDAPOpCacheTTL 600

<Location /ldap-status>

SetHandler ldap-statusOrder deny,allowDeny from allAllow from yourdomain.example.comAuthLDAPEnabled onAuthLDAPURL ldap://127.0.0.1/dc=example,dc=com?uid?oneAuthLDAPAuthoritative onRequire valid-user

</Location>

LDAP Connection Pool

LDAP connections are pooled from request to request. This allows the LDAP server to remain connected and boundready for the next request, without the need to unbind/connect/rebind. The performance advantages are similar to theeffect of HTTP keepalives.

On a busy server it is possible that many requests will try and access the same LDAP server connection simultaneously.Where an LDAP connection is in use, Apache will create a new connection alongside the original one. This ensuresthat the connection pool does not become a bottleneck.

There is no need to manually enable connection pooling in the Apache configuration. Any module using this modulefor access to LDAP services will share the connection pool.

LDAP Cache

For improved performance, MOD LDAP uses an aggressive caching strategy to minimize the number of times that theLDAP server must be contacted. Caching can easily double or triple the throughput of Apache when it is serving pagesprotected with mod auth ldap. In addition, the load on the LDAP server will be significantly decreased.

MOD LDAP supports two types of LDAP caching during the search/bind phase with a search/bind cache and duringthe compare phase with two operation caches. Each LDAP URL that is used by the server has its own set of thesethree caches.

The Search/Bind Cache

The process of doing a search and then a bind is the most time-consuming aspect of LDAP operation, especially if thedirectory is large. The search/bind cache is used to cache all searches that resulted in successful binds. Negative results(i.e., unsuccessful searches, or searches that did not result in a successful bind) are not cached. The rationale behindthis decision is that connections with invalid credentials are only a tiny percentage of the total number of connections,so by not caching invalid credentials, the size of the cache is reduced.

MOD LDAP stores the username, the DN retrieved, the password used to bind, and the time of the bind in the cache.Whenever a new connection is initiated with the same username, MOD LDAP compares the password of the new

Page 475: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.36. APACHE MODULE MOD LDAP 467

connection with the password in the cache. If the passwords match, and if the cached entry is not too old, MOD LDAPbypasses the search/bind phase.

The search and bind cache is controlled with the LDAPCACHEENTRIES and LDAPCACHETTL directives.

Operation Caches

During attribute and distinguished name comparison functions, MOD LDAP uses two operation caches to cache thecompare operations. The first compare cache is used to cache the results of compares done to test for LDAP groupmembership. The second compare cache is used to cache the results of comparisons done between distinguishednames.

The behavior of both of these caches is controlled with the LDAPOPCACHEENTRIES and LDAPOPCACHETTLdirectives.

Monitoring the Cache

MOD LDAP has a content handler that allows administrators to monitor the cache performance. The name of the contenthandler is ldap-status, so the following directives could be used to access the MOD LDAP cache information:

<Location /server/cache-info>

SetHandler ldap-status

</Location>

By fetching the URL http://servername/cache-info, the administrator can get a status report of everycache that is used by MOD LDAP cache. Note that if Apache does not support shared memory, then each httpdinstance has its own cache, so reloading the URL will result in different information each time, depending on whichhttpd instance processes the request.

Using SSL

The ability to create an SSL connections to an LDAP server is defined by the directives LDAPTRUSTEDCA andLDAPTRUSTEDCATYPE. These directives specify the certificate file or database and the certificate type. Wheneverthe LDAP url includes ldaps://, MOD LDAP will establish a secure connection to the LDAP server.

# Establish an SSL LDAP connection. Requires that# mod ldap and mod auth ldap be loaded. Change the# "yourdomain.example.com" to match your domain.

LDAPTrustedCA /certs/certfile.derLDAPTrustedCAType DER FILE

<Location /ldap-status>

SetHandler ldap-statusOrder deny,allowDeny from allAllow from yourdomain.example.comAuthLDAPEnabled onAuthLDAPURL ldaps://127.0.0.1/dc=example,dc=com?uid?oneAuthLDAPAuthoritative onRequire valid-user

</Location>

Page 476: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

468 CHAPTER 10. APACHE MODULES

If MOD LDAP is linked against the Netscape/iPlanet LDAP SDK, it will not talk to any SSL server unless that server hasa certificate signed by a known Certificate Authority. As part of the configuration MOD LDAP needs to be told whereit can find a database containing the known CAs. This database is in the same format as Netscape Communicator’scert7.db database. The easiest way to get this file is to start up a fresh copy of Netscape, and grab the resulting$HOME/.netscape/cert7.db file.

LDAPCacheEntries Directive

Description: Maximum number of entries in the primary LDAP cacheSyntax: LDAPCacheEntries numberDefault: LDAPCacheEntries 1024Context: server configStatus: ExperimentalModule: mod ldap

Specifies the maximum size of the primary LDAP cache. This cache contains successful search/binds. Set it to 0 toturn off search/bind caching. The default size is 1024 cached searches.

LDAPCacheTTL Directive

Description: Time that cached items remain validSyntax: LDAPCacheTTL secondsDefault: LDAPCacheTTL 600Context: server configStatus: ExperimentalModule: mod ldap

Specifies the time (in seconds) that an item in the search/bind cache remains valid. The default is 600 seconds (10minutes).

LDAPConnectionTimeout Directive

Description: Specifies the socket connection timeout in secondsSyntax: LDAPConnectionTimeout secondsContext: server configStatus: ExperimentalModule: mod ldap

Specifies the timeout value (in seconds) in which the module will attempt to connect to the LDAP server. If a connec-tion is not successful with the timeout period, either an error will be returned or the module will attempt to connect toa secondary LDAP server if one is specified. The default is 10 seconds.

LDAPOpCacheEntries Directive

Description: Number of entries used to cache LDAP compare operationsSyntax: LDAPOpCacheEntries numberDefault: LDAPOpCacheEntries 1024Context: server configStatus: ExperimentalModule: mod ldap

This specifies the number of entries MOD LDAP will use to cache LDAP compare operations. The default is 1024entries. Setting it to 0 disables operation caching.

Page 477: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.36. APACHE MODULE MOD LDAP 469

LDAPOpCacheTTL Directive

Description: Time that entries in the operation cache remain validSyntax: LDAPOpCacheTTL secondsDefault: LDAPOpCacheTTL 600Context: server configStatus: ExperimentalModule: mod ldap

Specifies the time (in seconds) that entries in the operation cache remain valid. The default is 600 seconds.

LDAPSharedCacheFile Directive

Description: Sets the shared memory cache fileSyntax: LDAPSharedCacheFile directory-path/filenameContext: server configStatus: ExperimentalModule: mod ldap

Specifies the directory path and file name of the shared memory cache file. If not set, anonymous shared memory willbe used if the platform supports it.

LDAPSharedCacheSize Directive

Description: Size in bytes of the shared-memory cacheSyntax: LDAPSharedCacheSize bytesDefault: LDAPSharedCacheSize 102400Context: server configStatus: ExperimentalModule: mod ldap

Specifies the number of bytes to allocate for the shared memory cache. The default is 100kb. If set to 0, sharedmemory caching will not be used.

LDAPTrustedCA Directive

Description: Sets the file containing the trusted Certificate Authority certificate or databaseSyntax: LDAPTrustedCA directory-path/filenameContext: server configStatus: ExperimentalModule: mod ldap

It specifies the directory path and file name of the trusted CA MOD LDAP should use when establishing an SSLconnection to an LDAP server. If using the Netscape/iPlanet Directory SDK, the file name should be cert7.db.

LDAPTrustedCAType Directive

Description: Specifies the type of the Certificate Authority fileSyntax: LDAPTrustedCAType typeContext: server configStatus: ExperimentalModule: mod ldap

Page 478: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

470 CHAPTER 10. APACHE MODULES

The following types are supported:DER FILE - file in binary DER formatBASE64 FILE - file in Base64 formatCERT7 DB PATH - Netscape certificate database file ")

Page 479: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.37. APACHE MODULE MOD LOG CONFIG 471

10.37 Apache Module mod log config

Description: Logging of the requests made to the serverStatus: BaseModuleIdentifier: log config moduleSourceFile: mod log config.c

Summary

This module provides for flexible logging of client requests. Logs are written in a customizable format, and may bewritten directly to a file, or to an external program. Conditional logging is provided so that individual requests may beincluded or excluded from the logs based on characteristics of the request.

Three directives are provided by this module: TRANSFERLOG to create a log file, LOGFORMAT to set a custom format,and CUSTOMLOG to define a log file and format in one step. The TRANSFERLOG and CUSTOMLOG directives canbe used multiple times in each server to cause each request to be logged to multiple files.

Directives

• BufferedLogs

• CookieLog

• CustomLog

• LogFormat

• TransferLog

See also

• Apache Log Files (p. 29)

Custom Log Formats

The format argument to the LOGFORMAT and CUSTOMLOGdirectives is a string. This string is used to log eachrequest to the log file. It can contain literal characters copied into the log files and the C-style control characters "\n"and "\t" to represent new-lines and tabs. Literal quotes and backslashes should be escaped with backslashes.

The characteristics of the request itself are logged by placing "%" directives in the format string, which are replacedin the log file by the values as follows:

FormatString Description%% The percent sign (Apache 2.0.44 and later)%...a Remote IP-address%...A Local IP-address%...B Size of response in bytes, excluding HTTP headers.%...b Size of response in bytes, excluding HTTP headers. In CLF format, i.e. a ’-’ rather than a 0 when no

bytes are sent.%...{Foobar}C The contents of cookie Foobar in the request sent to the server.%...D The time taken to serve the request, in microseconds.%...{FOOBAR}e The contents of the environment variable FOOBAR%...f Filename%...h Remote host%...H The request protocol

Page 480: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

472 CHAPTER 10. APACHE MODULES

%...{Foobar}i The contents of Foobar: header line(s) in the request sent to the server. Changes made by othermodules (e.g. MOD HEADERS) affect this.

%...l Remote logname (from identd, if supplied). This will return a dash unless IDENTITYCHECK is set On.%...m The request method%...{Foobar}n The contents of note Foobar from another module.%...{Foobar}o The contents of Foobar: header line(s) in the reply.%...p The canonical port of the server serving the request%...P The process ID of the child that serviced the request.%...{format}P The process ID or thread id of the child that serviced the request. Valid formats are pid and tid.

(Apache 2.0.46 and later)%...q The query string (prepended with a ? if a query string exists, otherwise an empty string)%...r First line of request%...s Status. For requests that got internally redirected, this is the status of the *original* request — %...>s

for the last.%...t Time the request was received (standard english format)%...{format}t The time, in the form given by format, which should be in strftime(3) format. (potentially localized)%...T The time taken to serve the request, in seconds.%...u Remote user (from auth; may be bogus if return status (%s) is 401)%...U The URL path requested, not including any query string.%...v The canonical SERVERNAME of the server serving the request.%...V The server name according to the USECANONICALNAME setting.%...X Connection status when response is completed:

X = connection aborted before the response completed.+ = connection may be kept alive after the response is sent.- = connection will be closed after the response is sent.

(This directive was %...c in late versions of Apache 1.3, but this conflicted with the historical ssl%...{var}c syntax.)

%...I Bytes received, including request and headers, cannot be zero. You need to enable MOD LOGIO to usethis.

%...O Bytes sent, including headers, cannot be zero. You need to enable MOD LOGIO to use this.

The "..." can be nothing at all (e.g., "%h %u %r %s %b"), or it can indicate conditions for inclusion of the item(which will cause it to be replaced with "-" if the condition is not met). The forms of condition are a list of HTTPstatus codes, which may or may not be preceded by "!". Thus, "%400,501{User-agent}i" logs User-agent: on400 errors and 501 errors (Bad Request, Not Implemented) only; "%!200,304,302{Referer}i" logs Referer: onall requests which did not return some sort of normal status.

The modifiers "<" and ">" can be used for requests that have been internally redirected to choose whether theoriginal or final (respectively) request should be consulted. By default, the % directives %s, %U, %T, %D, and %rlook at the original request while all others look at the final request. So for example, %>s can be used to record thefinal status of the request and %<u can be used to record the original authenticated user on a request that is internallyredirected to an unauthenticated resource.

Note that in httpd 2.0 versions prior to 2.0.46, no escaping was performed on the strings from %...r, %...i and%...o. This was mainly to comply with the requirements of the Common Log Format. This implied that clientscould insert control characters into the log, so you had to be quite careful when dealing with raw log files.

For security reasons, starting with 2.0.46, non-printable and other special characters are escaped mostly by using \xhhsequences, where hh stands for the hexadecimal representation of the raw byte. Exceptions from this rule are " and \which are escaped by prepending a backslash, and all whitespace characters which are written in their C-style notation(\n, \t etc).

Note that in httpd 2.0, unlike 1.3, the %b and %B format strings do not represent the number of bytes sent to the client,but simply the size in bytes of the HTTP response (which will differ, for instance, if the connection is aborted, or ifSSL is used). The %O format provided by MOD LOGIO will log the actual number of bytes sent over the network.

Page 481: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.37. APACHE MODULE MOD LOG CONFIG 473

Some commonly used log format strings are:

Common Log Format (CLF) "%h %l %u %t \"%r\" %>s %b"

Common Log Format with Virtual Host "%v %h %l %u %t \"%r\" %>s %b"

NCSA extended/combined log format "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\"\"%{User-agent}i\""

Referer log format "%{Referer}i -> %U"

Agent (Browser) log format "%{User-agent}i"

Note that the canonical SERVERNAME and LISTEN of the server serving the request are used for %v and %p respec-tively. This happens regardless of the USECANONICALNAME setting because otherwise log analysis programs wouldhave to duplicate the entire vhost matching algorithm in order to decide what host really served the request.

Security Considerations

See the security tips (p. 40) document for details on why your security could be compromised if the directory wherelogfiles are stored is writable by anyone other than the user that starts the server.

BufferedLogs Directive

Description: Buffer log entries in memory before writing to diskSyntax: BufferedLogs On|OffDefault: BufferedLogs OffContext: server configStatus: BaseModule: mod log configCompatibility: Available in versions 2.0.41 and later.

The BUFFEREDLOGS directive causes MOD LOG CONFIG to store several log entries in memory and write themtogether to disk, rather than writing them after each request. On some systems, this may result in more efficientdisk access and hence higher performance. It may be set only once for the entire server; it cannot be configured pervirtual-host.

=⇒This directive is experimental and should be used with caution.

CookieLog Directive

Description: Sets filename for the logging of cookiesSyntax: CookieLog filenameContext: server config, virtual hostStatus: BaseModule: mod log configCompatibility: This directive is deprecated.

The COOKIELOG directive sets the filename for logging of cookies. The filename is relative to the SERVERROOT.This directive is included only for compatibility with mod cookies, and is deprecated.

Page 482: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

474 CHAPTER 10. APACHE MODULES

CustomLog Directive

Description: Sets filename and format of log fileSyntax: CustomLog file|pipe format|nickname [env=[!]environment-variable]Context: server config, virtual hostStatus: BaseModule: mod log config

The CUSTOMLOG directive is used to log requests to the server. A log format is specified, and the logging canoptionally be made conditional on request characteristics using environment variables.

The first argument, which specifies the location to which the logs will be written, can take one of the following twotypes of values:

file A filename, relative to the SERVERROOT.

pipe The pipe character "|", followed by the path to a program to receive the log information on its standard input.

! Security:If a program is used, then it will be run as the user who started httpd. This will be root if theserver was started by root; be sure that the program is secure.

! NoteWhen entering a file path on non-Unix platforms, care should be taken to make sure that onlyforward slashed are used even though the platform may allow the use of back slashes. Ingeneral it is a good idea to always use forward slashes throughout the configuration files.

The second argument specifies what will be written to the log file. It can specify either a nickname defined by aprevious LOGFORMAT directive, or it can be an explicit format string as described in the log formats section.

For example, the following two sets of directives have exactly the same effect:

# CustomLog with format nicknameLogFormat "%h %l %u %t \"%r\" %>s %b" commonCustomLog logs/access log common

# CustomLog with explicit format string

CustomLog logs/access log "%h %l %u %t \"%r\" %>s %b"

The third argument is optional and controls whether or not to log a particular request based on the presence or absenceof a particular variable in the server environment. If the specified environment variable (p. 60) is set for the request (oris not set, in the case of a ’env=!name’ clause), then the request will be logged.

Environment variables can be set on a per-request basis using the MOD SETENVIF and/or MOD REWRITE modules.For example, if you want to record requests for all GIF images on your server in a separate logfile but not in your mainlog, you can use:

SetEnvIf Request URI \.gif$ gif-imageCustomLog gif-requests.log common env=gif-image

CustomLog nongif-requests.log common env=!gif-image

Or, to reproduce the behavior of the old RefererIgnore directive, you might use the following:

SetEnvIf Referer example\.com localreferer

CustomLog referer.log referer env=!localreferer

Page 483: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.37. APACHE MODULE MOD LOG CONFIG 475

LogFormat Directive

Description: Describes a format for use in a log fileSyntax: LogFormat format|nickname [nickname]Default: LogFormat "%h %l %u %t \"%r\" %>s %b"Context: server config, virtual hostStatus: BaseModule: mod log config

This directive specifies the format of the access log file.

The LOGFORMAT directive can take one of two forms. In the first form, where only one argument is specified, thisdirective sets the log format which will be used by logs specified in subsequent TRANSFERLOG directives. The singleargument can specify an explicit format as discussed in the custom log formats section above. Alternatively, it can usea nickname to refer to a log format defined in a previous LOGFORMAT directive as described below.

The second form of the LOGFORMAT directive associates an explicit format with a nickname. This nickname canthen be used in subsequent LOGFORMAT or CUSTOMLOG directives rather than repeating the entire format string. ALOGFORMAT directive that defines a nickname does nothing else – that is, it only defines the nickname, it doesn’tactually apply the format and make it the default. Therefore, it will not affect subsequent TRANSFERLOG directives.In addition, LOGFORMAT cannot use one nickname to define another nickname. Note that the nickname should notcontain percent signs (%).

ExampleLogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost common

TransferLog Directive

Description: Specify location of a log fileSyntax: TransferLog file|pipeContext: server config, virtual hostStatus: BaseModule: mod log config

This directive has exactly the same arguments and effect as the CUSTOMLOG directive, with the exception that it doesnot allow the log format to be specified explicitly or for conditional logging of requests. Instead, the log format isdetermined by the most recently specified LOGFORMAT directive which does not define a nickname. Common LogFormat is used if no other format has been specified.

ExampleLogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\"\"%{User-agent}i\""TransferLog logs/access log

Page 484: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

476 CHAPTER 10. APACHE MODULES

10.38 Apache Module mod log forensic

Description: Forensic Logging of the requests made to the serverStatus: ExtensionModuleIdentifier: log forensic moduleSourceFile: mod log forensic.cCompatibility: Available in version 2.0.50 and later

Summary

This module provides for forensic logging of client requests. Logging is done before and after processing a request,so the forensic log contains two log lines for each request. The forensic logger is very strict, which means:

• The format is fixed. You cannot modify the logging format at runtime.

• If it cannot write its data, the child process exits immediately and may dump core (depending on your CORE-DUMPDIRECTORY configuration).

The check forensic script, which can be found in the distribution’s support directory, may be helpful in evaluatingthe forensic log output.

! This module was backported from version 2.1 which uses a more powerful APR version inorder to generate the forensic IDs. If you want to run MOD LOG FORENSIC in version 2.0, youneed to include MOD UNIQUE ID as well.

Directives

• ForensicLog

See also

• Apache Log Files (p. 29)

• MOD LOG CONFIG

Forensic Log Format

Each request is logged two times. The first time is before it’s processed further (that is, after receiving the headers).The second log entry is written after the request processing at the same time where normal logging occurs.

In order to identify each request, a unique request ID is assigned. This forensic ID can be cross logged in the normaltransfer log using the %{forensic-id}n format string. If you’re using MOD UNIQUE ID, its generated ID will beused.

The first line logs the forensic ID, the request line and all received headers, separated by pipe characters (|). A sampleline looks like the following (all on one line):

+yQtJf8CoAB4AAFNXBIEAAAAA|GET /manual/de/images/down.gif

HTTP/1.1|Host:localhost%3a8080|User-Agent:Mozilla/5.0 (X11; U; Linux

i686; en-US; rv%3a1.6) Gecko/20040216 Firefox/0.8|Accept:image/png,

etc...

Page 485: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.38. APACHE MODULE MOD LOG FORENSIC 477

The plus character at the beginning indicates that this is the first log line of this request. The second line just containsa minus character and the ID again:

-yQtJf8CoAB4AAFNXBIEAAAAA

The check forensic script takes as its argument the name of the logfile. It looks for those +/- ID pairs andcomplains if a request was not completed.

Security Considerations

See the security tips (p. 40) document for details on why your security could be compromised if the directory wherelogfiles are stored is writable by anyone other than the user that starts the server.

ForensicLog Directive

Description: Sets filename of the forensic logSyntax: ForensicLog filename|pipeContext: server config, virtual hostStatus: ExtensionModule: mod log forensic

The FORENSICLOG directive is used to log requests to the server for forensic analysis. Each log entry is assigned aunique ID which can be associated with the request using the normal CUSTOMLOG directive. MOD LOG FORENSICtakes the unique ID from MOD UNIQUE ID, so you need to load this module as well. (This requirement will not benecessary in version 2.1 and later, because of a more powerful APR version.) The ID token is attached to the requestunder the name forensic-id, which can be added to the transfer log using the %{forensic-id}n format string.

The argument, which specifies the location to which the logs will be written, can take one of the following two typesof values:

filename A filename, relative to the SERVERROOT.

pipe The pipe character "|", followed by the path to a program to receive the log information on its standard input.The program name can be specified relative to the SERVERROOT directive.

! Security:If a program is used, then it will be run as the user who started httpd. This will be root if theserver was started by root; be sure that the program is secure or switches to a less privilegeduser.

=⇒NoteWhen entering a file path on non-Unix platforms, care should be taken to make sure that onlyforward slashed are used even though the platform may allow the use of back slashes. Ingeneral it is a good idea to always use forward slashes throughout the configuration files.

Page 486: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

478 CHAPTER 10. APACHE MODULES

10.39 Apache Module mod logio

Description: Logging of input and output bytes per requestStatus: ExtensionModuleIdentifier: logio moduleSourceFile: mod logio.c

Summary

This module provides the logging of input and output number of bytes received/sent per request. The numbers reflectthe actual bytes as received on the network, which then takes into account the headers and bodies of requests andresponses. The counting is done before SSL/TLS on input and after SSL/TLS on output, so the numbers will correctlyreflect any changes made by encryption.

This module requires MOD LOG CONFIG.

Directives This module provides no directives.

See also

• MOD LOG CONFIG

• Apache Log Files (p. 29)

Custom Log Formats

This modules adds two new logging directives. The characteristics of the request itself are logged by placing "%"directives in the format string, which are replaced in the log file by the values as follows:

FormatString Description%...I Bytes received, including request and headers, cannot be zero.%...O Bytes sent, including headers, cannot be zero.

Usually, the functionality is used like this:

Combined I/O log format: "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\"\"%{User-agent}i\" %I %O"

Page 487: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.40. APACHE MODULE MOD MEM CACHE 479

10.40 Apache Module mod mem cache

Description: Content cache keyed to URIsStatus: ExperimentalModuleIdentifier: mem cache moduleSourceFile: mod mem cache.c

Summary

! This module is experimental. Documentation is still under development...

This module requires the service of MOD CACHE. It acts as a support module for MOD CACHE and provides a memorybased storage manager. MOD MEM CACHE can be configured to operate in two modes: caching open file descriptorsor caching objects in heap storage. MOD MEM CACHE is most useful when used to cache locally generated content orto cache backend server content for MOD PROXY configured for PROXYPASS (aka reverse proxy).

Content is stored in and retrieved from the cache using URI based keys. Content with access protection is not cached.

Directives

• MCacheMaxObjectCount

• MCacheMaxObjectSize

• MCacheMaxStreamingBuffer

• MCacheMinObjectSize

• MCacheRemovalAlgorithm

• MCacheSize

See also

• MOD CACHE

• MOD DISK CACHE

MCacheMaxObjectCount Directive

Description: The maximum number of objects allowed to be placed in the cacheSyntax: MCacheMaxObjectCount valueDefault: MCacheMaxObjectCount 1009Context: server configStatus: ExperimentalModule: mod mem cache

The MCACHEMAXOBJECTCOUNT directive sets the maximum number of objects to be cached. The value is used tocreate the open hash table. If a new object needs to be inserted in the cache and the maximum number of objects hasbeen reached, an object will be removed to allow the new object to be cached. The object to be removed is selectedusing the algorithm specified by MCACHEREMOVALALGORITHM.

ExampleMCacheMaxObjectCount 13001

Page 488: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

480 CHAPTER 10. APACHE MODULES

MCacheMaxObjectSize Directive

Description: The maximum size (in bytes) of a document allowed in the cacheSyntax: MCacheMaxObjectSize bytesDefault: MCacheMaxObjectSize 10000Context: server configStatus: ExperimentalModule: mod mem cache

The MCACHEMAXOBJECTSIZE directive sets the maximum allowable size, in bytes, of a document for it to beconsidered cacheable.

ExampleMCacheMaxObjectSize 6400000

=⇒NoteThe value of MCACHEMAXOBJECTSIZE must be greater than the value specified by theMCACHEMINOBJECTSIZE directive.

MCacheMaxStreamingBuffer Directive

Description: Maximum amount of a streamed response to buffer in memory before declaring the responseuncacheable

Syntax: MCacheMaxStreamingBuffer size in bytesDefault: MCacheMaxStreamingBuffer the smaller of 100000 or

MCacheMaxObjectSizeContext: server configStatus: ExperimentalModule: mod mem cache

The MCACHEMAXSTREAMINGBUFFER directive specifies the maximum number of bytes of a streamed response tobuffer before deciding that the response is too big to cache. A streamed response is one in which the entire content isnot immediately available and in which the Content-Length may not be known. Sources of streaming responsesinclude proxied responses and the output of CGI scripts. By default, a streamed response will not be cached unless ithas a Content-Length header. The reason for this is to avoid using a large amount of memory to buffer a partialresponse that might end up being too large to fit in the cache. The MCACHEMAXSTREAMINGBUFFER directiveallows buffering of streamed responses that don’t contain a Content-Length up to the specified maximum amountof space. If the maximum buffer space is reached, the buffered content is discarded and the attempt to cache isabandoned.

=⇒Note:Using a nonzero value for MCACHEMAXSTREAMINGBUFFER will not delay the transmissionof the response to the client. As soon as MOD MEM CACHE copies a block of streamed contentinto a buffer, it sends the block on to the next output filter for delivery to the client.

# Enable caching of streamed responses up to 64KB:

MCacheMaxStreamingBuffer 65536

Page 489: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.40. APACHE MODULE MOD MEM CACHE 481

MCacheMinObjectSize Directive

Description: The minimum size (in bytes) of a document to be allowed in the cacheSyntax: MCacheMinObjectSize bytesDefault: MCacheMinObjectSize 0Context: server configStatus: ExperimentalModule: mod mem cache

The MCACHEMINOBJECTSIZE directive sets the minimum size in bytes of a document for it to be consideredcacheable.

ExampleMCacheMinObjectSize 10000

MCacheRemovalAlgorithm Directive

Description: The algorithm used to select documents for removal from the cacheSyntax: MCacheRemovalAlgorithm LRU|GDSFDefault: MCacheRemovalAlgorithm GDSFContext: server configStatus: ExperimentalModule: mod mem cache

The MCACHEREMOVALALGORITHM directive specifies the algorithm used to select documents for removal from thecache. Two choices are available:

LRU (Least Recently Used) LRU removes the documents that have not been accessed for the longest time.

GDSF (GreadyDual-Size) GDSF assigns a priority to cached documents based on the cost of a cache miss and thesize of the document. Documents with the lowest priority are removed first.

ExampleMCacheRemovalAlgorithm GDSF

MCacheRemovalAlgorithm LRU

MCacheSize Directive

Description: The maximum amount of memory used by the cache in KBytesSyntax: MCacheSize KBytesDefault: MCacheSize 100Context: server configStatus: ExperimentalModule: mod mem cache

The MCACHESIZE directive sets the maximum amount of memory to be used by the cache, in KBytes (1024-byteunits). If a new object needs to be inserted in the cache and the size of the object is greater than the remainingmemory, objects will be removed until the new object can be cached. The object to be removed is selected using thealgorithm specified by MCACHEREMOVALALGORITHM.

Page 490: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

482 CHAPTER 10. APACHE MODULES

ExampleMCacheSize 700000

=⇒NoteThe MCACHESIZE value must be greater than the value specified by the MCACHEMAXOB-JECTSIZE directive.

Page 491: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.41. APACHE MODULE MOD MIME 483

10.41 Apache Module mod mime

Description: Associates the requested filename’s extensions with the file’s behavior (handlers andfilters) and content (mime-type, language, character set and encoding)

Status: BaseModuleIdentifier: mime moduleSourceFile: mod mime.c

Summary

This module is used to associate various bits of "meta information" with files by their filename extensions. This infor-mation relates the filename of the document to it’s mime-type, language, character set and encoding. This informationis sent to the browser, and participates in content negotiation, so the user’s preferences are respected when choosingone of several possible files to serve. See MOD NEGOTIATION for more information about content negotiation (p. 47).

The directives ADDCHARSET, ADDENCODING, ADDLANGUAGE and ADDTYPE are all used to map file extensionsonto the meta-information for that file. Respectively they set the character set, content-encoding, content-language,and MIME-type (content-type) of documents. The directive TYPESCONFIG is used to specify a file which also mapsextensions onto MIME types.

In addition, MOD MIME may define the handler (p. 65) and filters (p. 67) that originate and process content. Thedirectives ADDHANDLER, ADDOUTPUTFILTER, and ADDINPUTFILTER control the modules or scripts that servethe document. The MULTIVIEWSMATCH directive allows MOD NEGOTIATION to consider these file extensions to beincluded when testing Multiviews matches.

While MOD MIME associates meta-information with filename extensions, the CORE server provides directives that areused to associate all the files in a given container (e.g., <LOCATION>, <DIRECTORY>, or <FILES>) with particularmeta-information. These directives include FORCETYPE, SETHANDLER, SETINPUTFILTER, and SETOUTPUTFIL-TER. The core directives override any filename extension mappings defined in MOD MIME.

Note that changing the meta-information for a file does not change the value of the Last-Modified header. Thus,previously cached copies may still be used by a client or proxy, with the previous headers. If you change the meta-information (language, content type, character set or encoding) you may need to ’touch’ affected files (updating theirlast modified date) to ensure that all visitors are receive the corrected content headers.

Directives

• AddCharset

• AddEncoding

• AddHandler

• AddInputFilter

• AddLanguage

• AddOutputFilter

• AddType

• DefaultLanguage

• ModMimeUsePathInfo

• MultiviewsMatch

• RemoveCharset

• RemoveEncoding

• RemoveHandler

Page 492: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

484 CHAPTER 10. APACHE MODULES

• RemoveInputFilter

• RemoveLanguage

• RemoveOutputFilter

• RemoveType

• TypesConfig

See also

• MIMEMAGICFILE

• ADDDEFAULTCHARSET

• FORCETYPE

• DEFAULTTYPE

• SETHANDLER

• SETINPUTFILTER

• SETOUTPUTFILTER

Files with Multiple Extensions

Files can have more than one extension, and the order of the extensions is normally irrelevant. For example, if the filewelcome.html.fr maps onto content type text/html and language French then the file welcome.fr.htmlwill map onto exactly the same information. If more than one extension is given which maps onto the same typeof meta-information, then the one to the right will be used, except for languages and content encodings. For exam-ple, if .gif maps to the MIME-type image/gif and .html maps to the MIME-type text/html, then the filewelcome.gif.html will be associated with the MIME-type text/html.

Languages and content encodings are treated accumulative, because one can assign more than one languageor encoding to a particular resource. For example, the file welcome.html.en.de will be delivered withContent-Language: en, de and Content-Type: text/html.

Care should be taken when a file with multiple extensions gets associated with both a MIME-type and a handler.This will usually result in the request being by the module associated with the handler. For example, if the .imapextension is mapped to the handler imap-file (from MOD IMAP) and the .html extension is mapped to the MIME-type text/html, then the file world.imap.html will be associated with both the imap-file handler andtext/html MIME-type. When it is processed, the imap-file handler will be used, and so it will be treated as aMOD IMAP imagemap file.

Content encoding

A file of a particular MIME type can additionally be encoded a particular way to simplify transmission over theInternet. While this usually will refer to compression, such as gzip, it can also refer to encryption, such a pgp or toan encoding such as UUencoding, which is designed for transmitting a binary file in an ASCII (text) format.

The HTTP/1.1 RFC22, section 14.11 puts it this way:

The Content-Encoding entity-header field is used as a modifier to the media-type. When present,its value indicates what additional content codings have been applied to the entity-body, and thus whatdecoding mechanisms must be applied in order to obtain the media-type referenced by the Content-Typeheader field. Content-Encoding is primarily used to allow a document to be compressed without losingthe identity of its underlying media type.

22http://www.ietf.org/rfc/rfc2616.txt

Page 493: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.41. APACHE MODULE MOD MIME 485

By using more than one file extension (see section above about multiple file extensions), you can indicate that a file isof a particular type, and also has a particular encoding.

For example, you may have a file which is a Microsoft Word document, which is pkzipped to reduce its size. If the.doc extension is associated with the Microsoft Word file type, and the .zip extension is associated with the pkzipfile encoding, then the file Resume.doc.zip would be known to be a pkzip’ed Word document.

Apache sends a Content-encoding header with the resource, in order to tell the client browser about the encodingmethod.

Content-encoding: pkzip

Character sets and languages

In addition to file type and the file encoding, another important piece of information is what language a particulardocument is in, and in what character set the file should be displayed. For example, the document might be writtenin the Vietnamese alphabet, or in Cyrillic, and should be displayed as such. This information, also, is transmitted inHTTP headers.

The character set, language, encoding and mime type are all used in the process of content negotiation (SeeMOD NEGOTIATION) to determine which document to give to the client, when there are alternative documents inmore than one character set, language, encoding or mime type. All filename extensions associations created with AD-DCHARSET, ADDENCODING, ADDLANGUAGE and ADDTYPE directives (and extensions listed in the MIMEMAG-ICFILE) participate in this select process. Filename extensions that are only associated using the ADDHANDLER,ADDINPUTFILTER or ADDOUTPUTFILTER directives may be included or excluded from matching by using the MUL-TIVIEWSMATCH directive.

Charset

To convey this further information, Apache optionally sends a Content-Language header, to specify the languagethat the document is in, and can append additional information onto the Content-Type header to indicate theparticular character set that should be used to correctly render the information.

Content-Language: en, fr

Content-Type: text/plain; charset=ISO-8859-1

The language specification is the two-letter abbreviation for the language. The charset is the name of the particularcharacter set which should be used.

AddCharset Directive

Description: Maps the given filename extensions to the specified content charsetSyntax: AddCharset charset extension [extension] ...Context: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod mime

The ADDCHARSET directive maps the given filename extensions to the specified content charset. charset is the MIMEcharset parameter23 of filenames containing extension. This mapping is added to any already in force, overriding anymappings that already exist for the same extension.

23http://www.iana.org/assignments/character-sets

Page 494: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

486 CHAPTER 10. APACHE MODULES

ExampleAddLanguage ja .jaAddCharset EUC-JP .eucAddCharset ISO-2022-JP .jis

AddCharset SHIFT JIS .sjis

Then the document xxxx.ja.jis will be treated as being a Japanese document whose charset is ISO-2022-JP(as will the document xxxx.jis.ja). The ADDCHARSET directive is useful for both to inform the client aboutthe character encoding of the document so that the document can be interpreted and displayed appropriately, andfor content negotiation (p. 47) , where the server returns one from several documents based on the client’s charsetpreference.

The extension argument is case-insensitive, and can be specified with or without a leading dot.

See also

• MOD NEGOTIATION

• ADDDEFAULTCHARSET

AddEncoding Directive

Description: Maps the given filename extensions to the specified encoding typeSyntax: AddEncoding MIME-enc extension [extension] ...Context: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod mime

The ADDENCODING directive maps the given filename extensions to the specified encoding type. MIME-enc is theMIME encoding to use for documents containing the extension. This mapping is added to any already in force,overriding any mappings that already exist for the same extension.

ExampleAddEncoding x-gzip .gz

AddEncoding x-compress .Z

This will cause filenames containing the .gz extension to be marked as encoded using the x-gzip encoding, andfilenames containing the .Z extension to be marked as encoded with x-compress.

Old clients expect x-gzip and x-compress, however the standard dictates that they’re equivalent to gzip andcompress respectively. Apache does content encoding comparisons by ignoring any leading x-. When respondingwith an encoding Apache will use whatever form (i.e., x-foo or foo) the client requested. If the client didn’tspecifically request a particular form Apache will use the form given by the AddEncoding directive. To make thislong story short, you should always use x-gzip and x-compress for these two specific encodings. More recentencodings, such as deflate should be specified without the x-.

The extension argument is case-insensitive, and can be specified with or without a leading dot.

Page 495: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.41. APACHE MODULE MOD MIME 487

AddHandler Directive

Description: Maps the filename extensions to the specified handlerSyntax: AddHandler handler-name extension [extension] ...Context: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod mime

Files having the name extension will be served by the specified handler-name (p. 65) . This mapping is added to anyalready in force, overriding any mappings that already exist for the same extension. For example, to activate CGIscripts with the file extension .cgi, you might use:

AddHandler cgi-script .cgi

Once that has been put into your httpd.conf file, any file containing the .cgi extension will be treated as a CGIprogram.

The extension argument is case-insensitive, and can be specified with or without a leading dot.

See also

• SETHANDLER

AddInputFilter Directive

Description: Maps filename extensions to the filters that will process client requestsSyntax: AddInputFilter filter[;filter...] extension [extension] ...Context: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod mimeCompatibility: AddInputFilter is only available in Apache 2.0.26 and later.

ADDINPUTFILTER maps the filename extension extension to the filters (p. 67) which will process client requests andPOST input when they are received by the server. This is in addition to any filters defined elsewhere, including theSETINPUTFILTER directive. This mapping is merged over any already in force, overriding any mappings that alreadyexist for the same extension.

If more than one filter is specified, they must be separated by semicolons in the order in which they should processthe content. Both the filter and extension arguments are case-insensitive, and the extension may be specified with orwithout a leading dot.

See also

• REMOVEINPUTFILTER

• SETINPUTFILTER

AddLanguage Directive

Description: Maps the given filename extension to the specified content languageSyntax: AddLanguage MIME-lang extension [extension] ...Context: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod mime

Page 496: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

488 CHAPTER 10. APACHE MODULES

The ADDLANGUAGE directive maps the given filename extension to the specified content language. MIME-lang isthe MIME language of filenames containing extension. This mapping is added to any already in force, overriding anymappings that already exist for the same extension.

ExampleAddEncoding x-compress .ZAddLanguage en .en

AddLanguage fr .fr

Then the document xxxx.en.Z will be treated as being a compressed English document (as will the documentxxxx.Z.en). Although the content language is reported to the client, the browser is unlikely to use this information.The ADDLANGUAGE directive is more useful for content negotiation (p. 47) , where the server returns one fromseveral documents based on the client’s language preference.

If multiple language assignments are made for the same extension, the last one encountered is the one that is used.That is, for the case of:

AddLanguage en .enAddLanguage en-gb .en

AddLanguage en-us .en

documents with the extension .en would be treated as being en-us.

The extension argument is case-insensitive, and can be specified with or without a leading dot.

See also

• MOD NEGOTIATION

AddOutputFilter Directive

Description: Maps filename extensions to the filters that will process responses from the serverSyntax: AddOutputFilter filter[;filter...] extension [extension] ...Context: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod mimeCompatibility: AddOutputFilter is only available in Apache 2.0.26 and later.

The ADDOUTPUTFILTER directive maps the filename extension extension to the filters (p. 67) which will processresponses from the server before they are sent to the client. This is in addition to any filters defined elsewhere, includingSETOUTPUTFILTER and ADDOUTPUTFILTERBYTYPE directive. This mapping is merged over any already in force,overriding any mappings that already exist for the same extension.

For example, the following configuration will process all .shtml files for server-side includes and will then compressthe output using MOD DEFLATE.

AddOutputFilter INCLUDES;DEFLATE shtml

If more than one filter is specified, they must be separated by semicolons in the order in which they should processthe content. Both the filter and extension arguments are case-insensitive, and the extension may be specified with orwithout a leading dot.

See also

Page 497: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.41. APACHE MODULE MOD MIME 489

• REMOVEOUTPUTFILTER

• SETOUTPUTFILTER

AddType Directive

Description: Maps the given filename extensions onto the specified content typeSyntax: AddType MIME-type extension [extension] ...Context: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod mime

The ADDTYPE directive maps the given filename extensions onto the specified content type. MIME-type is the MIMEtype to use for filenames containing extension. This mapping is added to any already in force, overriding any mappingsthat already exist for the same extension. This directive can be used to add mappings not listed in the MIME types file(see the TYPESCONFIG directive).

ExampleAddType image/gif .gif

=⇒It is recommended that new MIME types be added using the ADDTYPE directive rather thanchanging the TYPESCONFIG file.

The extension argument is case-insensitive, and can be specified with or without a leading dot.

See also

• DEFAULTTYPE

• FORCETYPE

DefaultLanguage Directive

Description: Sets all files in the given scope to the specified languageSyntax: DefaultLanguage MIME-langContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod mime

The DEFAULTLANGUAGE directive tells Apache that all files in the directive’s scope (e.g., all files covered by thecurrent <DIRECTORY> container) that don’t have an explicit language extension (such as .fr or .de as configuredby ADDLANGUAGE) should be considered to be in the specified MIME-lang language. This allows entire directoriesto be marked as containing Dutch content, for instance, without having to rename each file. Note that unlike usingextensions to specify languages, DEFAULTLANGUAGE can only specify a single language.

If no DEFAULTLANGUAGE directive is in force, and a file does not have any language extensions as configured byADDLANGUAGE, then that file will be considered to have no language attribute.

ExampleDefaultLanguage en

See also

• MOD NEGOTIATION

Page 498: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

490 CHAPTER 10. APACHE MODULES

ModMimeUsePathInfo Directive

Description: Tells MOD MIME to treat path info components as part of the filenameSyntax: ModMimeUsePathInfo On|OffDefault: ModMimeUsePathInfo OffContext: directoryStatus: BaseModule: mod mimeCompatibility: Available in Apache 2.0.41 and later

The MODMIMEUSEPATHINFO directive is used to combine the filename with the path info URL component toapply MOD MIME’s directives to the request. The default value is Off - therefore, the path info component isignored.

This directive is recommended when you have a virtual filesystem.

ExampleModMimeUsePathInfo On

If you have a request for /bar/foo.shtml where /bar is a Location and MODMIMEUSEPATHINFO isOn, MOD MIME will treat the incoming request as /bar/foo.shtml and directives like AddOutputFilterINCLUDES .shtml will add the INCLUDES filter to the request. If MODMIMEUSEPATHINFO is not set, theINCLUDES filter will not be added.

See also

• ACCEPTPATHINFO

MultiviewsMatch Directive

Description: The types of files that will be included when searching for a matching file with MultiViewsSyntax: MultiviewsMatch Any|NegotiatedOnly|Filters|Handlers

[Handlers|Filters]Default: MultiviewsMatch NegotiatedOnlyContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod mimeCompatibility: Available in Apache 2.0.26 and later.

MULTIVIEWSMATCH permits three different behaviors for mod negotiation (p. 499) ’s Multiviews feature. Multiviewsallows a request for a file, e.g. index.html, to match any negotiated extensions following the base request, e.g.index.html.en, index.html.fr, or index.html.gz.

The NegotiatedOnly option provides that every extension following the base name must correlate to a recognizedMOD MIME extension for content negotation, e.g. Charset, Content-Type, Language, or Encoding. This is the strictestimplementation with the fewest unexpected side effects, and is the default behavior.

To include extensions associated with Handlers and/or Filters, set the MULTIVIEWSMATCH directive to eitherHandlers, Filters, or both option keywords. If all other factors are equal, the smallest file will be served, e.g. indeciding between index.html.cgi of 500 bytes and index.html.pl of 1000 bytes, the .cgi file would winin this example. Users of .asis files might prefer to use the Handler option, if .asis files are associated with theasis-handler.

You may finally allow Any extensions to match, even if MOD MIME doesn’t recognize the extension. This was thebehavior in Apache 1.3, and can cause unpredicatable results, such as serving .old or .bak files the webmaster neverexpected to be served.

Page 499: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.41. APACHE MODULE MOD MIME 491

For example, the following configuration will allow handlers and filters to participate in Multviews, but will excludeunknown files:

MultiviewsMatch Handlers Filters

See also

• OPTIONS

• MOD NEGOTIATION

RemoveCharset Directive

Description: Removes any character set associations for a set of file extensionsSyntax: RemoveCharset extension [extension] ...Context: virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod mimeCompatibility: RemoveCharset is only available in Apache 2.0.24 and later.

The REMOVECHARSET directive removes any character set associations for files with the given extensions. Thisallows .htaccess files in subdirectories to undo any associations inherited from parent directories or the serverconfig files.

The extension argument is case-insensitive, and can be specified with or without a leading dot.

ExampleRemoveCharset .html .shtml

RemoveEncoding Directive

Description: Removes any content encoding associations for a set of file extensionsSyntax: RemoveEncoding extension [extension] ...Context: virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod mime

The REMOVEENCODING directive removes any encoding associations for files with the given extensions. This allows.htaccess files in subdirectories to undo any associations inherited from parent directories or the server config files.An example of its use might be:

/foo/.htaccess:AddEncoding x-gzip .gzAddType text/plain .asc<Files *.gz.asc>

RemoveEncoding .gz

</Files>

Page 500: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

492 CHAPTER 10. APACHE MODULES

This will cause foo.gz to be marked as being encoded with the gzip method, but foo.gz.asc as an unencodedplaintext file.

=⇒NoteREMOVEENCODING directives are processed after any ADDENCODING directives, so it ispossible they may undo the effects of the latter if both occur within the same directory config-uration.

The extension argument is case-insensitive, and can be specified with or without a leading dot.

RemoveHandler Directive

Description: Removes any handler associations for a set of file extensionsSyntax: RemoveHandler extension [extension] ...Context: virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod mime

The REMOVEHANDLER directive removes any handler associations for files with the given extensions. This allows.htaccess files in subdirectories to undo any associations inherited from parent directories or the server config files.An example of its use might be:

/foo/.htaccess:AddHandler server-parsed .html

/foo/bar/.htaccess:RemoveHandler .html

This has the effect of returning .html files in the /foo/bar directory to being treated as normal files, rather thanas candidates for parsing (see the MOD INCLUDE module).

The extension argument is case-insensitive, and can be specified with or without a leading dot.

RemoveInputFilter Directive

Description: Removes any input filter associations for a set of file extensionsSyntax: RemoveInputFilter extension [extension] ...Context: virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod mimeCompatibility: RemoveInputFilter is only available in Apache 2.0.26 and later.

The REMOVEINPUTFILTER directive removes any input filter (p. 67) associations for files with the given extensions.This allows .htaccess files in subdirectories to undo any associations inherited from parent directories or the serverconfig files.

The extension argument is case-insensitive, and can be specified with or without a leading dot.

See also

• ADDINPUTFILTER

• SETINPUTFILTER

Page 501: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.41. APACHE MODULE MOD MIME 493

RemoveLanguage Directive

Description: Removes any language associations for a set of file extensionsSyntax: RemoveLanguage extension [extension] ...Context: virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod mimeCompatibility: RemoveLanguage is only available in Apache 2.0.24 and later.

The REMOVELANGUAGE directive removes any language associations for files with the given extensions. This allows.htaccess files in subdirectories to undo any associations inherited from parent directories or the server config files.

The extension argument is case-insensitive, and can be specified with or without a leading dot.

RemoveOutputFilter Directive

Description: Removes any output filter associations for a set of file extensionsSyntax: RemoveOutputFilter extension [extension] ...Context: virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod mimeCompatibility: RemoveOutputFilter is only available in Apache 2.0.26 and later.

The REMOVEOUTPUTFILTER directive removes any output filter (p. 67) associations for files with the given exten-sions. This allows .htaccess files in subdirectories to undo any associations inherited from parent directories orthe server config files.

The extension argument is case-insensitive, and can be specified with or without a leading dot.

ExampleRemoveOutputFilter shtml

See also

• ADDOUTPUTFILTER

RemoveType Directive

Description: Removes any content type associations for a set of file extensionsSyntax: RemoveType extension [extension] ...Context: virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod mime

The REMOVETYPE directive removes any MIME type associations for files with the given extensions. This allows.htaccess files in subdirectories to undo any associations inherited from parent directories or the server config files.An example of its use might be:

/foo/.htaccess:RemoveType .cgi

Page 502: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

494 CHAPTER 10. APACHE MODULES

This will remove any special handling of .cgi files in the /foo/ directory and any beneath it, causing the files to betreated as being of the DEFAULTTYPE.

=⇒NoteREMOVETYPE directives are processed after any ADDTYPE directives, so it is possible theymay undo the effects of the latter if both occur within the same directory configuration.

The extension argument is case-insensitive, and can be specified with or without a leading dot.

TypesConfig Directive

Description: The location of the mime.types fileSyntax: TypesConfig file-pathDefault: TypesConfig conf/mime.typesContext: server configStatus: BaseModule: mod mime

The TYPESCONFIG directive sets the location of the MIME types configuration file. File-path is relative to theSERVERROOT. This file sets the default list of mappings from filename extensions to content types. Most admin-istrators use the provided mime.types file, which associates common filename extensions with IANA registeredcontent types. The current list is maintained at http://www.iana.org/assignments/media-types/index.html. This simpli-fies the httpd.conf file by providing the majority of media-type definitions, and may be overridden by ADDTYPEdirectives as needed. You should not edit the mime.types file, because it may be replaced when you upgrade yourserver.

The file contains lines in the format of the arguments to an ADDTYPE directive:

MIME-type [extension] ...

The case of the extension does not matter. Blank lines, and lines beginning with a hash character (#) are ignored.

=⇒Please do not send requests to the Apache HTTP Server Project to add any new entriesin the distributed mime.types file unless (1) they are already registered with IANA,and (2) they use widely accepted, non-conflicting filename extensions across platforms.category/x-subtype requests will be automatically rejected, as will any new two-letterextensions as they will likely conflict later with the already crowded language and characterset namespace.

See also

• MOD MIME MAGIC

Page 503: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.42. APACHE MODULE MOD MIME MAGIC 495

10.42 Apache Module mod mime magic

Description: Determines the MIME type of a file by looking at a few bytes of its contentsStatus: ExtensionModuleIdentifier: mime magic moduleSourceFile: mod mime magic.c

Summary

This module determines the MIME type of files in the same way the Unix file(1) command works: it looks at thefirst few bytes of the file. It is intended as a "second line of defense" for cases that MOD MIME can’t resolve.

This module is derived from a free version of the file(1) command for Unix, which uses "magic numbers" andother hints from a file’s contents to figure out what the contents are. This module is active only if the magic file isspecified by the MIMEMAGICFILE directive.

Directives

• MimeMagicFile

Format of the Magic File

The contents of the file are plain ASCII text in 4-5 columns. Blank lines are allowed but ignored. Commented linesuse a hash mark (#). The remaining lines are parsed for the following columns:

Column Description1 byte number to begin checking from

">" indicates a dependency upon the previous non-">" line2 type of data to match

byte single charactershort machine-order 16-bit integerlong machine-order 32-bit integerstring arbitrary-length stringdate long integer date (seconds since Unix epoch/1970)beshort big-endian 16-bit integerbelong big-endian 32-bit integerbedate big-endian 32-bit integer dateleshort little-endian 16-bit integerlelong little-endian 32-bit integerledate little-endian 32-bit integer date

3 contents of data to match4 MIME type if matched5 MIME encoding if matched (optional)

For example, the following magic file lines would recognize some audio formats:

Page 504: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

496 CHAPTER 10. APACHE MODULES

# Sun/NeXT audio data0 string .snd>12 belong 1 audio/basic>12 belong 2 audio/basic>12 belong 3 audio/basic>12 belong 4 audio/basic>12 belong 5 audio/basic>12 belong 6 audio/basic>12 belong 7 audio/basic>12 belong 23 audio/x-adpcm

Or these would recognize the difference between *.doc files containing Microsoft Word or FrameMaker documents.(These are incompatible file formats which use the same file suffix.)

# Frame0 string \<MakerFile application/x-frame0 string \<MIFFile application/x-frame0 string \<MakerDictionary application/x-frame0 string \<MakerScreenFon application/x-frame0 string \<MML application/x-frame0 string \<Book application/x-frame0 string \<Maker application/x-frame

# MS-Word0 string \376\067\0\043 application/msword0 string \320\317\021\340\241\261 application/msword0 string \333\245-\0\0\0 application/msword

An optional MIME encoding can be included as a fifth column. For example, this can recognize gzipped files and setthe encoding for them.

# gzip (GNU zip, not to be confused with# [Info-ZIP/PKWARE] zip archiver)

0 string \037\213 application/octet-stream x-gzip

Performance Issues

This module is not for every system. If your system is barely keeping up with its load or if you’re performing a webserver benchmark, you may not want to enable this because the processing is not free.

However, an effort was made to improve the performance of the original file(1) code to make it fit in a busy webserver. It was designed for a server where there are thousands of users who publish their own documents. This isprobably very common on intranets. Many times, it’s helpful if the server can make more intelligent decisions abouta file’s contents than the file name allows ...even if just to reduce the "why doesn’t my page work" calls when usersimproperly name their own files. You have to decide if the extra work suits your environment.

Notes

The following notes apply to the MOD MIME MAGIC module and are included here for compliance with contributors’copyright restrictions that require their acknowledgment.

Page 505: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.42. APACHE MODULE MOD MIME MAGIC 497

=⇒mod mime magic: MIME type lookup via file magic numbersCopyright (c) 1996-1997 Cisco Systems, Inc.This software was submitted by Cisco Systems to the Apache Group in July 1997. Futurerevisions and derivatives of this source code must acknowledge Cisco Systems as the originalcontributor of this module. All other licensing and usage conditions are those of the ApacheGroup.Some of this code is derived from the free version of the file command originally posted tocomp.sources.unix. Copyright info for that program is included below as required.

=⇒- Copyright (c) Ian F. Darwin, 1987. Written by Ian F. Darwin.This software is not subject to any license of the American Telephone and Telegraph Companyor of the Regents of the University of California.Permission is granted to anyone to use this software for any purpose on any computer system,and to alter it and redistribute it freely, subject to the following restrictions:

1. The author is not responsible for the consequences of use of this software, no matter howawful, even if they arise from flaws in it.

2. The origin of this software must not be misrepresented, either by explicit claim or byomission. Since few users ever read sources, credits must appear in the documentation.

3. Altered versions must be plainly marked as such, and must not be misrepresented asbeing the original software. Since few users ever read sources, credits must appear inthe documentation.

4. This notice may not be removed or altered.

=⇒For compliance with Mr Darwin’s terms: this has been very significantly modified from thefree "file" command.

• all-in-one file for compilation convenience when moving from one version of Apache tothe next.

• Memory allocation is done through the Apache API’s pool structure.

• All functions have had necessary Apache API request or server structures passed to themwhere necessary to call other Apache API routines. (i.e., usually for logging, files, ormemory allocation in itself or a called function.)

• struct magic has been converted from an array to a single-ended linked list because itonly grows one record at a time, it’s only accessed sequentially, and the Apache API hasno equivalent of realloc().

• Functions have been changed to get their parameters from the server configuration in-stead of globals. (It should be reentrant now but has not been tested in a threaded envi-ronment.)

• Places where it used to print results to stdout now saves them in a list where they’re usedto set the MIME type in the Apache request record.

• Command-line flags have been removed since they will never be used here.

Page 506: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

498 CHAPTER 10. APACHE MODULES

MimeMagicFile Directive

Description: Enable MIME-type determination based on file contents using the specified magic fileSyntax: MimeMagicFile file-pathContext: server config, virtual hostStatus: ExtensionModule: mod mime magic

The MIMEMAGICFILE directive can be used to enable this module, the default file is distributed at conf/magic.Non-rooted paths are relative to the SERVERROOT. Virtual hosts will use the same file as the main server unless amore specific setting is used, in which case the more specific setting overrides the main server’s file.

ExampleMimeMagicFile conf/magic

Page 507: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.43. APACHE MODULE MOD NEGOTIATION 499

10.43 Apache Module mod negotiation

Description: Provides for content negotiation (p. 47)Status: BaseModuleIdentifier: negotiation moduleSourceFile: mod negotiation.c

Summary

Content negotiation, or more accurately content selection, is the selection of the document that best matches the clientscapabilities, from one of several available documents. There are two implementations of this.

• A type map (a file with the handler type-map) which explicitly lists the files containing the variants.

• A MultiViews search (enabled by the MultiViews OPTIONS), where the server does an implicit filenamepattern match, and choose from amongst the results.

Directives

• CacheNegotiatedDocs

• ForceLanguagePriority

• LanguagePriority

See also

• OPTIONS

• MOD MIME

• Content Negotiation (p. 47)

• Environment Variables (p. 60)

Type maps

A type map has a format similar to RFC822 mail headers. It contains document descriptions separated by blank lines,with lines beginning with a hash character (’#’) treated as comments. A document description consists of severalheader records; records may be continued on multiple lines if the continuation lines start with spaces. The leadingspace will be deleted and the lines concatenated. A header record consists of a keyword name, which always ends ina colon, followed by a value. Whitespace is allowed between the header name and value, and between the tokens ofvalue. The headers allowed are:

Content-Encoding: The encoding of the file. Apache only recognizes encodings that are defined by an AD-DENCODING directive. This normally includes the encodings x-compress for compress’d files, and x-gzipfor gzip’d files. The x- prefix is ignored for encoding comparisons.

Content-Language: The language(s) of the variant, as an Internet standard language tag (RFC 176624). Anexample is en, meaning English. If the variant contains more than one language, they are separated by acomma.

Content-Length: The length of the file, in bytes. If this header is not present, then the actual length of the file isused.

24http://www.ietf.org/rfc/rfc1766.txt

Page 508: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

500 CHAPTER 10. APACHE MODULES

Content-Type: The MIME media type of the document, with optional parameters. Parameters are separated fromthe media type and from one another by a semi-colon, with a syntax of name=value. Common parametersinclude:

level an integer specifying the version of the media type. For text/html this defaults to 2, otherwise 0.

qs a floating-point number with a value in the range 0.0 to 1.0, indicating the relative ’quality’ of this variantcompared to the other available variants, independent of the client’s capabilities. For example, a jpeg fileis usually of higher source quality than an ascii file if it is attempting to represent a photograph. However,if the resource being represented is ascii art, then an ascii file would have a higher source quality than ajpeg file. All qs values are therefore specific to a given resource.

ExampleContent-Type: image/jpeg; qs=0.8

URI: uri of the file containing the variant (of the given media type, encoded with the given content encoding). Theseare interpreted as URLs relative to the map file; they must be on the same server (!), and they must refer to filesto which the client would be granted access if they were to be requested directly.

Body: New in Apache 2.0, the actual content of the resource may be included in the type-map file using the Bodyheader. This header must contain a string that designates a delimiter for the body content. Then all followinglines in the type map file will be considered part of the resource body until the delimiter string is found.

Example:Body:----xyz----<html><body><p>Content of the page.</p></body></html>

----xyz----

MultiViews

A MultiViews search is enabled by the MultiViews OPTIONS. If the server receives a request for/some/dir/foo and /some/dir/foo does not exist, then the server reads the directory looking for all filesnamed foo.*, and effectively fakes up a type map which names all those files, assigning them the same media typesand content-encodings it would have if the client had asked for one of them by name. It then chooses the best matchto the client’s requirements, and returns that document.

The MULTIVIEWSMATCH directive configures whether Apache will consider files that do not have content negotiationmeta-information assigned to them when choosing files.

CacheNegotiatedDocs Directive

Description: Allows content-negotiated documents to be cached by proxy serversSyntax: CacheNegotiatedDocs On|OffDefault: CacheNegotiatedDocs OffContext: server config, virtual hostStatus: BaseModule: mod negotiationCompatibility: The syntax changed in version 2.0.

Page 509: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.43. APACHE MODULE MOD NEGOTIATION 501

If set, this directive allows content-negotiated documents to be cached by proxy servers. This could mean that clientsbehind those proxys could retrieve versions of the documents that are not the best match for their abilities, but it willmake caching more efficient.

This directive only applies to requests which come from HTTP/1.0 browsers. HTTP/1.1 provides much better controlover the caching of negotiated documents, and this directive has no effect in responses to HTTP/1.1 requests.

Prior to version 2.0, CACHENEGOTIATEDDOCS did not take an argument; it was turned on by the presence of thedirective by itself.

ForceLanguagePriority Directive

Description: Action to take if a single acceptable document is not foundSyntax: ForceLanguagePriority None|Prefer|Fallback [Prefer|Fallback]Default: ForceLanguagePriority PreferContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod negotiationCompatibility: Available in version 2.0.30 and later

The FORCELANGUAGEPRIORITY directive uses the given LANGUAGEPRIORITY to satisfy negotation where theserver could otherwise not return a single matching document.

ForceLanguagePriority Prefer uses LanguagePriority to serve a one valid result, rather than return-ing an HTTP result 300 (MULTIPLE CHOICES) when there are several equally valid choices. If the directives belowwere given, and the user’s Accept-Language header assigned en and de each as quality .500 (equally accept-able) then the first matching variant, en, will be served.

LanguagePriority en fr de

ForceLanguagePriority Prefer

ForceLanguagePriority Fallback uses LANGUAGEPRIORITY to serve a valid result, rather than returningan HTTP result 406 (NOT ACCEPTABLE). If the directives below were given, and the user’s Accept-Languageonly permitted an es language response, but such a variant isn’t found, then the first variant from the LANGUAGEPRI-ORITY list below will be served.

LanguagePriority en fr de

ForceLanguagePriority Fallback

Both options, Prefer and Fallback, may be specified, so either the first matching variant from LANGUAGEPRI-ORITY will be served if more than one variant is acceptable, or first available document will be served if none of thevariants matched the client’s acceptable list of languages.

See also

• ADDLANGUAGE

Page 510: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

502 CHAPTER 10. APACHE MODULES

LanguagePriority Directive

Description: The precendence of language variants for cases where the client does not express a preferenceSyntax: LanguagePriority MIME-lang [MIME-lang] ...Context: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod negotiation

The LANGUAGEPRIORITY sets the precedence of language variants for the case where the client does not express apreference, when handling a MultiViews request. The list of MIME-lang are in order of decreasing preference.

Example:LanguagePriority en fr de

For a request for foo.html, where foo.html.fr and foo.html.de both existed, but the browser did notexpress a language preference, then foo.html.fr would be returned.

Note that this directive only has an effect if a ’best’ language cannot be determined by any other means or the FORCE-LANGUAGEPRIORITY directive is not None. In general, the client determines the language preference, not the server.

See also

• ADDLANGUAGE

Page 511: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.44. APACHE MODULE MOD NW SSL 503

10.44 Apache Module mod nw ssl

Description: Enable SSL encryption for NetWareStatus: BaseModuleIdentifier: nwssl moduleSourceFile: mod nw ssl.cCompatibility: NetWare only

Summary

This module enables SSL encryption for a specified port. It takes advantage of the SSL encryption functionality thatis built into the NetWare operating system.

Directives

• NWSSLTrustedCerts

• NWSSLUpgradeable

• SecureListen

NWSSLTrustedCerts Directive

Description: List of additional client certificatesSyntax: NWSSLTrustedCerts filename [filename] ...Context: server configStatus: BaseModule: mod nw ssl

Specifies a list of client certificate files (DER format) that are used when creating a proxied SSL connection. Eachclient certificate used by a server must be listed separately in its own .der file.

NWSSLUpgradeable Directive

Description: Allows a connection to be upgraded to an SSL connection upon requestSyntax: NWSSLUpgradeable [IP-address:]portnumberContext: server configStatus: BaseModule: mod nw ssl

Allow a connection that was created on the specified address and/or port to be upgraded to an SSL connection uponrequest from the client. The address and/or port must have already be defined previously with a LISTEN directive.

SecureListen Directive

Description: Enables SSL encryption for the specified portSyntax: SecureListen [IP-address:]portnumber Certificate-Name [MUTUAL]Context: server configStatus: BaseModule: mod nw ssl

Specifies the port and the eDirectory based certificate name that will be used to enable SSL encryption. An optionalthird parameter also enables mutual authentication.

Page 512: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

504 CHAPTER 10. APACHE MODULES

10.45 Apache Module mod proxy

Description: HTTP/1.1 proxy/gateway serverStatus: ExtensionModuleIdentifier: proxy moduleSourceFile: mod proxy.c

Summary

! WarningDo not enable proxying with PROXYREQUESTS until you have secured your server. Openproxy servers are dangerous both to your network and to the Internet at large.

This module implements a proxy/gateway for Apache. It implements proxying capability for FTP, CONNECT (forSSL), HTTP/0.9, HTTP/1.0, and HTTP/1.1. The module can be configured to connect to other proxy modulesfor these and other protocols.

Apache’s proxy features are divided into several modules in addition to MOD PROXY: MOD PROXY HTTP,MOD PROXY FTP and MOD PROXY CONNECT. Thus, if you want to use one or more of the particular proxy functions,load MOD PROXY and the appropriate module(s) into the server (either statically at compile-time or dynamically viathe LOADMODULE directive).

In addition, extended features are provided by other modules. Caching is provided by MOD CACHE and relatedmodules. The ability to contact remote servers using the SSL/TLS protocol is provided by the SSLProxy* directivesof MOD SSL. These additional modules will need to be loaded and configured to take advantage of these features.

Directives

• AllowCONNECT

• NoProxy

• <Proxy>

• ProxyBadHeader

• ProxyBlock

• ProxyDomain

• ProxyErrorOverride

• ProxyFtpDirCharset

• ProxyIOBufferSize

• <ProxyMatch>

• ProxyMaxForwards

• ProxyPass

• ProxyPassReverse

• ProxyPreserveHost

• ProxyReceiveBufferSize

• ProxyRemote

• ProxyRemoteMatch

• ProxyRequests

• ProxyTimeout

Page 513: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.45. APACHE MODULE MOD PROXY 505

• ProxyVia

See also

• MOD CACHE

• MOD PROXY HTTP

• MOD PROXY FTP

• MOD PROXY CONNECT

• MOD SSL

Forward and Reverse Proxies

Apache can be configured in both a forward and reverse proxy mode.

An ordinary forward proxy is an intermediate server that sits between the client and the origin server. In order toget content from the origin server, the client sends a request to the proxy naming the origin server as the target andthe proxy then requests the content from the origin server and returns it to the client. The client must be speciallyconfigured to use the forward proxy to access other sites.

A typical usage of a forward proxy is to provide Internet access to internal clients that are otherwise restricted by afirewall. The forward proxy can also use caching (as provided by MOD CACHE) to reduce network usage.

The forward proxy is activated using the PROXYREQUESTS directive. Because forward proxys allow clients to accessarbitrary sites through your server and to hide their true origin, it is essential that you secure your server so that onlyauthorized clients can access the proxy before activating a forward proxy.

A reverse proxy, by contrast, appears to the client just like an ordinary web server. No special configuration on theclient is necessary. The client makes ordinary requests for content in the name-space of the reverse proxy. The reverseproxy then decides where to send those requests, and returns the content as if it was itself the origin.

A typical usage of a reverse proxy is to provide Internet users access to a server that is behind a firewall. Reverseproxies can also be used to balance load among several back-end servers, or to provide caching for a slower back-endserver. In addition, reverse proxies can be used simply to bring several servers into the same URL space.

A reverse proxy is activated using the PROXYPASS directive or the [P] flag to the REWRITERULE directive. It is notnecessary to turn PROXYREQUESTS on in order to configure a reverse proxy.

Basic Examples

The examples below are only a very basic idea to help you get started. Please read the documentation on the individualdirectives.

In addition, if you wish to have caching enabled, consult the documentation from MOD CACHE.

Forward ProxyProxyRequests OnProxyVia On

<Proxy *>

Order deny,allowDeny from allAllow from internal.example.com

</Proxy>

Page 514: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

506 CHAPTER 10. APACHE MODULES

Reverse ProxyProxyRequests Off

<Proxy *>

Order deny,allowAllow from all

</Proxy>

ProxyPass /foo http://foo.example.com/bar

ProxyPassReverse /foo http://foo.example.com/bar

Controlling access to your proxy

You can control who can access your proxy via the <PROXY> control block as in the following example:

<Proxy *>

Order Deny,AllowDeny from allAllow from 192.168.0

</Proxy>

For more information on access control directives, see MOD ACCESS.

Strictly limiting access is essential if you are using a forward proxy (using the PROXYREQUESTS directive). Oth-erwise, your server can be used by any client to access arbitrary hosts while hiding his or her true identity. This isdangerous both for your network and for the Internet at large. When using a reverse proxy (using the PROXYPASSdirective with ProxyRequests Off), access control is less critical because clients can only contact the hosts thatyou have specifically configured.

FTP Proxy

Why doesn’t file type xxx download via FTP?

You probably don’t have that particular file type defined as application/octet-stream in your proxy’smime.types configuration file. A useful line can be

application/octet-stream bin dms lha lzh exe class tgz taz

How can I force an FTP ASCII download of File xxx?

In the rare situation where you must download a specific file using the FTP ASCII transfer method (while the defaulttransfer is in binary mode), you can override MOD PROXY’s default by suffixing the request with ;type=a to forcean ASCII transfer. (FTP Directory listings are always executed in ASCII mode, however.)

How can I access FTP files outside of my home directory?

An FTP URI is interpreted relative to the home directory of the user who is logging in. Alas, to reach higher directorylevels you cannot use /../, as the dots are interpreted by the browser and not actually sent to the FTP server. To addressthis problem, the so called Squid %2f hack was implemented in the Apache FTP proxy; it is a solution which is alsoused by other popular proxy servers like the Squid Proxy Cache25. By prepending /%2f to the path of your request,

25http://www.squid-cache.org/

Page 515: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.45. APACHE MODULE MOD PROXY 507

you can make such a proxy change the FTP starting directory to / (instead of the home directory). For example, toretrieve the file /etc/motd, you would use the URL:

ftp://user@host/%2f/etc/motd

How can I hide the FTP cleartext password in my browser’s URL line?

To log in to an FTP server by username and password, Apache uses different strategies. In absense of a user name andpassword in the URL altogether, Apache sends an anonymous login to the FTP server, i.e.,

user: anonymous

password: apache proxy@

This works for all popular FTP servers which are configured for anonymous access.

For a personal login with a specific username, you can embed the user name into the URL, like in:

ftp://username@host/myfile

If the FTP server asks for a password when given this username (which it should), then Apache will reply with a 401(Authorization required) response, which causes the Browser to pop up the username/password dialog. Upon enteringthe password, the connection attempt is retried, and if successful, the requested resource is presented. The advantageof this procedure is that your browser does not display the password in cleartext (which it would if you had used

ftp://username:password@host/myfile

in the first place).

=⇒NoteThe password which is transmitted in such a way is not encrypted on its way. It travels betweenyour browser and the Apache proxy server in a base64-encoded cleartext string, and betweenthe Apache proxy and the FTP server as plaintext. You should therefore think twice beforeaccessing your FTP server via HTTP (or before accessing your personal files via FTP at all!)When using unsecure channels, an eavesdropper might intercept your password on its way.

Slow Startup

If you’re using the PROXYBLOCK directive, hostnames’ IP addresses are looked up and cached during startup for latermatch test. This may take a few seconds (or more) depending on the speed with which the hostname lookups occur.

Intranet Proxy

An Apache proxy server situated in an intranet needs to forward external requests through the company’s firewall (forthis, configure the PROXYREMOTE directive to forward the respective scheme to the firewall proxy). However, whenit has to access resources within the intranet, it can bypass the firewall when accessing hosts. The NOPROXY directiveis useful for specifying which hosts belong to the intranet and should be accessed directly.

Users within an intranet tend to omit the local domain name from their WWW requests, thus requesting"http://somehost/" instead of http://somehost.example.com/. Some commercial proxy servers let them

Page 516: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

508 CHAPTER 10. APACHE MODULES

get away with this and simply serve the request, implying a configured local domain. When the PROXYDOMAINdirective is used and the server is configured for proxy service, Apache can return a redirect response and send theclient to the correct, fully qualified, server address. This is the preferred method since the user’s bookmark files willthen contain fully qualified hosts.

Protocol Adjustments

For circumstances where you have a application server which doesn’t implement keepalives or HTTP/1.1 properly,there are 2 environment variables which when set send a HTTP/1.0 with no keepalive. These are set via the SETENVdirective.

These are the force-proxy-request-1.0 and proxy-nokeepalive notes.

<Location /buggyappserver/>

ProxyPass http://buggyappserver:7001/foo/SetEnv force-proxy-request-1.0 1SetEnv proxy-nokeepalive 1

</Location>

AllowCONNECT Directive

Description: Ports that are allowed to CONNECT through the proxySyntax: AllowCONNECT port [port] ...Default: AllowCONNECT 443 563Context: server config, virtual hostStatus: ExtensionModule: mod proxy

The ALLOWCONNECT directive specifies a list of port numbers to which the proxy CONNECT method may connect.Today’s browsers use this method when a https connection is requested and proxy tunneling over HTTP is in effect.

By default, only the default https port (443) and the default snews port (563) are enabled. Use the ALLOWCON-NECT directive to override this default and allow connections to the listed ports only.

Note that you’ll need to have MOD PROXY CONNECT present in the server in order to get the support for the CONNECTat all.

NoProxy Directive

Description: Hosts, domains, or networks that will be connected to directlySyntax: NoProxy host [host] ...Context: server config, virtual hostStatus: ExtensionModule: mod proxy

This directive is only useful for Apache proxy servers within intranets. The NOPROXY directive specifies a list ofsubnets, IP addresses, hosts and/or domains, separated by spaces. A request to a host which matches one or more ofthese is always served directly, without forwarding to the configured PROXYREMOTE proxy server(s).

ExampleProxyRemote * http://firewall.example.com:81

NoProxy .example.com 192.168.112.0/21

Page 517: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.45. APACHE MODULE MOD PROXY 509

The host arguments to the NOPROXY directive are one of the following type list:

Domain A Domain is a partially qualified DNS domain name, preceded by a period. It represents a list of hosts whichlogically belong to the same DNS domain or zone (i.e., the suffixes of the hostnames are all ending in Domain).

Examples.com .apache.org.

To distinguish Domains from Hostnames (both syntactically and semantically; a DNS domain can have a DNSA record, too!), Domains are always written with a leading period.

=⇒NoteDomain name comparisons are done without regard to the case, and Domains are always as-sumed to be anchored in the root of the DNS tree, therefore two domains .MyDomain.comand .mydomain.com. (note the trailing period) are considered equal. Since a domain com-parison does not involve a DNS lookup, it is much more efficient than subnet comparison.

SubNet A SubNet is a partially qualified internet address in numeric (dotted quad) form, optionally followed by aslash and the netmask, specified as the number of significant bits in the SubNet. It is used to represent a subnetof hosts which can be reached over a common network interface. In the absence of the explicit net mask it isassumed that omitted (or zero valued) trailing digits specify the mask. (In this case, the netmask can only bemultiples of 8 bits wide.) Examples:

192.168 or 192.168.0.0 the subnet 192.168.0.0 with an implied netmask of 16 valid bits (sometimesused in the netmask form 255.255.0.0)

192.168.112.0/21 the subnet 192.168.112.0/21 with a netmask of 21 valid bits (also used in theform 255.255.248.0)

As a degenerate case, a SubNet with 32 valid bits is the equivalent to an IPAddr, while a SubNet with zero validbits (e.g., 0.0.0.0/0) is the same as the constant Default , matching any IP address.

IPAddr A IPAddr represents a fully qualified internet address in numeric (dotted quad) form. Usually, this addressrepresents a host, but there need not necessarily be a DNS domain name connected with the address.

Example192.168.123.7

=⇒NoteAn IPAddr does not need to be resolved by the DNS system, so it can result in more effectiveapache performance.

Hostname A Hostname is a fully qualified DNS domain name which can be resolved to one or more IPAddrs viathe DNS domain name service. It represents a logical host (in contrast to Domains, see above) and must beresolvable to at least one IPAddr (or often to a list of hosts with different IPAddrs).

Examplesprep.ai.mit.edu

www.apache.org

Page 518: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

510 CHAPTER 10. APACHE MODULES

=⇒NoteIn many situations, it is more effective to specify an IPAddr in place of a Hostname since aDNS lookup can be avoided. Name resolution in Apache can take a remarkable deal of timewhen the connection to the name server uses a slow PPP link.Hostname comparisons are done without regard to the case, and Hostnames are always as-sumed to be anchored in the root of the DNS tree, therefore two hosts WWW.MyDomain.comand www.mydomain.com. (note the trailing period) are considered equal.

See also

• DNS Issues (p. 136)

Proxy Directive

Description: Container for directives applied to proxied resourcesSyntax: <Proxy wildcard-url> ...</Proxy>Context: server config, virtual hostStatus: ExtensionModule: mod proxy

Directives placed in <PROXY> sections apply only to matching proxied content. Shell-style wildcards are allowed.

For example, the following will allow only hosts in yournetwork.example.com to access content via your proxyserver:

<Proxy *>

Order Deny,AllowDeny from allAllow from yournetwork.example.com

</Proxy>

The following example will process all files in the foo directory of example.com through the INCLUDES filterwhen they are sent through the proxy server:

<Proxy http://example.com/foo/*>

SetOutputFilter INCLUDES

</Proxy>

ProxyBadHeader Directive

Description: Determines how to handle bad header lines in a responseSyntax: ProxyBadHeader IsError|Ignore|StartBodyDefault: ProxyBadHeader IsErrorContext: server config, virtual hostStatus: ExtensionModule: mod proxyCompatibility: Available in Apache 2.0.44 and later

The PROXYBADHEADER directive determines the behaviour of MOD PROXY if it receives syntactically invalid headerlines (i.e. containing no colon). The following arguments are possible:

Page 519: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.45. APACHE MODULE MOD PROXY 511

IsError Abort the request and end up with a 502 (Bad Gateway) response. This is the default behaviour.

Ignore Treat bad header lines as if they weren’t sent.

StartBody When receiving the first bad header line, finish reading the headers and treat the remainder as body.This helps to work around buggy backend servers which forget to insert an empty line between the headers andthe body.

ProxyBlock Directive

Description: Words, hosts, or domains that are banned from being proxiedSyntax: ProxyBlock *|word|host|domain [word|host|domain] ...Context: server config, virtual hostStatus: ExtensionModule: mod proxy

The PROXYBLOCK directive specifies a list of words, hosts and/or domains, separated by spaces. HTTP, HTTPS,and FTP document requests to sites whose names contain matched words, hosts or domains are blocked by the proxyserver. The proxy module will also attempt to determine IP addresses of list items which may be hostnames duringstartup, and cache them for match test as well. That may slow down the startup time of the server.

ExampleProxyBlock joes-garage.com some-host.co.uk rocky.wotsamattau.edu

rocky.wotsamattau.edu would also be matched if referenced by IP address.

Note that wotsamattau would also be sufficient to match wotsamattau.edu.

Note also that

ProxyBlock *

blocks connections to all sites.

ProxyDomain Directive

Description: Default domain name for proxied requestsSyntax: ProxyDomain DomainContext: server config, virtual hostStatus: ExtensionModule: mod proxy

This directive is only useful for Apache proxy servers within intranets. The PROXYDOMAIN directive specifies thedefault domain which the apache proxy server will belong to. If a request to a host without a domain name is encoun-tered, a redirection response to the same host with the configured Domain appended will be generated.

ExampleProxyRemote * http://firewall.example.com:81NoProxy .example.com 192.168.112.0/21

ProxyDomain .example.com

Page 520: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

512 CHAPTER 10. APACHE MODULES

ProxyErrorOverride Directive

Description: Override error pages for proxied contentSyntax: ProxyErrorOverride On|OffDefault: ProxyErrorOverride OffContext: server config, virtual hostStatus: ExtensionModule: mod proxyCompatibility: Available in version 2.0 and later

This directive is useful for reverse-proxy setups, where you want to have a common look and feel on the error pagesseen by the end user. This also allows for included files (via mod include’s SSI) to get the error code and act ac-cordingly (default behavior would display the error page of the proxied server, turning this on shows the SSI Errormessage).

ProxyFtpDirCharset Directive

Description: Define the character set for proxied FTP listingsSyntax: ProxyFtpDirCharset character setDefault: ProxyFtpDirCharset ISO-8859-1Context: server config, virtual host, directoryStatus: ExtensionModule: mod proxyCompatibility: Available in Apache 2.0.62 and later

The PROXYFTPDIRCHARSET directive defines the character set to be set for FTP directory listings in HTML gener-ated by MOD PROXY FTP.

ProxyIOBufferSize Directive

Description: Determine size of internal data throughput bufferSyntax: ProxyIOBufferSize bytesDefault: ProxyIOBufferSize 8192Context: server config, virtual hostStatus: ExtensionModule: mod proxy

The PROXYIOBUFFERSIZE directive adjusts the size of the internal buffer, which is used as a scratchpad for the databetween input and output. The size must be less or equal 8192.

In almost every case there’s no reason to change that value.

ProxyMatch Directive

Description: Container for directives applied to regular-expression-matched proxied resourcesSyntax: <ProxyMatch regex> ...</ProxyMatch>Context: server config, virtual hostStatus: ExtensionModule: mod proxy

The <PROXYMATCH> directive is identical to the <PROXY> directive, except it matches URLs using regular ex-pressions.

Page 521: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.45. APACHE MODULE MOD PROXY 513

ProxyMaxForwards Directive

Description: Maximium number of proxies that a request can be forwarded throughSyntax: ProxyMaxForwards numberDefault: ProxyMaxForwards 10Context: server config, virtual hostStatus: ExtensionModule: mod proxyCompatibility: Available in Apache 2.0 and later

The PROXYMAXFORWARDS directive specifies the maximum number of proxies through which a request may pass,if there’s no Max-Forwards header supplied with the request. This is set to prevent infinite proxy loops, or a DoSattack.

ExampleProxyMaxForwards 15

ProxyPass Directive

Description: Maps remote servers into the local server URL-spaceSyntax: ProxyPass [path] !|urlContext: server config, virtual host, directoryStatus: ExtensionModule: mod proxy

This directive allows remote servers to be mapped into the space of the local server; the local server does not act asa proxy in the conventional sense, but appears to be a mirror of the remote server. path is the name of a local virtualpath; url is a partial URL for the remote server and cannot include a query string.

Suppose the local server has address http://example.com/; then

ProxyPass /mirror/foo/ http://backend.example.com/

will cause a local request for http://example.com/mirror/foo/bar to be internally converted into a proxyrequest to http://backend.example.com/bar.

The ! directive is useful in situations where you don’t want to reverse-proxy a subdirectory, e.g.

ProxyPass /mirror/foo/i !

ProxyPass /mirror/foo http://backend.example.com

will proxy all requests to /mirror/foo to backend.example.com except requests made to /mirror/foo/i.

=⇒NoteOrder is important. you need to put the exclusions before the general proxypass directive.

When used inside a <LOCATION> section, the first argument is omitted and the local directory is obtained from the<LOCATION>.

! The PROXYREQUESTS directive should usually be set off when using PROXYPASS.

If you require a more flexible reverse-proxy configuration, see the REWRITERULE directive with the [P] flag.

Page 522: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

514 CHAPTER 10. APACHE MODULES

ProxyPassReverse Directive

Description: Adjusts the URL in HTTP response headers sent from a reverse proxied serverSyntax: ProxyPassReverse [path] urlContext: server config, virtual host, directoryStatus: ExtensionModule: mod proxy

This directive lets Apache adjust the URL in the Location, Content-Location and URI headers on HTTPredirect responses. This is essential when Apache is used as a reverse proxy to avoid by-passing the reverse proxybecause of HTTP redirects on the backend servers which stay behind the reverse proxy.

Only the HTTP response headers specifically mentioned above will be rewritten. Apache will not rewrite other re-sponse headers, nor will it rewrite URL references inside HTML pages. This means that if the proxied content containsabsolute URL references, they will by-pass the proxy. A third-party module that will look inside the HTML and rewriteURL references is Nick Kew’s mod proxy html26.

path is the name of a local virtual path. url is a partial URL for the remote server - the same way they are used for thePROXYPASS directive.

For example, suppose the local server has address http://example.com/; then

ProxyPass /mirror/foo/ http://backend.example.com/

ProxyPassReverse /mirror/foo/ http://backend.example.com/

will not only cause a local request for the http://example.com/mirror/foo/bar to be internallyconverted into a proxy request to http://backend.example.com/bar (the functionality ProxyPassprovides here). It also takes care of redirects the server backend.example.com sends: whenhttp://backend.example.com/bar is redirected by him to http://backend.example.com/quuxApache adjusts this to http://example.com/mirror/foo/quux before forwarding the HTTP redirect re-sponse to the client. Note that the hostname used for constructing the URL is chosen in respect to the setting of theUSECANONICALNAME directive.

Note that this PROXYPASSREVERSE directive can also be used in conjunction with the proxy pass-through feature(RewriteRule ... [P]) from MOD REWRITE because its doesn’t depend on a corresponding PROXYPASSdirective.

When used inside a <LOCATION> section, the first argument is omitted and the local directory is obtained from the<LOCATION>.

ProxyPreserveHost Directive

Description: Use incoming Host HTTP request header for proxy requestSyntax: ProxyPreserveHost On|OffDefault: ProxyPreserveHost OffContext: server config, virtual hostStatus: ExtensionModule: mod proxyCompatibility: Available in Apache 2.0.31 and later.

When enabled, this option will pass the Host: line from the incoming request to the proxied host, instead of thehostname specified in the proxypass line.

This option should normally be turned Off. It is mostly useful in special configurations like proxied mass name-basedvirtual hosting, where the original Host header needs to be evaluated by the backend server.

26http://www.webthing.com/software/mod proxy html/

Page 523: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.45. APACHE MODULE MOD PROXY 515

ProxyReceiveBufferSize Directive

Description: Network buffer size for proxied HTTP and FTP connectionsSyntax: ProxyReceiveBufferSize bytesDefault: ProxyReceiveBufferSize 0Context: server config, virtual hostStatus: ExtensionModule: mod proxy

The PROXYRECEIVEBUFFERSIZE directive specifies an explicit (TCP/IP) network buffer size for proxied HTTP andFTP connections, for increased throughput. It has to be greater than 512 or set to 0 to indicate that the system’sdefault buffer size should be used.

ExampleProxyReceiveBufferSize 2048

ProxyRemote Directive

Description: Remote proxy used to handle certain requestsSyntax: ProxyRemote match remote-serverContext: server config, virtual hostStatus: ExtensionModule: mod proxy

This defines remote proxies to this proxy. match is either the name of a URL-scheme that the remote server supports,or a partial URL for which the remote server should be used, or * to indicate the server should be contacted for allrequests. remote-server is a partial URL for the remote server. Syntax:

remote-server = scheme://hostname[:port]

scheme is effectively the protocol that should be used to communicate with the remote server; only http is supportedby this module.

ExampleProxyRemote http://goodguys.com/ http://mirrorguys.com:8000ProxyRemote * http://cleversite.com

ProxyRemote ftp http://ftpproxy.mydomain.com:8080

In the last example, the proxy will forward FTP requests, encapsulated as yet another HTTP proxy request, to anotherproxy which can handle them.

This option also supports reverse proxy configuration - a backend webserver can be embedded within a virtualhostURL space even if that server is hidden by another forward proxy.

ProxyRemoteMatch Directive

Description: Remote proxy used to handle requests matched by regular expressionsSyntax: ProxyRemoteMatch regex remote-serverContext: server config, virtual hostStatus: ExtensionModule: mod proxy

Page 524: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

516 CHAPTER 10. APACHE MODULES

The PROXYREMOTEMATCH is identical to the PROXYREMOTE directive, except the first argument is a regular ex-pression match against the requested URL.

ProxyRequests Directive

Description: Enables forward (standard) proxy requestsSyntax: ProxyRequests On|OffDefault: ProxyRequests OffContext: server config, virtual hostStatus: ExtensionModule: mod proxy

This allows or prevents Apache from functioning as a forward proxy server. (Setting ProxyRequests to Off does notdisable use of the PROXYPASS directive.)

In a typical reverse proxy configuration, this option should be set to Off.

In order to get the functionality of proxying HTTP or FTP sites, you need also MOD PROXY HTTP or MOD PROXY FTP(or both) present in the server.

! WarningDo not enable proxying with PROXYREQUESTS until you have secured your server. Openproxy servers are dangerous both to your network and to the Internet at large.

ProxyTimeout Directive

Description: Network timeout for proxied requestsSyntax: ProxyTimeout secondsDefault: ProxyTimeout 300Context: server config, virtual hostStatus: ExtensionModule: mod proxyCompatibility: Available in Apache 2.0.31 and later

This directive allows a user to specifiy a timeout on proxy requests. This is useful when you have a slow/buggyappserver which hangs, and you would rather just return a timeout and fail gracefully instead of waiting however longit takes the server to return.

ProxyVia Directive

Description: Information provided in the Via HTTP response header for proxied requestsSyntax: ProxyVia On|Off|Full|BlockDefault: ProxyVia OffContext: server config, virtual hostStatus: ExtensionModule: mod proxy

This directive controls the use of the Via: HTTP header by the proxy. Its intended use is to control the flow of ofproxy requests along a chain of proxy servers. See RFC 261627 (HTTP/1.1), section 14.45 for an explanation of Via:header lines.

27http://www.ietf.org/rfc/rfc2616.txt

Page 525: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.45. APACHE MODULE MOD PROXY 517

• If set to Off, which is the default, no special processing is performed. If a request or reply contains a Via:header, it is passed through unchanged.

• If set to On, each request and reply will get a Via: header line added for the current host.

• If set to Full, each generated Via: header line will additionally have the Apache server version shown as aVia: comment field.

• If set to Block, every proxy request will have all its Via: header lines removed. No new Via: header willbe generated.

Page 526: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

518 CHAPTER 10. APACHE MODULES

10.46 Apache Module mod proxy connect

Description: MOD PROXY extension for CONNECT request handlingStatus: ExtensionModuleIdentifier: proxy connect moduleSourceFile: proxy connect.c

Summary

This module requires the service of MOD PROXY. It provides support for the CONNECT HTTP method. This methodis mainly used to tunnel SSL requests through proxy servers.

Thus, in order to get the ability of handling CONNECT requests, MOD PROXY and MOD PROXY CONNECT have to bepresent in the server.

! WarningDo not enable proxying until you have secured your server (p. 504) . Open proxy servers aredangerous both to your network and to the Internet at large.

Directives This module provides no directives.

See also

• ALLOWCONNECT

• MOD PROXY

Page 527: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.47. APACHE MODULE MOD PROXY FTP 519

10.47 Apache Module mod proxy ftp

Description: FTP support module for MOD PROXYStatus: ExtensionModuleIdentifier: proxy ftp moduleSourceFile: proxy ftp.c

Summary

This module requires the service of MOD PROXY. It provides support for the proxying FTP sites.

Thus, in order to get the ability of handling FTP proxy requests, MOD PROXY and MOD PROXY FTP have to be presentin the server.

! WarningDo not enable proxying until you have secured your server (p. 504) . Open proxy servers aredangerous both to your network and to the Internet at large.

Directives This module provides no directives.

See also

• MOD PROXY

Page 528: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

520 CHAPTER 10. APACHE MODULES

10.48 Apache Module mod proxy http

Description: HTTP support module for MOD PROXYStatus: ExtensionModuleIdentifier: proxy http moduleSourceFile: proxy http.c

Summary

This module requires the service of MOD PROXY. It provides the features used for proxying HTTP requests.MOD PROXY HTTP supports HTTP/0.9, HTTP/1.0 and HTTP/1.1. It does not provide any caching abilities. If youwant to set up a caching proxy, you might want to use the additional service of the MOD CACHE module.

Thus, in order to get the ability of handling HTTP proxy requests, MOD PROXY and MOD PROXY HTTP have to bepresent in the server.

! WarningDo not enable proxying until you have secured your server (p. 504) . Open proxy servers aredangerous both to your network and to the Internet at large.

Directives This module provides no directives.

See also

• MOD PROXY

• MOD PROXY CONNECT

Page 529: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.49. APACHE MODULE MOD REWRITE 521

10.49 Apache Module mod rewrite

Description: Provides a rule-based rewriting engine to rewrite requested URLs on the flyStatus: ExtensionModuleIdentifier: rewrite moduleSourceFile: mod rewrite.cCompatibility: Available in Apache 1.3 and later

Summary

This module uses a rule-based rewriting engine (based on a regular-expression parser) to rewrite requested URLs onthe fly. It supports an unlimited number of rules and an unlimited number of attached rule conditions for each rule, toprovide a really flexible and powerful URL manipulation mechanism. The URL manipulations can depend on varioustests, of server variables, environment variables, HTTP headers, or time stamps. Even external database lookups invarious formats can be used to achieve highly granular URL matching.

This module operates on the full URLs (including the path-info part) both in per-server context (httpd.conf) andper-directory context (.htaccess) and can generate query-string parts on result. The rewritten result can lead tointernal sub-processing, external request redirection or even to an internal proxy throughput.

Further details, discussion, and examples, are provided in the detailed mod rewrite documentation (p. ??) .

Directives

• RewriteBase

• RewriteCond

• RewriteEngine

• RewriteLock

• RewriteLog

• RewriteLogLevel

• RewriteMap

• RewriteOptions

• RewriteRule

See also

• Rewrite Flags

API Phases

Apache processes a HTTP request in several phases. A hook for each of these phases is provided by the Apache API.MOD REWRITE uses two of these hooks: the URL-to-filename translation hook (used after the HTTP request has beenread, but before any authorization starts) and the Fixup hook (triggered after the authorization phases, and after theper-directory config files (.htaccess) have been read, but before the content handler is activated).

Once a request comes in, and Apache has determined the appropriate server (or virtual server), the rewrite engine startsthe URL-to-filename translation, processing the mod rewrite directives from the per-server configuration. A few stepslater, when the final data directories are found, the per-directory configuration directives of mod rewrite are triggeredin the Fixup phase.

Page 530: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

522 CHAPTER 10. APACHE MODULES

Ruleset Processing

When mod rewrite is triggered during these two API phases, it reads the relevant rulesets from its configurationstructure (which was either created on startup, for per-server context, or during the directory traversal for per-directorycontext). The URL rewriting engine is started with the appropriate ruleset (one or more rules together with theirconditions), and its operation is exactly the same for both configuration contexts. Only the final result processing isdifferent.

The order of rules in the ruleset is important because the rewrite engine processes them in a particular (not always ob-vious) order, as follows: The rewrite engine loops through the rulesets (each ruleset being made up of REWRITERULEdirectives, with or without REWRITECONDs), rule by rule. When a particular rule is matched, MOD REWRITE alsochecks the corresponding conditions (RewriteCond directives). For historical reasons the conditions are given first,making the control flow a little bit long-winded. See Figure 1 for more details.

Figure 1:The control flow of the rewrite engine through a rewrite ruleset

As above, first the URL is matched against the Pattern of a rule. If it does not match, MOD REWRITE immediatelystops processing that rule, and goes on to the next rule. If the Pattern matches, MOD REWRITE checks for ruleconditions. If none are present, the URL will be replaced with a new string, constructed from the Substitution string,and MOD REWRITE goes on to the next rule.

If REWRITECONDs exist, an inner loop is started, processing them in the order that they are listed. Conditions arenot matched against the current URL directly. A TestString is constructed by expanding variables, back-references,map lookups, etc., against which the CondPattern is matched. If the pattern fails to match one of the conditions, thecomplete set of rule and associated conditions fails. If the pattern matches a given condition, then matching continuesto the next condition, until no more conditions are available. If all conditions match, processing is continued with thesubstitution of the Substitution string for the URL.

Page 531: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.49. APACHE MODULE MOD REWRITE 523

Regex Back-Reference Availability

Using parentheses in Pattern or in one of the CondPatterns causes back-references to be internally created. These canlater be referenced using the strings $N and %N (see below), for creating the Substitution and TestString strings. Figure2 attempts to show how the back-references are transferred through the process for later expansion.

Figure 2: The back-reference flow through a rule.

Quoting Special Characters

As of Apache 1.3.20, special characters in TestString and Substitutionstrings can be escaped (that is, treated as normalcharacters without their usual special meaning) by prefixing them with a backslash (’\’) character. In other words, youcan include an actual dollar-sign character in aSubstitution string by using ’\$’; this keeps mod rewrite from trying totreat it as a backreference.

Environment Variables

This module keeps track of two additional (non-standard) CGI/SSI environment variables named SCRIPT URL andSCRIPT URI. These contain the logical Web-view to the current resource, while the standard CGI/SSI variablesSCRIPT NAME and SCRIPT FILENAME contain the physical System-view.

Notice: These variables hold the URI/URL as they were initially requested, that is, before any rewriting. This isimportant to note because the rewriting process is primarily used to rewrite logical URLs to physical pathnames.

Example

SCRIPT_NAME=/sw/lib/w3s/tree/global/u/rse/.www/index.htmlSCRIPT_FILENAME=/u/rse/.www/index.htmlSCRIPT_URL=/u/rse/SCRIPT_URI=http://en1.engelschall.com/u/rse/

Practical Solutions

For numerous examples of common, and not-so-common, uses for mod rewrite, see the Rewrite Guide (p. ??) , andthe Advanced Rewrite Guide (p. ??) documents.

Page 532: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

524 CHAPTER 10. APACHE MODULES

RewriteBase Directive

Description: Sets the base URL for per-directory rewritesSyntax: RewriteBase URL-pathDefault: See usage for information.Context: directory, .htaccessOverride: FileInfoStatus: ExtensionModule: mod rewrite

The REWRITEBASE directive explicitly sets the base URL for per-directory rewrites. As you will see below,REWRITERULE can be used in per-directory config files (.htaccess). In such a case, it will act locally, strip-ping the local directory prefix before processing, and applying rewrite rules only to the remainder. When processing iscomplete, the prefix is automatically added back to the path. The default setting is; REWRITEBASE physical-directory-path

When a substitution occurs for a new URL, this module has to re-inject the URL into the server processing. To beable to do this it needs to know what the corresponding URL-prefix or URL-base is. By default this prefix is thecorresponding filepath itself. However, for most websites, URLs are NOT directly related to physical filenamepaths, so this assumption will often be wrong! Therefore, you can use the RewriteBase directive to specify thecorrect URL-prefix.

=⇒If your webserver’s URLs are not directly related to physical file paths, you will need to useREWRITEBASE in every .htaccess file where you want to use REWRITERULE directives.

For example, assume the following per-directory config file:

## /abc/def/.htaccess -- per-dir config file for directory /abc/def# Remember: /abc/def is the physical path of /xyz, i.e., the server# has a ’Alias /xyz /abc/def’ directive e.g.#

RewriteEngine On

# let the server know that we were reached via /xyz and not# via the physical path prefix /abc/defRewriteBase /xyz

# now the rewriting rulesRewriteRule ˆoldstuff\.html$ newstuff.html

In the above example, a request to /xyz/oldstuff.html gets correctly rewritten to the physical file/abc/def/newstuff.html.

Page 533: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.49. APACHE MODULE MOD REWRITE 525

=⇒For Apache HackersThe following list gives detailed information about the internal processing steps:

Request:/xyz/oldstuff.html

Internal Processing:/xyz/oldstuff.html -> /abc/def/oldstuff.html (per-server Alias)/abc/def/oldstuff.html -> /abc/def/newstuff.html (per-dir RewriteRule)/abc/def/newstuff.html -> /xyz/newstuff.html (per-dir RewriteBase)/xyz/newstuff.html -> /abc/def/newstuff.html (per-server Alias)

Result:/abc/def/newstuff.html

This seems very complicated, but is in fact correct Apache internal processing. Because theper-directory rewriting comes late in the process, the rewritten request has to be re-injectedinto the Apache kernel, as if it were a new request. (See mod rewrite technical details (p. ??).) This is not the serious overhead it may seem to be - this re-injection is completely internal tothe Apache server (and the same procedure is used by many other operations within Apache).

RewriteCond Directive

Description: Defines a condition under which rewriting will take placeSyntax: RewriteCond TestString CondPatternContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: ExtensionModule: mod rewrite

The REWRITECOND directive defines a rule condition. One or more REWRITECOND can precede a REWRITERULEdirective. The following rule is then only used if both the current state of the URI matches its pattern, and if theseconditions are met.

TestString is a string which can contain the following expanded constructs in addition to plain text:

• RewriteRule backreferences: These are backreferences of the form $N (0 <= N <= 9), which provide accessto the grouped parts (in parentheses) of the pattern, from the RewriteRule which is subject to the current setof RewriteCond conditions..

• RewriteCond backreferences: These are backreferences of the form %N (1 <= N <= 9), which provide accessto the grouped parts (again, in parentheses) of the pattern, from the last matched RewriteCond in the currentset of conditions.

• RewriteMap expansions: These are expansions of the form ${mapname:key|default}. See the docu-mentation for RewriteMap for more details.

• Server-Variables: These are variables of the form %{ NAME OF VARIABLE } where NAME OF VARIABLEcan be a string taken from the following list:

Page 534: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

526 CHAPTER 10. APACHE MODULES

HTTP headers: connection & request:HTTP USER AGENTHTTP REFERERHTTP COOKIEHTTP FORWARDEDHTTP HOSTHTTP PROXY CONNECTIONHTTP ACCEPT

REMOTE ADDRREMOTE HOSTREMOTE PORTREMOTE USERREMOTE IDENTREQUEST METHODSCRIPT FILENAMEPATH INFOQUERY STRINGAUTH TYPE

server internals: system stuff: specials:DOCUMENT ROOTSERVER ADMINSERVER NAMESERVER ADDRSERVER PORTSERVER PROTOCOLSERVER SOFTWARE

TIME YEARTIME MONTIME DAYTIME HOURTIME MINTIME SECTIME WDAYTIME

API VERSIONTHE REQUESTREQUEST URIREQUEST FILENAMEIS SUBREQHTTPS

These variables all correspond to the similarly named HTTP MIME-headers, C variables of the Apache serveror struct tm fields of the Unix system. Most are documented elsewhere in the Manual or in the CGI speci-fication. Those that are special to mod rewrite include those below.

=⇒IS SUBREQ Will contain the text "true" if the request currently being processed is a sub-

request, "false" otherwise. Sub-requests may be generated by modules that need toresolve additional files or URIs in order to complete their tasks.

API VERSION This is the version of the Apache module API (the internal interface betweenserver and module) in the current httpd build, as defined in include/ap mmn.h. Themodule API version corresponds to the version of Apache in use (in the release versionof Apache 1.3.14, for instance, it is 19990320:10), but is mainly of interest to moduleauthors.

THE REQUEST The full HTTP request line sent by the browser to the server (e.g., "GET/index.html HTTP/1.1"). This does not include any additional headers sent bythe browser.

REQUEST URI The resource requested in the HTTP request line. (In the example above, thiswould be "/index.html".)

REQUEST FILENAME The full local filesystem path to the file or script matching the request.

HTTPS Will contain the text "on" if the connection is using SSL/TLS, or "off" otherwise.(This variable can be safely used regardless of whether or not MOD SSL is loaded).

Other things you should be aware of:

1. The variables SCRIPT FILENAME and REQUEST FILENAME contain the same value - the value of thefilename field of the internal request rec structure of the Apache server. The first name is the commonlyknown CGI variable name while the second is the appropriate counterpart of REQUEST URI (which containsthe value of the uri field of request rec).

2. %{ENV:variable}, where variable can be any environment variable, is also available. This is looked-up viainternal Apache structures and (if not found there) via getenv() from the Apache server process.

Page 535: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.49. APACHE MODULE MOD REWRITE 527

3. %{SSL:variable}, where variable is the name of an SSL environment variable (p. 549) , can be usedwhether or not MOD SSL is loaded, but will always expand to the empty string if it is not. Example:%{SSL:SSL CIPHER USEKEYSIZE} may expand to 128.

4. %{HTTP:header}, where header can be any HTTP MIME-header name, can always be used to obtain thevalue of a header sent in the HTTP request. Example: %{HTTP:Proxy-Connection} is the value of theHTTP header “Proxy-Connection:”.

5. %{LA-U:variable} can be used for look-aheads which perform an internal (URL-based) sub-request todetermine the final value of variable. This can be used to access variable for rewriting which is not availableat the current stage, but will be set in a later phase. For instance, to rewrite according to the REMOTE USERvariable from within the per-server context (httpd.conf file) you must use %{LA-U:REMOTE USER} -this variable is set by the authorization phases, which come after the URL translation phase (during whichmod rewrite operates).

On the other hand, because mod rewrite implements its per-directory context (.htaccess file) via theFixup phase of the API and because the authorization phases come before this phase, you just can use%{REMOTE USER} in that context.

6. %{LA-F:variable} can be used to perform an internal (filename-based) sub-request, to determine the finalvalue of variable. Most of the time, this is the same as LA-U above.

CondPattern is the condition pattern, a regular expression which is applied to the current instance of the TestString.TestString is first evaluated, before being matched against CondPattern.

Remember: CondPattern is a perl compatible regular expression with some additions:

1. You can prefix the pattern string with a ’!’ character (exclamation mark) to specify a non-matching pattern.

2. There are some special variants of CondPatterns. Instead of real regular expression strings you can also use oneof the following:

• ’<CondPattern’ (lexicographically precedes)Treats the CondPattern as a plain string and compares it lexicographically to TestString. True if TestStringlexicographically precedes CondPattern.• ’>CondPattern’ (lexicographically follows)

Treats the CondPattern as a plain string and compares it lexicographically to TestString. True if TestStringlexicographically follows CondPattern.

• ’=CondPattern’ (lexicographically equal)Treats the CondPattern as a plain string and compares it lexicographically to TestString. True if TestStringis lexicographically equal to CondPattern (the two strings are exactly equal, character for character). IfCondPattern is "" (two quotation marks) this compares TestString to the empty string.

• ’-d’ (is directory)Treats the TestString as a pathname and tests whether or not it exists, and is a directory.

• ’-f’ (is regular file)Treats the TestString as a pathname and tests whether or not it exists, and is a regular file.

• ’-s’ (is regular file, with size)Treats the TestString as a pathname and tests whether or not it exists, and is a regular file with size greaterthan zero.

• ’-l’ (is symbolic link)Treats the TestString as a pathname and tests whether or not it exists, and is a symbolic link.

• ’-F’ (is existing file, via subrequest)Checks whether or not TestString is a valid file, accessible via all the server’s currently-configured accesscontrols for that path. This uses an internal subrequest to do the check, so use it with care - it can impactyour server’s performance!

Page 536: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

528 CHAPTER 10. APACHE MODULES

• ’-U’ (is existing URL, via subrequest)Checks whether or not TestString is a valid URL, accessible via all the server’s currently-configured accesscontrols for that path. This uses an internal subrequest to do the check, so use it with care - it can impactyour server’s performance!

=⇒NoteAll of these tests can also be prefixed by an exclamation mark (’!’) to negate their meaning.

3. You can also set special flags for CondPattern by appending [flags] as the third argument to theRewriteCond directive, where flags is a comma-separated list of any of the following flags:

• ’nocase|NC’ (no case)This makes the test case-insensitive - differences between ’A-Z’ and ’a-z’ are ignored, both in the ex-panded TestString and the CondPattern. This flag is effective only for comparisons between TestString andCondPattern. It has no effect on filesystem and subrequest checks.• ’ornext|OR’ (or next condition)

Use this to combine rule conditions with a local OR instead of the implicit AND. Typical example:

RewriteCond %{REMOTE_HOST} =host1 [OR]RewriteCond %{REMOTE_HOST} =host2 [OR]RewriteCond %{REMOTE_HOST} =host3RewriteRule ...some special stuff for any of these hosts...

Without this flag you would have to write the condition/rule pair three times.

Example:

To rewrite the Homepage of a site according to the “User-Agent:” header of the request, you can use the following:

RewriteCond %{HTTP_USER_AGENT} ˆMozillaRewriteRule ˆ/$ /homepage.max.html [L]

RewriteCond %{HTTP_USER_AGENT} ˆLynxRewriteRule ˆ/$ /homepage.min.html [L]

RewriteRule ˆ/$ /homepage.std.html [L]

Explanation: If you use a browser which identifies itself as ’Mozilla’ (including Netscape Navigator, Mozilla etc), thenyou get the max homepage (which could include frames, or other special features). If you use the Lynx browser (whichis terminal-based), then you get the min homepage (which could be a version designed for easy, text-only browsing).If neither of these conditions apply (you use any other browser, or your browser identifies itself as something non-standard), you get the std (standard) homepage.

RewriteEngine Directive

Description: Enables or disables runtime rewriting engineSyntax: RewriteEngine on|offDefault: RewriteEngine offContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: ExtensionModule: mod rewrite

Page 537: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.49. APACHE MODULE MOD REWRITE 529

The REWRITEENGINE directive enables or disables the runtime rewriting engine. If it is set to off this module doesno runtime processing at all. It does not even update the SCRIPT URx environment variables.

Use this directive to disable the module instead of commenting out all the REWRITERULE directives!

Note that, by default, rewrite configurations are not inherited. This means that you need to have a RewriteEngineon directive for each virtual host in which you wish to use it.

REWRITEMAP directives of the type prg are not started during server initialization if they’re defined in a context thatdoes not have REWRITEENGINE set to on

RewriteLock Directive

Description: Sets the name of the lock file used for REWRITEMAP synchronizationSyntax: RewriteLock file-pathContext: server configStatus: ExtensionModule: mod rewrite

This directive sets the filename for a synchronization lockfile which mod rewrite needs to communicate withREWRITEMAP programs. Set this lockfile to a local path (not on a NFS-mounted device) when you want to use arewriting map-program. It is not required for other types of rewriting maps.

RewriteLog Directive

Description: Sets the name of the file used for logging rewrite engine processingSyntax: RewriteLog file-pathContext: server config, virtual hostStatus: ExtensionModule: mod rewrite

The REWRITELOG directive sets the name of the file to which the server logs any rewriting actions it performs. If thename does not begin with a slash (’/’) then it is assumed to be relative to the Server Root. The directive should occuronly once per server config.

=⇒To disable the logging of rewriting actions it is not recommended to set Filename to/dev/null, because although the rewriting engine does not then output to a logfile it stillcreates the logfile output internally. This will slow down the server with no advantage to theadministrator! To disable logging either remove or comment out the REWRITELOG directiveor use RewriteLogLevel 0!

=⇒Security

See the Apache Security Tips (p. 40) document for details on how your security could becompromised if the directory where logfiles are stored is writable by anyone other than theuser that starts the server.

ExampleRewriteLog "/usr/local/var/apache/logs/rewrite.log"

Page 538: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

530 CHAPTER 10. APACHE MODULES

RewriteLogLevel Directive

Description: Sets the verbosity of the log file used by the rewrite engineSyntax: RewriteLogLevel LevelDefault: RewriteLogLevel 0Context: server config, virtual hostStatus: ExtensionModule: mod rewrite

The REWRITELOGLEVEL directive sets the verbosity level of the rewriting logfile. The default level 0 means nologging, while 9 or more means that practically all actions are logged.

To disable the logging of rewriting actions simply set Level to 0. This disables all rewrite action logs.

=⇒Using a high value for Level will slow down your Apache server dramatically! Use the rewrit-ing logfile at a Level greater than 2 only for debugging!

ExampleRewriteLogLevel 3

RewriteMap Directive

Description: Defines a mapping function for key-lookupSyntax: RewriteMap MapName MapType:MapSourceContext: server config, virtual hostStatus: ExtensionModule: mod rewriteCompatibility: The choice of different dbm types is available in Apache 2.0.41 and later

The REWRITEMAP directive defines a Rewriting Map which can be used inside rule substitution strings by themapping-functions to insert/substitute fields through a key lookup. The source of this lookup can be of various types.

The MapName is the name of the map and will be used to specify a mapping-function for the substitution strings of arewriting rule via one of the following constructs:

${MapName : LookupKey }${MapName : LookupKey | DefaultValue }

When such a construct occurs, the map MapName is consulted and the key LookupKey is looked-up. If the key is found,the map-function construct is substituted by SubstValue. If the key is not found then it is substituted by DefaultValueor by the empty string if no DefaultValue was specified.

For example, you might define a REWRITEMAP as:

RewriteMap examplemap txt:/path/to/file/map.txt

You would then be able to use this map in a REWRITERULE as follows:

RewriteRule ˆ/ex/(.*) ${examplemap:$1}

The following combinations for MapType and MapSource can be used:

Page 539: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.49. APACHE MODULE MOD REWRITE 531

• Standard Plain TextMapType: txt, MapSource: Unix filesystem path to valid regular file

This is the standard rewriting map feature where the MapSource is a plain ASCII file containing either blanklines, comment lines (starting with a ’#’ character) or pairs like the following - one per line.

MatchingKey SubstValue

Example

#### map.txt -- rewriting map##

Ralf.S.Engelschall rse # Bastard Operator From HellMr.Joe.Average joe # Mr. Average

RewriteMap real-to-user txt:/path/to/file/map.txt

• Randomized Plain TextMapType: rnd, MapSource: Unix filesystem path to valid regular file

This is identical to the Standard Plain Text variant above but with a special post-processing feature: After lookingup a value it is parsed according to contained “|” characters which have the meaning of “or”. In other wordsthey indicate a set of alternatives from which the actual returned value is chosen randomly. For example, youmight use the following map file and directives to provide a random load balancing between several back-endserver, via a reverse-proxy. Images are sent to one of the servers in the ’static’ pool, while everything else is sentto one of the ’dynamic’ pool.

Example:

Rewrite map file

#### map.txt -- rewriting map##

static www1|www2|www3|www4dynamic www5|www6

Configuration directivesRewriteMap servers rnd:/path/to/file/map.txt

RewriteRule ˆ/(.*\.(png|gif|jpg)) http://${servers:static}/$1 [NC,P,L]

RewriteRule ˆ/(.*) http://${servers:dynamic}/$1 [P,L]

• Hash FileMapType: dbm[=type], MapSource: Unix filesystem path to valid regular file

Here the source is a binary format DBM file containing the same contents as a Plain Text format file, but in aspecial representation which is optimized for really fast lookups. The type can be sdbm, gdbm, ndbm, or dbdepending on compile-time settings (p. 10) . If the type is ommitted, the compile-time default will be chosen.You can create such a file with any DBM tool or with the following Perl script. Be sure to adjust it to create theappropriate type of DBM. The example creates an NDBM file.

Page 540: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

532 CHAPTER 10. APACHE MODULES

#!/path/to/bin/perl#### txt2dbm -- convert txt map to dbm format##

use NDBM_File;use Fcntl;

($txtmap, $dbmmap) = @ARGV;

open(TXT, "<$txtmap") or die "Couldn’t open $txtmap!\n";tie (%DB, ’NDBM_File’, $dbmmap,O_RDWR|O_TRUNC|O_CREAT, 0644)or die "Couldn’t create $dbmmap!\n";

while (<TXT>) {next if (/ˆ\s*#/ or /ˆ\s*$/);$DB{$1} = $2 if (/ˆ\s*(\S+)\s+(\S+)/);

}

untie %DB;close(TXT);

$ txt2dbm map.txt map.db

• Internal FunctionMapType: int, MapSource: Internal Apache function

Here, the source is an internal Apache function. Currently you cannot create your own, but the followingfunctions already exist:

– toupper:Converts the key to all upper case.

– tolower:Converts the key to all lower case.

– escape:Translates special characters in the key to hex-encodings.

– unescape:Translates hex-encodings in the key back to special characters.

• External Rewriting ProgramMapType: prg, MapSource: Unix filesystem path to valid regular file

Here the source is a program, not a map file. To create it you can use a language of your choice, butthe result has to be an executable program (either object-code or a script with the magic cookie trick’#!/path/to/interpreter’ as the first line).

This program is started once, when the Apache server is started, and then communicates with the rewritingengine via its stdin and stdout file-handles. For each map-function lookup it will receive the key to lookupas a newline-terminated string on stdin. It then has to give back the looked-up value as a newline-terminatedstring on stdout or the four-character string “NULL” if it fails (i.e., there is no corresponding value for thegiven key). A trivial program which will implement a 1:1 map (i.e., key == value) could be:

External rewriting programs are not started if they’re defined in a context that does not have REWRITEENGINEset to on

.

Page 541: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.49. APACHE MODULE MOD REWRITE 533

#!/usr/bin/perl$| = 1;while (<STDIN>) {

# ...put here any transformations or lookups...print $_;

}

But be very careful:

1. “Keep it simple, stupid” (KISS). If this program hangs, it will cause Apache to hang when trying to use therelevant rewrite rule.

2. A common mistake is to use buffered I/O on stdout. Avoid this, as it will cause a deadloop! “$|=1” isused above, to prevent this.

3. The REWRITELOCK directive can be used to define a lockfile which mod rewrite can use to synchronizecommunication with the mapping program. By default no such synchronization takes place.

The REWRITEMAP directive can occur more than once. For each mapping-function use one REWRITEMAP directiveto declare its rewriting mapfile. While you cannot declare a map in per-directory context it is of course possible touse this map in per-directory context.

=⇒NoteFor plain text and DBM format files the looked-up keys are cached in-core until the mtimeof the mapfile changes or the server does a restart. This way you can have map-functions inrules which are used for every request. This is no problem, because the external lookup onlyhappens once!

RewriteOptions Directive

Description: Sets some special options for the rewrite engineSyntax: RewriteOptions OptionsDefault: RewriteOptions MaxRedirects=10Context: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: ExtensionModule: mod rewriteCompatibility: MaxRedirects is available in Apache 2.0.45 and later

The REWRITEOPTIONS directive sets some special options for the current per-server or per-directory configuration.The Option strings can be one of the following:

inherit This forces the current configuration to inherit the configuration of the parent. In per-virtual-server contextthis means that the maps, conditions and rules of the main server are inherited. In per-directory context thismeans that conditions and rules of the parent directory’s .htaccess configuration are inherited.

MaxRedirects=number In order to prevent endless loops of internal redirects issued by per-directoryREWRITERULEs, MOD REWRITE aborts the request after reaching a maximum number of such redirects andresponds with an 500 Internal Server Error. If you really need more internal redirects than 10 per request, youmay increase the default to the desired value.

AllowAnyURI When REWRITERULE is used in VirtualHost or server context with version 2.0.65 or later ofhttpd, MOD REWRITE will only process the rewrite rules if the request URI is a URL-path (p. 299) . This avoidssome security issues where particular rules could allow "surprising" pattern expansions (see CVE-2011-336828

28http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-3368

Page 542: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

534 CHAPTER 10. APACHE MODULES

and CVE-2011-431729). To lift the restriction on matching a URL-path, the AllowAnyURI option can beenabled, and MOD REWRITE will apply the rule set to any request URI string, regardless of whether that stringmatches the URL-path grammar required by the HTTP specification.

! Security Warning

Enabling this option will make the server vulnerable to security issues if used with rewriterules which are not carefully authored. It is strongly recommended that this option is notused. In particular, beware of input strings containing the ’@’ character which could changethe interpretation of the transformed URI, as per the above CVE names.

MergeBase With this option, the value of REWRITEBASE is copied from where it’s explicitly defined into any sub-directory or sub-location that doesn’t define its own REWRITEBASE. This flag is available for Apache HTTPServer 2.0.65 and later.

RewriteRule Directive

Description: Defines rules for the rewriting engineSyntax: RewriteRule Pattern SubstitutionContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: ExtensionModule: mod rewriteCompatibility: The cookie-flag is available in Apache 2.0.40 and later.

The REWRITERULE directive is the real rewriting workhorse. The directive can occur more than once, with eachinstance defining a single rewrite rule. The order in which these rules are defined is important - this is the order inwhich they will be applied at run-time.

Pattern is a perl compatible regular expression, which is applied to the current URL. “Current” means the value of theURL when this rule is applied. This may not be the originally requested URL, which may already have matched aprevious rule, and have been altered.

Some hints on the syntax of regular expressions:

29http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-4317

Page 543: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.49. APACHE MODULE MOD REWRITE 535

=⇒Text:

. Any single character[chars] Character class: Any character of the class ‘‘chars’’[ˆchars] Character class: Not a character of the class ‘‘chars’’text1|text2 Alternative: text1 or text2

Quantifiers:? 0 or 1 occurrences of the preceding text

* 0 or N occurrences of the preceding text (N > 0)+ 1 or N occurrences of the preceding text (N > 1)

Grouping:(text) Grouping of text

(used either to set the borders of an alternative as above, orto make backreferences, where the Nth group canbe referred to on the RHS of a RewriteRule as $N)

Anchors:ˆ Start-of-line anchor$ End-of-line anchor

Escaping:\char escape the given char

(for instance, to specify the chars ".[]()" etc.)

For more information about regular expressions, have a look at the perl regular expression manpage ("perldocperlre30"). If you are interested in more detailed information about regular expressions and their variants (POSIXregex etc.) the following book is dedicated to this topic:

Mastering Regular Expressions, 2nd EditionJeffrey E.F. FriedlO’Reilly & Associates, Inc. 2002ISBN 0-596-00289-0

In mod rewrite, the NOT character (’!’) is also available as a possible pattern prefix. This enables you to negate apattern; to say, for instance: “if the current URL does NOT match this pattern”. This can be used for exceptional cases,where it is easier to match the negative pattern, or as a last default rule.

=⇒NoteWhen using the NOT character to negate a pattern, you cannot include grouped wildcard partsin that pattern. This is because, when the pattern does NOT match (ie, the negation matches),there are no contents for the groups. Thus, if negated patterns are used, you cannot use $N inthe substitution string!

The substitution of a rewrite rule is the string which is substituted for (or replaces) the original URL which Patternmatched. In addition to plain text, it can include

1. back-references ($N) to the RewriteRule pattern

2. back-references (%N) to the last matched RewriteCond pattern

3. server-variables as in rule condition test-strings (%{VARNAME})

4. mapping-function calls (${mapname:key|default})30http://perldoc.perl.org/perlre.html

Page 544: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

536 CHAPTER 10. APACHE MODULES

Back-references are identifiers of the form $N (N=0..9), which will be replaced by the contents of the Nth groupof the matched Pattern. The server-variables are the same as for the TestString of a RewriteCond directive. Themapping-functions come from the RewriteMap directive and are explained there. These three types of variables areexpanded in the order above.

As already mentioned, all rewrite rules are applied to the Substitution (in the order in which they are defined in theconfig file). The URL is completely replaced by the Substitution and the rewriting process continues until all ruleshave been applied, or it is explicitly terminated by a L flag - see below.

There is a special substitution string named ’-’ which means: NO substitution! This is useful in providing rewritingrules which only match URLs but do not substitute anything for them. It is commonly used in conjunction with the C(chain) flag, in order to apply more than one pattern before substitution occurs.

Additionally you can set special flags for Substitution by appending [flags] as the third argument to theRewriteRule directive. Flags is a comma-separated list of any of the following flags:

• ’chain|C’ (chained with next rule)This flag chains the current rule with the next rule (which itself can be chained with the following rule, and soon). This has the following effect: if a rule matches, then processing continues as usual - the flag has no effect.If the rule does not match, then all following chained rules are skipped. For instance, it can be used to removethe “.www” part, inside a per-directory rule set, when you let an external redirect happen (where the “.www”part should not occur!).

• ’cookie|CO=NAME:VAL:domain[:lifetime[:path]]’ (set cookie)This sets a cookie in the client’s browser. The cookie’s name is specified by NAME and the value is VAL. Thedomain field is the domain of the cookie, such as ’.apache.org’, the optional lifetime is the lifetime of the cookiein minutes, and the optional path is the path of the cookie

• ’env|E=VAR:VAL’ (set environment variable)This forces an environment variable named VAR to be set to the value VAL, where VAL can contain regexpbackreferences ($N and %N) which will be expanded. You can use this flag more than once, to set more thanone variable. The variables can later be dereferenced in many situations, most commonly from within XSSI(via <!--#echo var="VAR"-->) or CGI ($ENV{’VAR’}). You can also dereference the variable in alater RewriteCond pattern, using %{ENV:VAR}. Use this to strip information from URLs, while maintaining arecord of that information.

• ’forbidden|F’ (force URL to be forbidden)This forces the current URL to be forbidden - it immediately sends back a HTTP response of 403 (FORBID-DEN). Use this flag in conjunction with appropriate RewriteConds to conditionally block some URLs.

• ’gone|G’ (force URL to be gone)This forces the current URL to be gone - it immediately sends back a HTTP response of 410 (GONE). Use thisflag to mark pages which no longer exist as gone.

• ’last|L’ (last rule)Stop the rewriting process here and don’t apply any more rewrite rules. This corresponds to the Perl lastcommand or the break command in C. Use this flag to prevent the currently rewritten URL from being rewrittenfurther by following rules. For example, use it to rewrite the root-path URL (’/’) to a real one, e.g., ’/e/www/’.

• ’next|N’ (next round)Re-run the rewriting process (starting again with the first rewriting rule). This time, the URL to match is nolonger the original URL, but rather the URL returned by the last rewriting rule. This corresponds to the Perlnext command or the continue command in C. Use this flag to restart the rewriting process - to immediatelygo to the top of the loop.Be careful not to create an infinite loop!

• ’nocase|NC’ (no case)This makes the Pattern case-insensitive, ignoring difference between ’A-Z’ and ’a-z’ when Pattern is matchedagainst the current URL.

Page 545: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.49. APACHE MODULE MOD REWRITE 537

• ’noescape|NE’ (no URI escaping of output)This flag prevents mod rewrite from applying the usual URI escaping rules to the result of a rewrite. Ordinarily,special characters (such as ’%’, ’$’, ’;’, and so on) will be escaped into their hexcode equivalents (’%25’, ’%24’,and ’%3B’, respectively); this flag prevents this from happening. This allows percent symbols to appear in theoutput, as in

RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]

which would turn ’/foo/zed’ into a safe request for ’/bar?arg=P1=zed’.

• ’nosubreq|NS’ ( not for internal sub-requests)This flag forces the rewrite engine to skip a rewrite rule if the current request is an internal sub-request. Forinstance, sub-requests occur internally in Apache when MOD INCLUDE tries to find out information about pos-sible directory default files (index.xxx). On sub-requests it is not always useful, and can even cause errors,if the complete set of rules are applied. Use this flag to exclude some rules.To decide whether or not to use this rule: if you prefix URLs with CGI-scripts, to force them to be processedby the CGI-script, it’s likely that you will run into problems (or significant overhead) on sub-requests. In thesecases, use this flag.

• ’proxy|P’ (force proxy)This flag forces the substitution part to be internally sent as a proxy request and immediately (rewrite processingstops here) put through the proxy module (p. 504) . You must make sure that the substitution string is a validURI (typically starting with http://hostname) which can be handled by the Apache proxy module. If not,you will get an error from the proxy module. Use this flag to achieve a more powerful implementation of theProxyPass (p. 504) directive, to map remote content into the namespace of the local server.

Note: MOD PROXY must be enabled in order to use this flag.

• ’passthrough|PT’ (pass through to next handler)This flag forces the rewrite engine to set the uri field of the internal request rec structure to the value of thefilename field. This flag is just a hack to enable post-processing of the output of RewriteRule directives,using Alias, ScriptAlias, Redirect, and other directives from various URI-to-filename translators. Forexample, to rewrite /abc to /def using MOD REWRITE, and then /def to /ghi using MOD ALIAS:

RewriteRule ˆ/abc(.*) /def$1 [PT]

Alias /def /ghi

If you omit the PT flag, mod rewrite will rewrite uri=/abc/... to filename=/def/... as a fullAPI-compliant URI-to-filename translator should do. Then mod alias will try to do a URI-to-filename tran-sition, which will fail.

Note: You must use this flag if you want to mix directives from different modules which allow URL-to-filename translators. The typical example is the use of MOD ALIAS and MOD REWRITE.

• ’qsappend|QSA’ (query string append)This flag forces the rewrite engine to append a query string part of the substitution string to the existing string,instead of replacing it. Use this when you want to add more data to the query string via a rewrite rule.

• ’redirect|R [=code]’ (force redirect)Prefix Substitution with http://thishost[:thisport]/ (which makes the new URL a URI) to force aexternal redirection. If no code is given, a HTTP response of 302 (MOVED TEMPORARILY) will be returned.If you want to use other response codes in the range 300-400, simply specify the appropriate number or use oneof the following symbolic names: temp (default), permanent, seeother. Use this for rules to canonicalizethe URL and return it to the client - to translate “/˜” into “/u/”, or to always append a slash to /u/user, etc.Note: When you use this flag, make sure that the substitution field is a valid URL! Otherwise, youwill be redirecting to an invalid location. Remember that this flag on its own will only prependhttp://thishost[:thisport]/ to the URL, and rewriting will continue. Usually, you will want tostop rewriting at this point, and redirect immediately. To stop rewriting, you should add the ’L’ flag.

Page 546: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

538 CHAPTER 10. APACHE MODULES

• ’skip|S=num’ (skip next rule(s))This flag forces the rewriting engine to skip the next num rules in sequence, if the current rule matches. Usethis to make pseudo if-then-else constructs: The last rule of the then-clause becomes skip=N, where N is thenumber of rules in the else-clause. (This is not the same as the ’chain—C’ flag!)

• ’type|T=MIME-type’ (force MIME type)Force the MIME-type of the target file to be MIME-type. This can be used to set up the content-type based onsome conditions. For example, the following snippet allows .php files to be displayed by mod php if they arecalled with the .phps extension:

RewriteRule ˆ(.+\.php)s$ $1 [T=application/x-httpd-php-source]

=⇒Home directory expansionWhen the substitution string begins with a string resembling "/˜user" (via explicit text orbackreferences), mod rewrite performs home directory expansion independent of the presenceor configuration of MOD USERDIR.This expansion does not occur when the PT flag is used on the REWRITERULE directive.

=⇒Note: Enabling rewrites in per-directory contextTo enable the rewriting engine for per-directory configuration files, you need to set“RewriteEngine On” in these files and “Options FollowSymLinks” must be en-abled. If your administrator has disabled override of FollowSymLinks for a user’s direc-tory, then you cannot use the rewriting engine. This restriction is needed for security reasons.

=⇒Note: Pattern matching in per-directory contextNever forget that Pattern is applied to a complete URL in per-server configuration files. How-ever, in per-directory configuration files, the per-directory prefix (which always is thesame for a specific directory) is automatically removed for the pattern matching and au-tomatically added after the substitution has been done. This feature is essential for manysorts of rewriting - without this, you would always have to match the parent directory which isnot always possible.There is one exception: If a substitution string starts with “http://”, then the directoryprefix will not be added, and an external redirect or proxy throughput (if flag P is used) isforced!

=⇒Note: Substitution of Absolute URLsWhen you prefix a substitution field with http://thishost[:thisport],MOD REWRITE will automatically strip that out. This auto-reduction on URLs with animplicit external redirect is most useful in combination with a mapping-function whichgenerates the hostname part.Remember: An unconditional external redirect to your own server will not work with theprefix http://thishost because of this feature. To achieve such a self-redirect, you haveto use the R-flag.

=⇒Note: Query StringThe Pattern will not be matched against the query string. Instead, you must use a REWRITE-COND with the %{QUERY STRING} variable. You can, however, create URLs in the substitu-tion string, containing a query string part. Simply use a question mark inside the substitutionstring, to indicate that the following text should be re-injected into the query string. When youwant to erase an existing query string, end the substitution string with just a question mark. Tocombine a new query string with an old one, use the [QSA] flag.

Here are all possible substitution combinations and their meanings:

Page 547: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.49. APACHE MODULE MOD REWRITE 539

Inside per-server configuration (httpd.conf)for request “GET /somepath/pathinfo”:

=⇒Given Rule Resulting Substitution---------------------------------------------- ----------------------------------ˆ/somepath(.*) otherpath$1 invalid, not supported

ˆ/somepath(.*) otherpath$1 [R] invalid, not supported

ˆ/somepath(.*) otherpath$1 [P] invalid, not supported---------------------------------------------- ----------------------------------ˆ/somepath(.*) /otherpath$1 /otherpath/pathinfo

ˆ/somepath(.*) /otherpath$1 [R] http://thishost/otherpath/pathinfovia external redirection

ˆ/somepath(.*) /otherpath$1 [P] doesn’t make sense, not supported---------------------------------------------- ----------------------------------ˆ/somepath(.*) http://thishost/otherpath$1 /otherpath/pathinfo

ˆ/somepath(.*) http://thishost/otherpath$1 [R] http://thishost/otherpath/pathinfovia external redirection

ˆ/somepath(.*) http://thishost/otherpath$1 [P] doesn’t make sense, not supported---------------------------------------------- ----------------------------------ˆ/somepath(.*) http://otherhost/otherpath$1 http://otherhost/otherpath/pathinfo

via external redirection

ˆ/somepath(.*) http://otherhost/otherpath$1 [R] http://otherhost/otherpath/pathinfovia external redirection(the [R] flag is redundant)

ˆ/somepath(.*) http://otherhost/otherpath$1 [P] http://otherhost/otherpath/pathinfovia internal proxy

Inside per-directory configuration for /somepath(/physical/path/to/somepath/.htacccess, with RewriteBase /somepath)for request “GET /somepath/localpath/pathinfo”:

Page 548: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

540 CHAPTER 10. APACHE MODULES

=⇒Given Rule Resulting Substitution---------------------------------------------- ----------------------------------ˆlocalpath(.*) otherpath$1 /somepath/otherpath/pathinfo

ˆlocalpath(.*) otherpath$1 [R] http://thishost/somepath/otherpath/pathinfovia external redirection

ˆlocalpath(.*) otherpath$1 [P] doesn’t make sense, not supported---------------------------------------------- ----------------------------------ˆlocalpath(.*) /otherpath$1 /otherpath/pathinfo

ˆlocalpath(.*) /otherpath$1 [R] http://thishost/otherpath/pathinfovia external redirection

ˆlocalpath(.*) /otherpath$1 [P] doesn’t make sense, not supported---------------------------------------------- ----------------------------------ˆlocalpath(.*) http://thishost/otherpath$1 /otherpath/pathinfo

ˆlocalpath(.*) http://thishost/otherpath$1 [R] http://thishost/otherpath/pathinfovia external redirection

ˆlocalpath(.*) http://thishost/otherpath$1 [P] doesn’t make sense, not supported---------------------------------------------- ----------------------------------ˆlocalpath(.*) http://otherhost/otherpath$1 http://otherhost/otherpath/pathinfo

via external redirection

ˆlocalpath(.*) http://otherhost/otherpath$1 [R] http://otherhost/otherpath/pathinfovia external redirection(the [R] flag is redundant)

ˆlocalpath(.*) http://otherhost/otherpath$1 [P] http://otherhost/otherpath/pathinfovia internal proxy

Page 549: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.50. APACHE MODULE MOD SETENVIF 541

10.50 Apache Module mod setenvif

Description: Allows the setting of environment variables based on characteristics of the requestStatus: BaseModuleIdentifier: setenvif moduleSourceFile: mod setenvif.c

Summary

The MOD SETENVIF module allows you to set environment variables according to whether different aspects of therequest match regular expressions you specify. These environment variables can be used by other parts of the serverto make decisions about actions to be taken.

The directives are considered in the order they appear in the configuration files. So more complex sequences can beused, such as this example, which sets netscape if the browser is mozilla but not MSIE.

BrowserMatch ˆMozilla netscape

BrowserMatch MSIE !netscape

Directives

• BrowserMatch

• BrowserMatchNoCase

• SetEnvIf

• SetEnvIfNoCase

See also

• Environment Variables in Apache (p. 60)

BrowserMatch Directive

Description: Sets environment variables conditional on HTTP User-AgentSyntax: BrowserMatch regex [!]env-variable[=value]

[[!]env-variable[=value]] ...Context: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod setenvif

The BROWSERMATCH is a special cases of the SETENVIF directive that sets environment variables conditional on theUser-Agent HTTP request header. The following two lines have the same effect:

BrowserMatchNoCase Robot is a robot

SetEnvIfNoCase User-Agent Robot is a robot

Some additional examples:

BrowserMatch ˆMozilla forms jpeg=yes browser=netscapeBrowserMatch "ˆMozilla/[2-3]" tables agif frames javascript

BrowserMatch MSIE !javascript

Page 550: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

542 CHAPTER 10. APACHE MODULES

BrowserMatchNoCase Directive

Description: Sets environment variables conditional on User-Agent without respect to caseSyntax: BrowserMatchNoCase regex [!]env-variable[=value]

[[!]env-variable[=value]] ...Context: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod setenvifCompatibility: Apache 1.2 and above (in Apache 1.2 this directive was found in the now-obsolete

mod browser module)

The BROWSERMATCHNOCASE directive is semantically identical to the BROWSERMATCH directive. However, itprovides for case-insensitive matching. For example:

BrowserMatchNoCase mac platform=macintosh

BrowserMatchNoCase win platform=windows

The BROWSERMATCH and BROWSERMATCHNOCASE directives are special cases of the SETENVIF and SETENV-IFNOCASE directives. The following two lines have the same effect:

BrowserMatchNoCase Robot is a robot

SetEnvIfNoCase User-Agent Robot is a robot

SetEnvIf Directive

Description: Sets environment variables based on attributes of the requestSyntax: SetEnvIf attribute regex [!]env-variable[=value]

[[!]env-variable[=value]] ...Context: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod setenvif

The SETENVIF directive defines environment variables based on attributes of the request. The attribute specified inthe first argument can be one of three things:

1. An HTTP request header field (see RFC261631 for more information about these); for example: Host,User-Agent, Referer, and Accept-Language. A regular expression may be used to specify a setof request headers.

2. One of the following aspects of the request:

• Remote Host - the hostname (if available) of the client making the request• Remote Addr - the IP address of the client making the request• Server Addr - the IP address of the server on which the request was received (only with versions later

than 2.0.43)• Request Method - the name of the method being used (GET, POST, et cetera)• Request Protocol - the name and version of the protocol with which the request was made (e.g.,"HTTP/0.9", "HTTP/1.1", etc.)

31http://www.rfc-editor.org/rfc/rfc2616.txt

Page 551: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.50. APACHE MODULE MOD SETENVIF 543

• Request URI - the resource requested on the HTTP request line – generally the portion of the URLfollowing the scheme and host portion without the query string. See the REWRITECOND directive ofMOD REWRITE for extra information on how to match your query string.

3. The name of an environment variable in the list of those associated with the request. This allows SETEN-VIF directives to test against the result of prior matches. Only those environment variables defined by earlierSetEnvIf[NoCase] directives are available for testing in this manner. ’Earlier’ means that they were definedat a broader scope (such as server-wide) or previously in the current directive’s scope. Environment variableswill be considered only if there was no match among request characteristics and a regular expression was notused for the attribute.

The second argument (regex) is a Perl compatible regular expression32. This is similar to a POSIX.2 egrep-style regularexpression. If the regex matches against the attribute, then the remainder of the arguments are evaluated.

The rest of the arguments give the names of variables to set, and optionally values to which they should be set. Thesetake the form of

1. varname, or

2. !varname, or

3. varname=value

In the first form, the value will be set to "1". The second will remove the given variable if already defined, and thethird will set the variable to the literal value given by value. Since version 2.0.51 Apache will recognize occurrencesof $1..$9 within value and replace them by parenthesized subexpressions of regex.

Example:SetEnvIf Request URI "\.gif$" object is image=gifSetEnvIf Request URI "\.jpg$" object is image=jpgSetEnvIf Request URI "\.xbm$" object is image=xbm:SetEnvIf Referer www\.mydomain\.com intra site referral:SetEnvIf object is image xbm XBIT PROCESSING=1:

SetEnvIf ˆTS* ˆ[a-z].* HAVE TS

The first three will set the environment variable object is image if the request was for an image file, and thefourth sets intra site referral if the referring page was somewhere on the www.mydomain.com Web site.

The last example will set environment variable HAVE TS if the request contains any headers that begin with "TS"whose values begins with any character in the set [a-z].

See also

• Environment Variables in Apache (p. 60) , for additional examples.

32http://www.pcre.org/

Page 552: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

544 CHAPTER 10. APACHE MODULES

SetEnvIfNoCase Directive

Description: Sets environment variables based on attributes of the request without respect to caseSyntax: SetEnvIfNoCase attribute regex [!]env-variable[=value]

[[!]env-variable[=value]] ...Context: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod setenvifCompatibility: Apache 1.3 and above

The SETENVIFNOCASE is semantically identical to the SETENVIF directive, and differs only in that the regularexpression matching is performed in a case-insensitive manner. For example:

SetEnvIfNoCase Host Apache\.Org site=apache

This will cause the site environment variable to be set to "apache" if the HTTP request header field Host: wasincluded and contained Apache.Org, apache.org, or any other combination.

Page 553: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.51. APACHE MODULE MOD SO 545

10.51 Apache Module mod so

Description: Loading of executable code and modules into the server at start-up or restart timeStatus: ExtensionModuleIdentifier: so moduleSourceFile: mod so.cCompatibility: This is a Base module (always included) on Windows

Summary

On selected operating systems this module can be used to load modules into Apache at runtime via the DynamicShared Object (p. 44) (DSO) mechanism, rather than requiring a recompilation.

On Unix, the loaded code typically comes from shared object files (usually with .so extension), on Windows thismay either the .so or .dll extension.

! WarningApache 1.3 modules cannot be directly used with Apache 2.0 - the module must be modifiedto dynamically load or compile into Apache 2.0.

Directives

• LoadFile

• LoadModule

Creating Loadable Modules for Windows

=⇒NoteThe module name format changed for Windows with Apache 1.3.15 and 2.0 - the modules arenow named as mod foo.soWhile mod so still loads modules with ApacheModuleFoo.dll names, the new naming conven-tion is preferred; if you are converting your loadable module for 2.0, please fix the name to this2.0 convention.

The Apache module API is unchanged between the Unix and Windows versions. Many modules will run on Windowswith no or little change from Unix, although others rely on aspects of the Unix architecture which are not present inWindows, and will not work.

When a module does work, it can be added to the server in one of two ways. As with Unix, it can be com-piled into the server. Because Apache for Windows does not have the Configure program of Apache for Unix,the module’s source file must be added to the ApacheCore project file, and its symbols must be added to theos\win32\modules.c file.

The second way is to compile the module as a DLL, a shared library that can be loaded into the server at runtime, usingthe LOADMODULE directive. These module DLLs can be distributed and run on any Apache for Windows installation,without recompilation of the server.

To create a module DLL, a small change is necessary to the module’s source file: The module record must be exportedfrom the DLL (which will be created later; see below). To do this, add the AP MODULE DECLARE DATA (defined inthe Apache header files) to your module’s module record definition. For example, if your module has:

module foo module;

Page 554: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

546 CHAPTER 10. APACHE MODULES

Replace the above with:

module AP MODULE DECLARE DATA foo module;

Note that this will only be activated on Windows, so the module can continue to be used, unchanged, with Unix ifneeded. Also, if you are familiar with .DEF files, you can export the module record with that method instead.

Now, create a DLL containing your module. You will need to link this against the libhttpd.lib export library that iscreated when the libhttpd.dll shared library is compiled. You may also have to change the compiler settings to ensurethat the Apache header files are correctly located. You can find this library in your server root’s modules directory.It is best to grab an existing module .dsp file from the tree to assure the build environment is configured correctly, oralternately compare the compiler and link options to your .dsp.

This should create a DLL version of your module. Now simply place it in the modules directory of your server root,and use the LOADMODULE directive to load it.

LoadFile Directive

Description: Link in the named object file or librarySyntax: LoadFile filename [filename] ...Context: server configStatus: ExtensionModule: mod so

The LoadFile directive links in the named object files or libraries when the server is started or restarted; this is used toload additional code which may be required for some module to work. Filename is either an absolute path or relativeto ServerRoot (p. 302) .

For example:

LoadFile libexec/libxmlparse.so

LoadModule Directive

Description: Links in the object file or library, and adds to the list of active modulesSyntax: LoadModule module filenameContext: server configStatus: ExtensionModule: mod so

The LoadModule directive links in the object file or library filename and adds the module structure named module tothe list of active modules. Module is the name of the external variable of type module in the file, and is listed as theModule Identifier (p. 298) in the module documentation. Example:

LoadModule status module modules/mod status.so

loads the named module from the modules subdirectory of the ServerRoot.

Page 555: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.52. APACHE MODULE MOD SPELING 547

10.52 Apache Module mod speling

Description: Attempts to correct mistaken URLs that users might have entered by ignoring capitaliza-tion and by allowing up to one misspelling

Status: ExtensionModuleIdentifier: speling moduleSourceFile: mod speling.c

Summary

Requests to documents sometimes cannot be served by the core apache server because the request was misspelled ormiscapitalized. This module addresses this problem by trying to find a matching document, even after all other modulesgave up. It does its work by comparing each document name in the requested directory against the requested documentname without regard to case, and allowing up to one misspelling (character insertion / omission / transposition orwrong character). A list is built with all document names which were matched using this strategy.

If, after scanning the directory,

• no matching document was found, Apache will proceed as usual and return a "document not found" error.

• only one document is found that "almost" matches the request, then it is returned in the form of a redirectionresponse.

• more than one document with a close match was found, then the list of the matches is returned to the client, andthe client can select the correct candidate.

Directives

• CheckSpelling

CheckSpelling Directive

Description: Enables the spelling moduleSyntax: CheckSpelling on|offDefault: CheckSpelling OffContext: server config, virtual host, directory, .htaccessOverride: OptionsStatus: ExtensionModule: mod spelingCompatibility: CheckSpelling was available as a separately available module for Apache 1.1, but was limited

to miscapitalizations. As of Apache 1.3, it is part of the Apache distribution. Prior to Apache1.3.2, the CheckSpelling directive was only available in the "server" and "virtual host"contexts.

This directive enables or disables the spelling module. When enabled, keep in mind that

• the directory scan which is necessary for the spelling correction will have an impact on the server’s performancewhen many spelling corrections have to be performed at the same time.

• the document trees should not contain sensitive files which could be matched inadvertently by a spelling"correction".

• the module is unable to correct misspelled user names (as in http://my.host/˜apahce/), just file namesor directory names.

Page 556: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

548 CHAPTER 10. APACHE MODULES

• spelling corrections apply strictly to existing files, so a request for the <Location /status> may getincorrectly treated as the negotiated file "/stats.html".

Page 557: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.53. APACHE MODULE MOD SSL 549

10.53 Apache Module mod ssl

Description: Strong cryptography using the Secure Sockets Layer (SSL) and Transport Layer Security(TLS) protocols

Status: ExtensionModuleIdentifier: ssl moduleSourceFile: mod ssl.c

Summary

This module provides SSL v2/v3 and TLS v1 support for the Apache HTTP Server. It was contributed by Ralf S.Engeschall based on his mod ssl project and originally derived from work by Ben Laurie.

This module relies on OpenSSL33 to provide the cryptography engine.

Further details, discussion, and examples are provided in the SSL documentation (p. 146) .

Directives

• SSLCACertificateFile

• SSLCACertificatePath

• SSLCARevocationFile

• SSLCARevocationPath

• SSLCertificateChainFile

• SSLCertificateFile

• SSLCertificateKeyFile

• SSLCipherSuite

• SSLEngine

• SSLHonorCipherOrder

• SSLInsecureRenegotiation

• SSLMutex

• SSLOptions

• SSLPassPhraseDialog

• SSLProtocol

• SSLProxyCACertificateFile

• SSLProxyCACertificatePath

• SSLProxyCARevocationFile

• SSLProxyCARevocationPath

• SSLProxyCipherSuite

• SSLProxyEngine

• SSLProxyMachineCertificateFile

• SSLProxyMachineCertificatePath

• SSLProxyProtocol

• SSLProxyVerify

33http://www.openssl.org/

Page 558: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

550 CHAPTER 10. APACHE MODULES

• SSLProxyVerifyDepth

• SSLRandomSeed

• SSLRequire

• SSLRequireSSL

• SSLSessionCache

• SSLSessionCacheTimeout

• SSLUserName

• SSLVerifyClient

• SSLVerifyDepth

Environment Variables

This module provides a lot of SSL information as additional environment variables to the SSI and CGI namespace. Thegenerated variables are listed in the table below. For backward compatibility the information can be made availableunder different names, too. Look in the Compatibility (p. 156) chapter for details on the compatibility variables.

Variable Name: Value Type: Description:HTTPS flag HTTPS is being used.SSL PROTOCOL string The SSL protocol version (SSLv2, SSLv3, TLSv1)SSL SESSION ID string The hex-encoded SSL session idSSL CIPHER string The cipher specification nameSSL CIPHER EXPORT string true if cipher is an export cipherSSL CIPHER USEKEYSIZE number Number of cipher bits (actually used)SSL CIPHER ALGKEYSIZE number Number of cipher bits (possible)SSL VERSION INTERFACE string The mod ssl program versionSSL VERSION LIBRARY string The OpenSSL program versionSSL CLIENT M VERSION string The version of the client certificateSSL CLIENT M SERIAL string The serial of the client certificateSSL CLIENT S DN string Subject DN in client’s certificateSSL CLIENT S DN x509 string Component of client’s Subject DNSSL CLIENT I DN string Issuer DN of client’s certificateSSL CLIENT I DN x509 string Component of client’s Issuer DNSSL CLIENT V START string Validity of client’s certificate (start time)SSL CLIENT V END string Validity of client’s certificate (end time)SSL CLIENT A SIG string Algorithm used for the signature of client’s certificateSSL CLIENT A KEY string Algorithm used for the public key of client’s certificateSSL CLIENT CERT string PEM-encoded client certificateSSL CLIENT CERT CHAINn string PEM-encoded certificates in client certificate chainSSL CLIENT VERIFY string NONE, SUCCESS, GENEROUS or FAILED:reasonSSL SERVER M VERSION string The version of the server certificateSSL SERVER M SERIAL string The serial of the server certificateSSL SERVER S DN string Subject DN in server’s certificateSSL SERVER S DN x509 string Component of server’s Subject DNSSL SERVER I DN string Issuer DN of server’s certificateSSL SERVER I DN x509 string Component of server’s Issuer DNSSL SERVER V START string Validity of server’s certificate (start time)SSL SERVER V END string Validity of server’s certificate (end time)SSL SERVER A SIG string Algorithm used for the signature of server’s certificateSSL SERVER A KEY string Algorithm used for the public key of server’s certificateSSL SERVER CERT string PEM-encoded server certificate

Page 559: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.53. APACHE MODULE MOD SSL 551

[ where x509 is a component of a X.509 DN: C,ST,L,O,OU,CN,T,I,G,S,D,UID,Email ]

Custom Log Formats

When MOD SSL is built into Apache or at least loaded (under DSO situation) additional functions exist for the CustomLog Format (p. 471) of MOD LOG CONFIG. First there is an additional “%{varname}x” eXtension format functionwhich can be used to expand any variables provided by any module, especially those provided by mod ssl which canyou find in the above table.

For backward compatibility there is additionally a special “%{name}c” cryptography format function provided. Infor-mation about this function is provided in the Compatibility (p. 156) chapter.

Example:

CustomLog logs/ssl request log \"%t %h %{SSL PROTOCOL}x %{SSL CIPHER}x\"%r\" %b"

SSLCACertificateFile Directive

Description: File of concatenated PEM-encoded CA Certificates for Client AuthSyntax: SSLCACertificateFile file-pathContext: server config, virtual hostStatus: ExtensionModule: mod ssl

This directive sets the all-in-one file where you can assemble the Certificates of Certification Authorities (CA) whoseclients you deal with. These are used for Client Authentication. Such a file is simply the concatenation of the variousPEM-encoded Certificate files, in order of preference. This can be used alternatively and/or additionally to SSLCAC-ERTIFICATEPATH.

ExampleSSLCACertificateFile

/usr/local/apache2/conf/ssl.crt/ca-bundle-client.crt

SSLCACertificatePath Directive

Description: Directory of PEM-encoded CA Certificates for Client AuthSyntax: SSLCACertificatePath directory-pathContext: server config, virtual hostStatus: ExtensionModule: mod ssl

This directive sets the directory where you keep the Certificates of Certification Authorities (CAs) whose clients youdeal with. These are used to verify the client certificate on Client Authentication.

The files in this directory have to be PEM-encoded and are accessed through hash filenames. So usually you can’t justplace the Certificate files there: you also have to create symbolic links named hash-value.N. And you should alwaysmake sure this directory contains the appropriate symbolic links.

ExampleSSLCACertificatePath /usr/local/apache2/conf/ssl.crt/

Page 560: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

552 CHAPTER 10. APACHE MODULES

SSLCARevocationFile Directive

Description: File of concatenated PEM-encoded CA CRLs for Client AuthSyntax: SSLCARevocationFile file-pathContext: server config, virtual hostStatus: ExtensionModule: mod ssl

This directive sets the all-in-one file where you can assemble the Certificate Revocation Lists (CRL) of CertificationAuthorities (CA) whose clients you deal with. These are used for Client Authentication. Such a file is simply theconcatenation of the various PEM-encoded CRL files, in order of preference. This can be used alternatively and/oradditionally to SSLCAREVOCATIONPATH.

ExampleSSLCARevocationFile

/usr/local/apache2/conf/ssl.crl/ca-bundle-client.crl

SSLCARevocationPath Directive

Description: Directory of PEM-encoded CA CRLs for Client AuthSyntax: SSLCARevocationPath directory-pathContext: server config, virtual hostStatus: ExtensionModule: mod ssl

This directive sets the directory where you keep the Certificate Revocation Lists (CRL) of Certification Authorities(CAs) whose clients you deal with. These are used to revoke the client certificate on Client Authentication.

The files in this directory have to be PEM-encoded and are accessed through hash filenames. So usually you have notonly to place the CRL files there. Additionally you have to create symbolic links named hash-value.rN. And youshould always make sure this directory contains the appropriate symbolic links.

ExampleSSLCARevocationPath /usr/local/apache2/conf/ssl.crl/

SSLCertificateChainFile Directive

Description: File of PEM-encoded Server CA CertificatesSyntax: SSLCertificateChainFile file-pathContext: server config, virtual hostStatus: ExtensionModule: mod ssl

This directive sets the optional all-in-one file where you can assemble the certificates of Certification Authorities(CA) which form the certificate chain of the server certificate. This starts with the issuing CA certificate of of theserver certificate and can range up to the root CA certificate. Such a file is simply the concatenation of the variousPEM-encoded CA Certificate files, usually in certificate chain order.

This should be used alternatively and/or additionally to SSLCACERTIFICATEPATH for explicitly constructing theserver certificate chain which is sent to the browser in addition to the server certificate. It is especially useful to avoidconflicts with CA certificates when using client authentication. Because although placing a CA certificate of the servercertificate chain into SSLCACERTIFICATEPATH has the same effect for the certificate chain construction, it has the

Page 561: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.53. APACHE MODULE MOD SSL 553

side-effect that client certificates issued by this same CA certificate are also accepted on client authentication. That’susually not one expect.

But be careful: Providing the certificate chain works only if you are using a single (either RSA or DSA) based servercertificate. If you are using a coupled RSA+DSA certificate pair, this will work only if actually both certificates usethe same certificate chain. Else the browsers will be confused in this situation.

ExampleSSLCertificateChainFile /usr/local/apache2/conf/ssl.crt/ca.crt

SSLCertificateFile Directive

Description: Server PEM-encoded X.509 Certificate fileSyntax: SSLCertificateFile file-pathContext: server config, virtual hostStatus: ExtensionModule: mod ssl

This directive points to the PEM-encoded Certificate file for the server and optionally also to the corresponding RSAor DSA Private Key file for it (contained in the same file). If the contained Private Key is encrypted the Pass Phrasedialog is forced at startup time. This directive can be used up to two times (referencing different filenames) when botha RSA and a DSA based server certificate is used in parallel.

ExampleSSLCertificateFile /usr/local/apache2/conf/ssl.crt/server.crt

SSLCertificateKeyFile Directive

Description: Server PEM-encoded Private Key fileSyntax: SSLCertificateKeyFile file-pathContext: server config, virtual hostStatus: ExtensionModule: mod ssl

This directive points to the PEM-encoded Private Key file for the server. If the Private Key is not combined with theCertificate in the SSLCERTIFICATEFILE, use this additional directive to point to the file with the stand-alone PrivateKey. When SSLCERTIFICATEFILE is used and the file contains both the Certificate and the Private Key this directiveneed not be used. But we strongly discourage this practice. Instead we recommend you to separate the Certificateand the Private Key. If the contained Private Key is encrypted, the Pass Phrase dialog is forced at startup time. Thisdirective can be used up to two times (referencing different filenames) when both a RSA and a DSA based private keyis used in parallel.

ExampleSSLCertificateKeyFile /usr/local/apache2/conf/ssl.key/server.key

Page 562: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

554 CHAPTER 10. APACHE MODULES

SSLCipherSuite Directive

Description: Cipher Suite available for negotiation in SSL handshakeSyntax: SSLCipherSuite cipher-specDefault: SSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXPContext: server config, virtual host, directory, .htaccessOverride: AuthConfigStatus: ExtensionModule: mod ssl

This complex directive uses a colon-separated cipher-spec string consisting of OpenSSL cipher specifications to con-figure the Cipher Suite the client is permitted to negotiate in the SSL handshake phase. Notice that this directive canbe used both in per-server and per-directory context. In per-server context it applies to the standard SSL handshakewhen a connection is established. In per-directory context it forces a SSL renegotation with the reconfigured CipherSuite after the HTTP request was read but before the HTTP response is sent.

An SSL cipher specification in cipher-spec is composed of 4 major attributes plus a few extra minor ones:

• Key Exchange Algorithm:RSA or Diffie-Hellman variants.

• Authentication Algorithm:RSA, Diffie-Hellman, DSS or none.

• Cipher/Encryption Algorithm:DES, Triple-DES, RC4, RC2, IDEA or none.

• MAC Digest Algorithm:MD5, SHA or SHA1.

An SSL cipher can also be an export cipher and is either a SSLv2 or SSLv3/TLSv1 cipher (here TLSv1 is equivalentto SSLv3). To specify which ciphers to use, one can either specify all the Ciphers, one at a time, or use aliases tospecify the preference and order for the ciphers (see Table 1).

Tag DescriptionKey Exchange Algorithm:kRSA RSA key exchangekDHr Diffie-Hellman key exchange with RSA keykDHd Diffie-Hellman key exchange with DSA keykEDH Ephemeral (temp.key) Diffie-Hellman key exchange (no cert)Authentication Algorithm:aNULL No authenticationaRSA RSA authenticationaDSS DSS authenticationaDH Diffie-Hellman authenticationCipher Encoding Algorithm:eNULL No encodingDES DES encoding3DES Triple-DES encodingRC4 RC4 encodingRC2 RC2 encodingIDEA IDEA encodingMAC Digest Algorithm:MD5 MD5 hash functionSHA1 SHA1 hash function

Page 563: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.53. APACHE MODULE MOD SSL 555

SHA SHA hash functionAliases:SSLv2 all SSL version 2.0 ciphersSSLv3 all SSL version 3.0 ciphersTLSv1 all TLS version 1.0 ciphersEXP all export ciphersEXPORT40 all 40-bit export ciphers onlyEXPORT56 all 56-bit export ciphers onlyLOW all low strength ciphers (no export, single DES)MEDIUM all ciphers with 128 bit encryptionHIGH all ciphers using Triple-DESRSA all ciphers using RSA key exchangeDH all ciphers using Diffie-Hellman key exchangeEDH all ciphers using Ephemeral Diffie-Hellman key exchangeADH all ciphers using Anonymous Diffie-Hellman key exchangeDSS all ciphers using DSS authenticationNULL all ciphers using no encryption

Now where this becomes interesting is that these can be put together to specify the order and ciphers you wish to use.To speed this up there are also aliases (SSLv2, SSLv3, TLSv1, EXP, LOW, MEDIUM, HIGH) for certaingroups of ciphers. These tags can be joined together with prefixes to form the cipher-spec. Available prefixes are:

• none: add cipher to list

• +: move matching ciphers to the current location in list

• -: remove cipher from list (can be added later again)

• !: kill cipher from list completely (can not be added later again)

A simpler way to look at all of this is to use the “openssl ciphers -v” command which pro-vides a nice way to successively create the correct cipher-spec string. The default cipher-spec string is“ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP” which means the following: first, removefrom consideration any ciphers that do not authenticate, i.e. for SSL only the Anonymous Diffie-Hellman ciphers.Next, use ciphers using RC4 and RSA. Next include the high, medium and then the low security ciphers. Finally pullall SSLv2 and export ciphers to the end of the list.

$ openssl ciphers -v ’ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP’NULL-SHA SSLv3 Kx=RSA Au=RSA Enc=None Mac=SHA1NULL-MD5 SSLv3 Kx=RSA Au=RSA Enc=None Mac=MD5EDH-RSA-DES-CBC3-SHA SSLv3 Kx=DH Au=RSA Enc=3DES(168) Mac=SHA1... ... ... ... ...EXP-RC4-MD5 SSLv3 Kx=RSA(512) Au=RSA Enc=RC4(40) Mac=MD5 exportEXP-RC2-CBC-MD5 SSLv2 Kx=RSA(512) Au=RSA Enc=RC2(40) Mac=MD5 exportEXP-RC4-MD5 SSLv2 Kx=RSA(512) Au=RSA Enc=RC4(40) Mac=MD5 export

The complete list of particular RSA & DH ciphers for SSL is given in Table 2.

ExampleSSLCipherSuite RSA:!EXP:!NULL:+HIGH:+MEDIUM:-LOW

Page 564: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

556 CHAPTER 10. APACHE MODULES

Cipher-Tag Protocol Key Ex. Auth. Enc. MAC TypeRSA Ciphers:DES-CBC3-SHA SSLv3 RSA RSA 3DES(168) SHA1DES-CBC3-MD5 SSLv2 RSA RSA 3DES(168) MD5IDEA-CBC-SHA SSLv3 RSA RSA IDEA(128) SHA1RC4-SHA SSLv3 RSA RSA RC4(128) SHA1RC4-MD5 SSLv3 RSA RSA RC4(128) MD5IDEA-CBC-MD5 SSLv2 RSA RSA IDEA(128) MD5RC2-CBC-MD5 SSLv2 RSA RSA RC2(128) MD5RC4-MD5 SSLv2 RSA RSA RC4(128) MD5DES-CBC-SHA SSLv3 RSA RSA DES(56) SHA1RC4-64-MD5 SSLv2 RSA RSA RC4(64) MD5DES-CBC-MD5 SSLv2 RSA RSA DES(56) MD5EXP-DES-CBC-SHA SSLv3 RSA(512) RSA DES(40) SHA1 exportEXP-RC2-CBC-MD5 SSLv3 RSA(512) RSA RC2(40) MD5 exportEXP-RC4-MD5 SSLv3 RSA(512) RSA RC4(40) MD5 exportEXP-RC2-CBC-MD5 SSLv2 RSA(512) RSA RC2(40) MD5 exportEXP-RC4-MD5 SSLv2 RSA(512) RSA RC4(40) MD5 exportNULL-SHA SSLv3 RSA RSA None SHA1NULL-MD5 SSLv3 RSA RSA None MD5Diffie-Hellman Ciphers:ADH-DES-CBC3-SHA SSLv3 DH None 3DES(168) SHA1ADH-DES-CBC-SHA SSLv3 DH None DES(56) SHA1ADH-RC4-MD5 SSLv3 DH None RC4(128) MD5EDH-RSA-DES-CBC3-SHA SSLv3 DH RSA 3DES(168) SHA1EDH-DSS-DES-CBC3-SHA SSLv3 DH DSS 3DES(168) SHA1EDH-RSA-DES-CBC-SHA SSLv3 DH RSA DES(56) SHA1EDH-DSS-DES-CBC-SHA SSLv3 DH DSS DES(56) SHA1EXP-EDH-RSA-DES-CBC-SHA SSLv3 DH(512) RSA DES(40) SHA1 exportEXP-EDH-DSS-DES-CBC-SHA SSLv3 DH(512) DSS DES(40) SHA1 exportEXP-ADH-DES-CBC-SHA SSLv3 DH(512) None DES(40) SHA1 exportEXP-ADH-RC4-MD5 SSLv3 DH(512) None RC4(40) MD5 export

SSLEngine Directive

Description: SSL Engine Operation SwitchSyntax: SSLEngine on|offDefault: SSLEngine offContext: server config, virtual hostStatus: ExtensionModule: mod ssl

This directive toggles the usage of the SSL/TLS Protocol Engine. This is usually used inside a <VIRTUALHOST>section to enable SSL/TLS for a particular virtual host. By default the SSL/TLS Protocol Engine is disabled for boththe main server and all configured virtual hosts.

Example<VirtualHost default :443>SSLEngine on...

</VirtualHost>

Page 565: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.53. APACHE MODULE MOD SSL 557

SSLHonorCipherOrder Directive

Description: Option to prefer the server’s cipher preference orderSyntax: SSLHonorCipherOrder flagContext: server config, virtual hostStatus: ExtensionModule: mod sslCompatibility: Available in Apache 2.0.65 and later, if using OpenSSL 0.9.7 or later

When choosing a cipher during an SSLv3 or TLSv1 handshake, normally the client’s preference is used. If thisdirective is enabled, the server’s preference will be used instead.

ExampleSSLHonorCipherOrder on

SSLInsecureRenegotiation Directive

Description: Option to enable support for insecure renegotiationSyntax: SSLInsecureRenegotiation flagDefault: SSLInsecureRenegotiation offContext: server config, virtual hostStatus: ExtensionModule: mod sslCompatibility: Available in httpd 2.0.64 and later, if using OpenSSL 0.9.8m or later

As originally specified, all versions of the SSL and TLS protocols (up to and including TLS/1.2) were vulnerableto a Man-in-the-Middle attack (CVE-2009-355534) during a renegotiation. This vulnerability allowed an attacker to"prefix" a chosen plaintext to the HTTP request as seen by the web server. A protocol extension was developed whichfixed this vulnerability if supported by both client and server.

If MOD SSL is linked against OpenSSL version 0.9.8m or later, by default renegotiation is only supported with clientssupporting the new protocol extension. If this directive is enabled, renegotiation will be allowed with old (unpatched)clients, albeit insecurely.

! Security warningIf this directive is enabled, SSL connections will be vulnerable to the Man-in-the-Middle prefixattack as described in CVE-2009-3555a.

ahttp://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2009-3555

ExampleSSLInsecureRenegotiation on

The SSL SECURE RENEG environment variable can be used from an SSI or CGI script to determine whether securerenegotiation is supported for a given SSL connection.

34http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2009-3555

Page 566: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

558 CHAPTER 10. APACHE MODULES

SSLMutex Directive

Description: Semaphore for internal mutual exclusion of operationsSyntax: SSLMutex typeDefault: SSLMutex noneContext: server configStatus: ExtensionModule: mod ssl

This configures the SSL engine’s semaphore (aka. lock) which is used for mutual exclusion of operations which haveto be done in a synchronized way between the pre-forked Apache server processes. This directive can only be used inthe global server context because it’s only useful to have one global mutex. This directive is designed to closely matchthe AcceptMutex35 directive

The following Mutex types are available:

• none | no

This is the default where no Mutex is used at all. Use it at your own risk. But because currently the Mutex ismainly used for synchronizing write access to the SSL Session Cache you can live without it as long as youaccept a sometimes garbled Session Cache. So it’s not recommended to leave this the default. Instead configurea real Mutex.

• posixsem

This is an elegant Mutex variant where a Posix Semaphore is used when possible. It is only available when theunderlying platform and APR supports it.

• sysvsem

This is a somewhat elegant Mutex variant where a SystemV IPC Semaphore is used when possible. It is possibleto "leak" SysV semaphores if processes crash before the semaphore is removed. It is only available when theunderlying platform and APR supports it.

• sem

This directive tells the SSL Module to pick the "best" semaphore implementation available to it, choosingbetween Posix and SystemV IPC, in that order. It is only available when the underlying platform and APRsupports at least one of the 2.

• pthread

This directive tells the SSL Module to use Posix thread mutexes. It is only available if the underlying platformand APR supports it.

• fcntl:/path/to/mutex

This is a portable Mutex variant where a physical (lock-)file and the fcntl() fucntion are used as the Mu-tex. Always use a local disk filesystem for /path/to/mutex and never a file residing on a NFS- or AFS-filesystem. It is only available when the underlying platform and APR supports it. Note: Internally, the ProcessID (PID) of the Apache parent process is automatically appended to /path/to/mutex to make it unique, soyou don’t have to worry about conflicts yourself. Notice that this type of mutex is not available under the Win32environment. There you have to use the semaphore mutex.

• flock:/path/to/mutex

This is similar to the fcntl:/path/to/mutex method with the exception that the flock() function isused to provide file locking. It is only available when the underlying platform and APR supports it.

• file:/path/to/mutex

This directive tells the SSL Module to pick the "best" file locking implementation available to it, choosingbetween fcntl and flock, in that order. It is only available when the underlying platform and APR supportsat least one of the 2.

35http://httpd.apache.org/docs/2.0/mod/mpm common.html#acceptmutex

Page 567: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.53. APACHE MODULE MOD SSL 559

• default | yes

This directive tells the SSL Module to pick the default locking implementation as determined by the platformand APR.

ExampleSSLMutex file:/usr/local/apache/logs/ssl mutex

SSLOptions Directive

Description: Configure various SSL engine run-time optionsSyntax: SSLOptions [+|-]option ...Context: server config, virtual host, directory, .htaccessOverride: OptionsStatus: ExtensionModule: mod ssl

This directive can be used to control various run-time options on a per-directory basis. Normally, if multipleSSLOptions could apply to a directory, then the most specific one is taken completely; the options are not merged.However if all the options on the SSLOptions directive are preceded by a plus (+) or minus (-) symbol, the optionsare merged. Any options preceded by a + are added to the options currently in force, and any options preceded by a -are removed from the options currently in force.

The available options are:

• StdEnvVars

When this option is enabled, the standard set of SSL related CGI/SSI environment variables are created. Thisper default is disabled for performance reasons, because the information extraction step is a rather expensiveoperation. So one usually enables this option for CGI and SSI requests only.

• CompatEnvVars

When this option is enabled, additional CGI/SSI environment variables are created for backward compatibilityto other Apache SSL solutions. Look in the Compatibility (p. 156) chapter for details on the particular variablesgenerated.

• ExportCertData

When this option is enabled, additional CGI/SSI environment variables are created: SSL SERVER CERT,SSL CLIENT CERT and SSL CLIENT CERT CHAINn (with n = 0,1,2,..). These contain the PEM-encodedX.509 Certificates of server and client for the current HTTPS connection and can be used by CGI scripts fordeeper Certificate checking. Additionally all other certificates of the client certificate chain are provided, too.This bloats up the environment a little bit which is why you have to use this option to enable it on demand.

• FakeBasicAuth

When this option is enabled, the Subject Distinguished Name (DN) of the Client X509 Certificate is translatedinto a HTTP Basic Authorization username. This means that the standard Apache authentication methods canbe used for access control. The user name is just the Subject of the Client’s X509 Certificate (can be determinedby running OpenSSL’s openssl x509 command: openssl x509 -noout -subject -in certifi-cate.crt). Note that no password is obtained from the user. Every entry in the user file needs this password:“xxj31ZMTZzkVA”, which is the DES-encrypted version of the word ‘password”. Those who live underMD5-based encryption (for instance under FreeBSD or BSD/OS, etc.) should use the following MD5 hash ofthe same word: “$1$OXLyS...$Owx8s2/m9/gfkcRVXzgoE/”.

Page 568: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

560 CHAPTER 10. APACHE MODULES

• StrictRequire

This forces forbidden access when SSLRequireSSL or SSLRequire successfully decided that access shouldbe forbidden. Usually the default is that in the case where a “Satisfy any” directive is used, and otheraccess restrictions are passed, denial of access due to SSLRequireSSL or SSLRequire is overridden (be-cause that’s how the Apache Satisfy mechanism should work.) But for strict access restriction you canuse SSLRequireSSL and/or SSLRequire in combination with an “SSLOptions +StrictRequire”.Then an additional “Satisfy Any” has no chance once mod ssl has decided to deny access.

• OptRenegotiate

This enables optimized SSL connection renegotiation handling when SSL directives are used in per-directorycontext. By default a strict scheme is enabled where every per-directory reconfiguration of SSL parameterscauses a full SSL renegotiation handshake. When this option is used mod ssl tries to avoid unnecessary hand-shakes by doing more granular (but still safe) parameter checks. Nevertheless these granular checks sometimesmaybe not what the user expects, so enable this on a per-directory basis only, please.

ExampleSSLOptions +FakeBasicAuth -StrictRequire<Files ˜ "\.(cgi|shtml)$">SSLOptions +StdEnvVars +CompatEnvVars -ExportCertData

<Files>

SSLPassPhraseDialog Directive

Description: Type of pass phrase dialog for encrypted private keysSyntax: SSLPassPhraseDialog typeDefault: SSLPassPhraseDialog builtinContext: server configStatus: ExtensionModule: mod ssl

When Apache starts up it has to read the various Certificate (see SSLCERTIFICATEFILE) and Private Key (seeSSLCERTIFICATEKEYFILE) files of the SSL-enabled virtual servers. Because for security reasons the Private Keyfiles are usually encrypted, mod ssl needs to query the administrator for a Pass Phrase in order to decrypt those files.This query can be done in two ways which can be configured by type:

• builtin

This is the default where an interactive terminal dialog occurs at startup time just before Apache detaches fromthe terminal. Here the administrator has to manually enter the Pass Phrase for each encrypted Private Key file.Because a lot of SSL-enabled virtual hosts can be configured, the following reuse-scheme is used to minimizethe dialog: When a Private Key file is encrypted, all known Pass Phrases (at the beginning there are none, ofcourse) are tried. If one of those known Pass Phrases succeeds no dialog pops up for this particular PrivateKey file. If none succeeded, another Pass Phrase is queried on the terminal and remembered for the next round(where it perhaps can be reused).

This scheme allows mod ssl to be maximally flexible (because for N encrypted Private Key files you can use Ndifferent Pass Phrases - but then you have to enter all of them, of course) while minimizing the terminal dialog(i.e. when you use a single Pass Phrase for all N Private Key files this Pass Phrase is queried only once).

• exec:/path/to/program

Here an external program is configured which is called at startup for each encrypted Private Key file. It iscalled with two arguments (the first is of the form “servername:portnumber”, the second is either “RSA”or “DSA”), which indicate for which server and algorithm it has to print the corresponding Pass Phrase to

Page 569: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.53. APACHE MODULE MOD SSL 561

stdout. The intent is that this external program first runs security checks to make sure that the system is notcompromised by an attacker, and only when these checks were passed successfully it provides the Pass Phrase.

Both these security checks, and the way the Pass Phrase is determined, can be as complex as you like. Mod ssljust defines the interface: an executable program which provides the Pass Phrase on stdout. Nothing moreor less! So, if you’re really paranoid about security, here is your interface. Anything else has to be left as anexercise to the administrator, because local security requirements are so different.

The reuse-algorithm above is used here, too. In other words: The external program is called only once perunique Pass Phrase.

Example:

SSLPassPhraseDialog exec:/usr/local/apache/sbin/pp-filter

SSLProtocol Directive

Description: Configure usable SSL protocol flavorsSyntax: SSLProtocol [+|-]protocol ...Default: SSLProtocol allContext: server config, virtual hostOverride: OptionsStatus: ExtensionModule: mod ssl

This directive can be used to control the SSL protocol flavors mod ssl should use when establishing its server environ-ment. Clients then can only connect with one of the provided protocols.

The available (case-insensitive) protocols are:

• SSLv2

This is the Secure Sockets Layer (SSL) protocol, version 2.0. It is the original SSL protocol as designed byNetscape Corporation.

• SSLv3

This is the Secure Sockets Layer (SSL) protocol, version 3.0. It is the successor to SSLv2 and the currently (asof February 1999) de-facto standardized SSL protocol from Netscape Corporation. It’s supported by almost allpopular browsers.

• TLSv1

This is the Transport Layer Security (TLS) protocol, version 1.0. It is the successor to SSLv3 and currently (asof February 1999) still under construction by the Internet Engineering Task Force (IETF). It’s still not supportedby any popular browsers.

• All

This is a shortcut for “+SSLv2 +SSLv3 +TLSv1” and a convinient way for enabling all protocols exceptone when used in combination with the minus sign on a protocol as the example above shows.

Example# enable SSLv3 and TLSv1, but not SSLv2

SSLProtocol all -SSLv2

Page 570: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

562 CHAPTER 10. APACHE MODULES

SSLProxyCACertificateFile Directive

Description: File of concatenated PEM-encoded CA Certificates for Remote Server AuthSyntax: SSLProxyCACertificateFile file-pathContext: server config, virtual hostStatus: ExtensionModule: mod ssl

This directive sets the all-in-one file where you can assemble the Certificates of Certification Authorities (CA) whoseremote servers you deal with. These are used for Remote Server Authentication. Such a file is simply the concatenationof the various PEM-encoded Certificate files, in order of preference. This can be used alternatively and/or additionallyto SSLPROXYCACERTIFICATEPATH.

ExampleSSLProxyCACertificateFile

/usr/local/apache2/conf/ssl.crt/ca-bundle-remote-server.crt

SSLProxyCACertificatePath Directive

Description: Directory of PEM-encoded CA Certificates for Remote Server AuthSyntax: SSLProxyCACertificatePath directory-pathContext: server config, virtual hostStatus: ExtensionModule: mod ssl

This directive sets the directory where you keep the Certificates of Certification Authorities (CAs) whose remoteservers you deal with. These are used to verify the remote server certificate on Remote Server Authentication.

The files in this directory have to be PEM-encoded and are accessed through hash filenames. So usually you can’t justplace the Certificate files there: you also have to create symbolic links named hash-value.N. And you should alwaysmake sure this directory contains the appropriate symbolic links. Use the Makefile which comes with mod ssl toaccomplish this task.

ExampleSSLProxyCACertificatePath /usr/local/apache2/conf/ssl.crt/

SSLProxyCARevocationFile Directive

Description: File of concatenated PEM-encoded CA CRLs for Remote Server AuthSyntax: SSLProxyCARevocationFile file-pathContext: server config, virtual hostStatus: ExtensionModule: mod ssl

This directive sets the all-in-one file where you can assemble the Certificate Revocation Lists (CRL) of CertificationAuthorities (CA) whose remote servers you deal with. These are used for Remote Server Authentication. Such a file issimply the concatenation of the various PEM-encoded CRL files, in order of preference. This can be used alternativelyand/or additionally to SSLPROXYCAREVOCATIONPATH.

ExampleSSLProxyCARevocationFile

/usr/local/apache2/conf/ssl.crl/ca-bundle-remote-server.crl

Page 571: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.53. APACHE MODULE MOD SSL 563

SSLProxyCARevocationPath Directive

Description: Directory of PEM-encoded CA CRLs for Remote Server AuthSyntax: SSLProxyCARevocationPath directory-pathContext: server config, virtual hostStatus: ExtensionModule: mod ssl

This directive sets the directory where you keep the Certificate Revocation Lists (CRL) of Certification Authorities(CAs) whose remote servers you deal with. These are used to revoke the remote server certificate on Remote ServerAuthentication.

The files in this directory have to be PEM-encoded and are accessed through hash filenames. So usually you have notonly to place the CRL files there. Additionally you have to create symbolic links named hash-value.rN. And youshould always make sure this directory contains the appropriate symbolic links. Use the Makefile which comeswith MOD SSL to accomplish this task.

ExampleSSLProxyCARevocationPath /usr/local/apache2/conf/ssl.crl/

SSLProxyCipherSuite Directive

Description: Cipher Suite available for negotiation in SSL proxy handshakeSyntax: SSLProxyCipherSuite cipher-specDefault: SSLProxyCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXPContext: server config, virtual host, directory, .htaccessOverride: AuthConfigStatus: ExtensionModule: mod ssl

Equivalent to SSLCipherSuite, but for the proxy connection. Please refer to SSLCIPHERSUITE for additionalinformation.

SSLProxyEngine Directive

Description: SSL Proxy Engine Operation SwitchSyntax: SSLProxyEngine on|offDefault: SSLProxyEngine offContext: server config, virtual hostStatus: ExtensionModule: mod ssl

This directive toggles the usage of the SSL/TLS Protocol Engine for proxy. This is usually used inside a <VIRTU-ALHOST> section to enable SSL/TLS for proxy usage in a particular virtual host. By default the SSL/TLS ProtocolEngine is disabled for proxy image both for the main server and all configured virtual hosts.

Example<VirtualHost default :443>SSLProxyEngine on...

</VirtualHost>

Page 572: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

564 CHAPTER 10. APACHE MODULES

SSLProxyMachineCertificateFile Directive

Description: File of concatenated PEM-encoded client certificates and keys to be used by the proxySyntax: SSLProxyMachineCertificateFile filenameContext: server configOverride: Not applicableStatus: ExtensionModule: mod ssl

This directive sets the all-in-one file where you keep the certificates and keys used for authentication of the proxyserver to remote servers.

This referenced file is simply the concatenation of the various PEM-encoded certificate files, in order of preference.Use this directive alternatively or additionally to SSLProxyMachineCertificatePath.

! Currently there is no support for encrypted private keys

Example:

SSLProxyMachineCertificateFile

/usr/local/apache2/conf/ssl.crt/proxy.pem

SSLProxyMachineCertificatePath Directive

Description: Directory of PEM-encoded client certificates and keys to be used by the proxySyntax: SSLProxyMachineCertificatePath directoryContext: server configOverride: Not applicableStatus: ExtensionModule: mod ssl

This directive sets the directory where you keep the certificates and keys used for authentication of the proxy server toremote servers.

The files in this directory must be PEM-encoded and are accessed through hash filenames. Additionally, you must cre-ate symbolic links named hash-value.N. And you should always make sure this directory contains the appropriatesymbolic links. Use the Makefile which comes with mod ssl to accomplish this task.

! Currently there is no support for encrypted private keys

Example:

SSLProxyMachineCertificatePath /usr/local/apache2/conf/proxy.crt/

SSLProxyProtocol Directive

Description: Configure usable SSL protocol flavors for proxy usageSyntax: SSLProxyProtocol [+|-]protocol ...Default: SSLProxyProtocol allContext: server config, virtual hostOverride: OptionsStatus: ExtensionModule: mod ssl

Page 573: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.53. APACHE MODULE MOD SSL 565

This directive can be used to control the SSL protocol flavors mod ssl should use when establishing its server environ-ment for proxy . It will only connect to servers using one of the provided protocols.

Please refer to SSLPROTOCOL for additional information.

SSLProxyVerify Directive

Description: Type of remote server Certificate verificationSyntax: SSLProxyVerify levelDefault: SSLProxyVerify noneContext: server config, virtual host, directory, .htaccessOverride: AuthConfigStatus: ExtensionModule: mod ssl

This directive sets the Certificate verification level for the remote server Authentication. Notice that this directive canbe used both in per-server and per-directory context. In per-server context it applies to the remote server authenticationprocess used in the standard SSL handshake when a connection is established. In per-directory context it forces a SSLrenegotation with the reconfigured remote server verification level after the HTTP request was read but before theHTTP response is sent.

The following levels are available for level:

• none: no remote server Certificate is required at all

• optional: the remote server may present a valid Certificate

• require: the remote server has to present a valid Certificate

• optional no ca: the remote server may present a valid Certificatebut it need not to be (successfully) verifiable.

In practice only levels none and require are really interesting, because level optional doesn’t work with all serversand level optional no ca is actually against the idea of authentication (but can be used to establish SSL test pages,etc.)

ExampleSSLProxyVerify require

SSLProxyVerifyDepth Directive

Description: Maximum depth of CA Certificates in Remote Server Certificate verificationSyntax: SSLProxyVerifyDepth numberDefault: SSLProxyVerifyDepth 1Context: server config, virtual host, directory, .htaccessOverride: AuthConfigStatus: ExtensionModule: mod ssl

This directive sets how deeply mod ssl should verify before deciding that the remote server does not have a validcertificate. Notice that this directive can be used both in per-server and per-directory context. In per-server contextit applies to the client authentication process used in the standard SSL handshake when a connection is established.In per-directory context it forces a SSL renegotation with the reconfigured remote server verification depth after theHTTP request was read but before the HTTP response is sent.

Page 574: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

566 CHAPTER 10. APACHE MODULES

The depth actually is the maximum number of intermediate certificate issuers, i.e. the number of CA certificateswhich are max allowed to be followed while verifying the remote server certificate. A depth of 0 means that self-signed remote server certificates are accepted only, the default depth of 1 means the remote server certificate canbe self-signed or has to be signed by a CA which is directly known to the server (i.e. the CA’s certificate is underSSLPROXYCACERTIFICATEPATH), etc.

ExampleSSLProxyVerifyDepth 10

SSLRandomSeed Directive

Description: Pseudo Random Number Generator (PRNG) seeding sourceSyntax: SSLRandomSeed context source [bytes]Context: server configStatus: ExtensionModule: mod ssl

This configures one or more sources for seeding the Pseudo Random Number Generator (PRNG) in OpenSSL atstartup time (context is startup) and/or just before a new SSL connection is established (context is connect).This directive can only be used in the global server context because the PRNG is a global facility.

The following source variants are available:

• builtin This is the always available builtin seeding source. It’s usage consumes minimum CPU cycles underruntime and hence can be always used without drawbacks. The source used for seeding the PRNG containsof the current time, the current process id and (when applicable) a randomly choosen 1KB extract of the inter-process scoreboard structure of Apache. The drawback is that this is not really a strong source and at startuptime (where the scoreboard is still not available) this source just produces a few bytes of entropy. So you shouldalways, at least for the startup, use an additional seeding source.

• file:/path/to/source

This variant uses an external file /path/to/source as the source for seeding the PRNG. When bytes is spec-ified, only the first bytes number of bytes of the file form the entropy (and bytes is given to /path/to/sourceas the first argument). When bytes is not specified the whole file forms the entropy (and 0 is given to/path/to/source as the first argument). Use this especially at startup time, for instance with an available/dev/random and/or /dev/urandom devices (which usually exist on modern Unix derivates like FreeBSDand Linux).

But be careful: Usually /dev/random provides only as much entropy data as it actually has, i.e. when yourequest 512 bytes of entropy, but the device currently has only 100 bytes available two things can happen: Onsome platforms you receive only the 100 bytes while on other platforms the read blocks until enough bytesare available (which can take a long time). Here using an existing /dev/urandom is better, because it neverblocks and actually gives the amount of requested data. The drawback is just that the quality of the receiveddata may not be the best.

On some platforms like FreeBSD one can even control how the entropy is actually generated, i.e. by whichsystem interrupts. More details one can find under rndcontrol(8) on those platforms. Alternatively, when yoursystem lacks such a random device, you can use tool like EGD36 (Entropy Gathering Daemon) and run it’s clientprogram with the exec:/path/to/program/ variant (see below) or use egd:/path/to/egd-socket(see below).

• exec:/path/to/program

36http://www.lothar.com/tech/crypto/

Page 575: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.53. APACHE MODULE MOD SSL 567

This variant uses an external executable /path/to/program as the source for seeding the PRNG. Whenbytes is specified, only the first bytes number of bytes of its stdout contents form the entropy. When bytes isnot specified, the entirety of the data produced on stdout form the entropy. Use this only at startup time whenyou need a very strong seeding with the help of an external program (for instance as in the example above withthe truerand utility you can find in the mod ssl distribution which is based on the AT&T truerand library).Using this in the connection context slows down the server too dramatically, of course. So usually you shouldavoid using external programs in that context.

• egd:/path/to/egd-socket (Unix only)

This variant uses the Unix domain socket of the external Entropy Gathering Daemon (EGD) (seehttp://www.lothar.com/tech /crypto/37) to seed the PRNG. Use this if no random device exists on your platform.

ExampleSSLRandomSeed startup builtinSSLRandomSeed startup file:/dev/randomSSLRandomSeed startup file:/dev/urandom 1024SSLRandomSeed startup exec:/usr/local/bin/truerand 16SSLRandomSeed connect builtinSSLRandomSeed connect file:/dev/random

SSLRandomSeed connect file:/dev/urandom 1024

SSLRequire Directive

Description: Allow access only when an arbitrarily complex boolean expression is trueSyntax: SSLRequire expressionContext: directory, .htaccessOverride: AuthConfigStatus: ExtensionModule: mod ssl

This directive specifies a general access requirement which has to be fulfilled in order to allow access. It’s a verypowerful directive because the requirement specification is an arbitrarily complex boolean expression containing anynumber of access checks.

The expression must match the following syntax (given as a BNF grammar notation):

expr ::= "true" | "false"| "!" expr| expr "&&" expr| expr "||" expr| "(" expr ")"| comp

comp ::= word "==" word | word "eq" word| word "!=" word | word "ne" word| word "<" word | word "lt" word| word "<=" word | word "le" word| word ">" word | word "gt" word| word ">=" word | word "ge" word| word "in" "{" wordlist "}"| word "=˜" regex

37http://www.lothar.com/tech/crypto/

Page 576: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

568 CHAPTER 10. APACHE MODULES

| word "!˜" regex

wordlist ::= word| wordlist "," word

word ::= digit| cstring| variable| function

digit ::= [0-9]+cstring ::= "..."variable ::= "%{" varname "}"function ::= funcname "(" funcargs ")"

while for varname any variable from Table 3 can be used. Finally for funcname the following functions areavailable:

• file(filename)

This function takes one string argument and expands to the contents of the file. This is especially useful formatching this contents against a regular expression, etc.

Notice that expression is first parsed into an internal machine representation and then evaluated in a second step.Actually, in Global and Per-Server Class context expression is parsed at startup time and at runtime only the machinerepresentation is executed. For Per-Directory context this is different: here expression has to be parsed and immediatelyexecuted for every request.

ExampleSSLRequire ( %{SSL CIPHER} !˜ m/ˆ(EXP|NULL)-/ \and %{SSL CLIENT S DN O} eq "Snake Oil, Ltd." \and %{SSL CLIENT S DN OU} in {"Staff", "CA", "Dev"} \and %{TIME WDAY} >= 1 and %{TIME WDAY} <= 5 \and %{TIME HOUR} >= 8 and %{TIME HOUR} <= 20 ) \or %{REMOTE ADDR} =˜ m/ˆ192\.76\.162\.[0-9]+$/

Standard CGI/1.0 and Apache variables:

HTTP_USER_AGENT PATH_INFO AUTH_TYPEHTTP_REFERER QUERY_STRING SERVER_SOFTWAREHTTP_COOKIE REMOTE_HOST API_VERSIONHTTP_FORWARDED REMOTE_IDENT TIME_YEARHTTP_HOST IS_SUBREQ TIME_MONHTTP_PROXY_CONNECTION DOCUMENT_ROOT TIME_DAYHTTP_ACCEPT SERVER_ADMIN TIME_HOURHTTP:headername SERVER_NAME TIME_MINTHE_REQUEST SERVER_PORT TIME_SECREQUEST_METHOD SERVER_PROTOCOL TIME_WDAYREQUEST_SCHEME REMOTE_ADDR TIMEREQUEST_URI REMOTE_USER ENV:variablenameREQUEST_FILENAME

SSL-related variables:

Page 577: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.53. APACHE MODULE MOD SSL 569

HTTPS SSL_CLIENT_M_VERSION SSL_SERVER_M_VERSIONSSL_CLIENT_M_SERIAL SSL_SERVER_M_SERIAL

SSL_PROTOCOL SSL_CLIENT_V_START SSL_SERVER_V_STARTSSL_SESSION_ID SSL_CLIENT_V_END SSL_SERVER_V_ENDSSL_CIPHER SSL_CLIENT_S_DN SSL_SERVER_S_DNSSL_CIPHER_EXPORT SSL_CLIENT_S_DN_C SSL_SERVER_S_DN_CSSL_CIPHER_ALGKEYSIZE SSL_CLIENT_S_DN_ST SSL_SERVER_S_DN_STSSL_CIPHER_USEKEYSIZE SSL_CLIENT_S_DN_L SSL_SERVER_S_DN_LSSL_VERSION_LIBRARY SSL_CLIENT_S_DN_O SSL_SERVER_S_DN_OSSL_VERSION_INTERFACE SSL_CLIENT_S_DN_OU SSL_SERVER_S_DN_OU

SSL_CLIENT_S_DN_CN SSL_SERVER_S_DN_CNSSL_CLIENT_S_DN_T SSL_SERVER_S_DN_TSSL_CLIENT_S_DN_I SSL_SERVER_S_DN_ISSL_CLIENT_S_DN_G SSL_SERVER_S_DN_GSSL_CLIENT_S_DN_S SSL_SERVER_S_DN_SSSL_CLIENT_S_DN_D SSL_SERVER_S_DN_DSSL_CLIENT_S_DN_UID SSL_SERVER_S_DN_UIDSSL_CLIENT_S_DN_Email SSL_SERVER_S_DN_EmailSSL_CLIENT_I_DN SSL_SERVER_I_DNSSL_CLIENT_I_DN_C SSL_SERVER_I_DN_CSSL_CLIENT_I_DN_ST SSL_SERVER_I_DN_STSSL_CLIENT_I_DN_L SSL_SERVER_I_DN_LSSL_CLIENT_I_DN_O SSL_SERVER_I_DN_OSSL_CLIENT_I_DN_OU SSL_SERVER_I_DN_OUSSL_CLIENT_I_DN_CN SSL_SERVER_I_DN_CNSSL_CLIENT_I_DN_T SSL_SERVER_I_DN_TSSL_CLIENT_I_DN_I SSL_SERVER_I_DN_ISSL_CLIENT_I_DN_G SSL_SERVER_I_DN_GSSL_CLIENT_I_DN_S SSL_SERVER_I_DN_SSSL_CLIENT_I_DN_D SSL_SERVER_I_DN_DSSL_CLIENT_I_DN_UID SSL_SERVER_I_DN_UIDSSL_CLIENT_I_DN_Email SSL_SERVER_I_DN_EmailSSL_CLIENT_A_SIG SSL_SERVER_A_SIGSSL_CLIENT_A_KEY SSL_SERVER_A_KEYSSL_CLIENT_CERT SSL_SERVER_CERTSSL_CLIENT_CERT_CHAINnSSL_CLIENT_VERIFY

SSLRequireSSL Directive

Description: Deny access when SSL is not used for the HTTP requestSyntax: SSLRequireSSLContext: directory, .htaccessOverride: AuthConfigStatus: ExtensionModule: mod ssl

This directive forbids access unless HTTP over SSL (i.e. HTTPS) is enabled for the current connection. This is veryhandy inside the SSL-enabled virtual host or directories for defending against configuration errors that expose stuffthat should be protected. When this directive is present all requests are denied which are not using SSL.

ExampleSSLRequireSSL

Page 578: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

570 CHAPTER 10. APACHE MODULES

SSLSessionCache Directive

Description: Type of the global/inter-process SSL Session CacheSyntax: SSLSessionCache typeDefault: SSLSessionCache noneContext: server configStatus: ExtensionModule: mod ssl

This configures the storage type of the global/inter-process SSL Session Cache. This cache is an optional facilitywhich speeds up parallel request processing. For requests to the same server process (via HTTP keep-alive), OpenSSLalready caches the SSL session information locally. But because modern clients request inlined images and other datavia parallel requests (usually up to four parallel requests are common) those requests are served by different pre-forkedserver processes. Here an inter-process cache helps to avoid unneccessary session handshakes.

The following two storage types are currently supported:

• none

This is the default and just disables the global/inter-process Session Cache. There is no drawback in functional-ity, but a noticeable speed penalty can be observed.

• dbm:/path/to/datafile

This makes use of a DBM hashfile on the local disk to synchronize the local OpenSSL memory caches of theserver processes. The slight increase in I/O on the server results in a visible request speedup for your clients, sothis type of storage is generally recommended.

• shm:/path/to/datafile[(size)]

This makes use of a high-performance hash table (approx. size bytes in size) inside a shared memory segmentin RAM (established via /path/to/datafile) to synchronize the local OpenSSL memory caches of theserver processes. This storage type is not available on all platforms.

ExamplesSSLSessionCache dbm:/usr/local/apache/logs/ssl gcache data

SSLSessionCache shm:/usr/local/apache/logs/ssl gcache data(512000)

SSLSessionCacheTimeout Directive

Description: Number of seconds before an SSL session expires in the Session CacheSyntax: SSLSessionCacheTimeout secondsDefault: SSLSessionCacheTimeout 300Context: server config, virtual hostStatus: ExtensionModule: mod ssl

This directive sets the timeout in seconds for the information stored in the global/inter-process SSL Session Cache andthe OpenSSL internal memory cache. It can be set as low as 15 for testing, but should be set to higher values like 300in real life.

ExampleSSLSessionCacheTimeout 600

Page 579: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.53. APACHE MODULE MOD SSL 571

SSLUserName Directive

Description: Variable name to determine user nameSyntax: SSLUserName varnameContext: server config, directory, .htaccessOverride: AuthConfigStatus: ExtensionModule: mod sslCompatibility: Available in Apache 2.0.51 and later

This directive sets the "user" field in the Apache request object. This is used by lower modules to identify the userwith a character string. In particular, this may cause the environment variable REMOTE USER to be set. The varnamecan be any of the SSL environment variables.

ExampleSSLUserName SSL CLIENT S DN CN

SSLVerifyClient Directive

Description: Type of Client Certificate verificationSyntax: SSLVerifyClient levelDefault: SSLVerifyClient noneContext: server config, virtual host, directory, .htaccessOverride: AuthConfigStatus: ExtensionModule: mod ssl

This directive sets the Certificate verification level for the Client Authentication. Notice that this directive can be usedboth in per-server and per-directory context. In per-server context it applies to the client authentication process usedin the standard SSL handshake when a connection is established. In per-directory context it forces a SSL renegotationwith the reconfigured client verification level after the HTTP request was read but before the HTTP response is sent.

The following levels are available for level:

• none: no client Certificate is required at all

• optional: the client may present a valid Certificate

• require: the client has to present a valid Certificate

• optional no ca: the client may present a valid Certificatebut it need not to be (successfully) verifiable.

In practice only levels none and require are really interesting, because level optional doesn’t work with all browsersand level optional no ca is actually against the idea of authentication (but can be used to establish SSL test pages,etc.)

ExampleSSLVerifyClient require

Page 580: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

572 CHAPTER 10. APACHE MODULES

SSLVerifyDepth Directive

Description: Maximum depth of CA Certificates in Client Certificate verificationSyntax: SSLVerifyDepth numberDefault: SSLVerifyDepth 1Context: server config, virtual host, directory, .htaccessOverride: AuthConfigStatus: ExtensionModule: mod ssl

This directive sets how deeply mod ssl should verify before deciding that the clients don’t have a valid certificate.Notice that this directive can be used both in per-server and per-directory context. In per-server context it applies tothe client authentication process used in the standard SSL handshake when a connection is established. In per-directorycontext it forces a SSL renegotation with the reconfigured client verification depth after the HTTP request was readbut before the HTTP response is sent.

The depth actually is the maximum number of intermediate certificate issuers, i.e. the number of CA certificateswhich are max allowed to be followed while verifying the client certificate. A depth of 0 means that self-signed clientcertificates are accepted only, the default depth of 1 means the client certificate can be self-signed or has to be signedby a CA which is directly known to the server (i.e. the CA’s certificate is under SSLCACERTIFICATEPATH), etc.

ExampleSSLVerifyDepth 10

Page 581: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.54. APACHE MODULE MOD STATUS 573

10.54 Apache Module mod status

Description: Provides information on server activity and performanceStatus: BaseModuleIdentifier: status moduleSourceFile: mod status.c

Summary

The Status module allows a server administrator to find out how well their server is performing. A HTML page ispresented that gives the current server statistics in an easily readable form. If required this page can be made toautomatically refresh (given a compatible browser). Another page gives a simple machine-readable list of the currentserver state.

The details given are:

• The number of worker serving requests

• The number of idle worker

• The status of each worker, the number of requests that worker has performed and the total number of bytesserved by the worker (*)

• A total number of accesses and byte count served (*)

• The time the server was started/restarted and the time it has been running for

• Averages giving the number of requests per second, the number of bytes served per second and the averagenumber of bytes per request (*)

• The current percentage CPU used by each worker and in total by Apache (*)

• The current hosts and requests being processed (*)

The lines marked "(*)" are only available if EXTENDEDSTATUS is On.

Directives

• ExtendedStatus

Enabling Status Support

To enable status reports only for browsers from the foo.com domain add this code to your httpd.conf configurationfile

<Location /server-status>SetHandler server-status

Order Deny,AllowDeny from allAllow from .foo.com

</Location>

You can now access server statistics by using a Web browser to access the pagehttp://your.server.name/server-status

Page 582: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

574 CHAPTER 10. APACHE MODULES

Automatic Updates

You can get the status page to update itself automatically if you have a browser that supports "refresh". Access thepage http://your.server.name/server-status?refresh=N to refresh the page every N seconds.

Machine Readable Status File

A machine-readable version of the status file is available by accessing the pagehttp://your.server.name/server-status?auto. This is useful when automatically run, seethe Perl program in the /support directory of Apache, log server status.

=⇒It should be noted that if MOD STATUS is compiled into the server, its handler capabilityis available in all configuration files, including per-directory files (e.g., .htaccess). Thismay have security-related ramifications for your site.

ExtendedStatus Directive

Description: Keep track of extended status information for each requestSyntax: ExtendedStatus On|OffDefault: ExtendedStatus OffContext: server configStatus: BaseModule: mod statusCompatibility: ExtendedStatus is only available in Apache 1.3.2 and later.

This setting applies to the entire server, and cannot be enabled or disabled on a virtualhost-by-virtualhost basis. Thecollection of extended status information can slow down the server.

Page 583: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.55. APACHE MODULE MOD SUEXEC 575

10.55 Apache Module mod suexec

Description: Allows CGI scripts to run as a specified user and GroupStatus: ExtensionModuleIdentifier: suexec moduleSourceFile: mod suexec.cCompatibility: Available in Apache 2.0 and later

Summary

This module, in combination with the suexec support program allows CGI scripts to run as a specified user andGroup.

Directives

• SuexecUserGroup

See also

• SuEXEC support (p. 68)

SuexecUserGroup Directive

Description: User and group for CGI programs to run asSyntax: SuexecUserGroup User GroupContext: server config, virtual hostStatus: ExtensionModule: mod suexecCompatibility: SuexecUserGroup is only available in 2.0 and later.

The SUEXECUSERGROUP directive allows you to specify a user and group for CGI programs to run as. Non-CGIrequests are still processes with the user specified in the USER directive. This directive replaces the Apache 1.3configuration of using the User and Group directives inside of VirtualHosts.

ExampleSuexecUserGroup nobody nogroup

Page 584: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

576 CHAPTER 10. APACHE MODULES

10.56 Apache Module mod unique id

Description: Provides an environment variable with a unique identifier for each requestStatus: ExtensionModuleIdentifier: unique id moduleSourceFile: mod unique id.c

Summary

This module provides a magic token for each request which is guaranteed to be unique across "all" requests undervery specific conditions. The unique identifier is even unique across multiple machines in a properly configured clusterof machines. The environment variable UNIQUE ID is set to the identifier for each request. Unique identifiers areuseful for various reasons which are beyond the scope of this document.

Directives This module provides no directives.

Theory

First a brief recap of how the Apache server works on Unix machines. This feature currently isn’t supported onWindows NT. On Unix machines, Apache creates several children, the children process requests one at a time. Eachchild can serve multiple requests in its lifetime. For the purpose of this discussion, the children don’t share any datawith each other. We’ll refer to the children as httpd processes.

Your website has one or more machines under your administrative control, together we’ll call them a cluster of ma-chines. Each machine can possibly run multiple instances of Apache. All of these collectively are considered "theuniverse", and with certain assumptions we’ll show that in this universe we can generate unique identifiers for eachrequest, without extensive communication between machines in the cluster.

The machines in your cluster should satisfy these requirements. (Even if you have only one machine you shouldsynchronize its clock with NTP.)

• The machines’ times are synchronized via NTP or other network time protocol.

• The machines’ hostnames all differ, such that the module can do a hostname lookup on the hostname and receivea different IP address for each machine in the cluster.

As far as operating system assumptions go, we assume that pids (process ids) fit in 32-bits. If the operating systemuses more than 32-bits for a pid, the fix is trivial but must be performed in the code.

Given those assumptions, at a single point in time we can identify any httpd process on any machine in the clusterfrom all other httpd processes. The machine’s IP address and the pid of the httpd process are sufficient to do this. Soin order to generate unique identifiers for requests we need only distinguish between different points in time.

To distinguish time we will use a Unix timestamp (seconds since January 1, 1970 UTC), and a 16-bit counter. Thetimestamp has only one second granularity, so the counter is used to represent up to 65536 values during a singlesecond. The quadruple ( ip addr, pid, time stamp, counter ) is sufficient to enumerate 65536 requests per second perhttpd process. There are issues however with pid reuse over time, and the counter is used to alleviate this issue.

When an httpd child is created, the counter is initialized with ( current microseconds divided by 10 ) modulo 65536(this formula was chosen to eliminate some variance problems with the low order bits of the microsecond timers onsome systems). When a unique identifier is generated, the time stamp used is the time the request arrived at the webserver. The counter is incremented every time an identifier is generated (and allowed to roll over).

The kernel generates a pid for each process as it forks the process, and pids are allowed to roll over (they’re 16-bitson many Unixes, but newer systems have expanded to 32-bits). So over time the same pid will be reused. Howeverunless it is reused within the same second, it does not destroy the uniqueness of our quadruple. That is, we assume the

Page 585: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.56. APACHE MODULE MOD UNIQUE ID 577

system does not spawn 65536 processes in a one second interval (it may even be 32768 processes on some Unixes, buteven this isn’t likely to happen).

Suppose that time repeats itself for some reason. That is, suppose that the system’s clock is screwed up and it revisitsa past time (or it is too far forward, is reset correctly, and then revisits the future time). In this case we can easily showthat we can get pid and time stamp reuse. The choice of initializer for the counter is intended to help defeat this. Notethat we really want a random number to initialize the counter, but there aren’t any readily available numbers on mostsystems (i.e., you can’t use rand() because you need to seed the generator, and can’t seed it with the time because time,at least at one second resolution, has repeated itself). This is not a perfect defense.

How good a defense is it? Suppose that one of your machines serves at most 500 requests per second (which isa very reasonable upper bound at this writing, because systems generally do more than just shovel out static files).To do that it will require a number of children which depends on how many concurrent clients you have. But we’llbe pessimistic and suppose that a single child is able to serve 500 requests per second. There are 1000 possiblestarting counter values such that two sequences of 500 requests overlap. So there is a 1.5% chance that if time (at onesecond resolution) repeats itself this child will repeat a counter value, and uniqueness will be broken. This was a verypessimistic example, and with real world values it’s even less likely to occur. If your system is such that it’s still likelyto occur, then perhaps you should make the counter 32 bits (by editing the code).

You may be concerned about the clock being "set back" during summer daylight savings. However this isn’t an issuebecause the times used here are UTC, which "always" go forward. Note that x86 based Unixes may need properconfiguration for this to be true – they should be configured to assume that the motherboard clock is on UTC andcompensate appropriately. But even still, if you’re running NTP then your UTC time will be correct very shortly afterreboot.

The UNIQUE ID environment variable is constructed by encoding the 112-bit (32-bit IP address, 32 bit pid, 32 bittime stamp, 16 bit counter) quadruple using the alphabet [A-Za-z0-9@-] in a manner similar to MIME base64encoding, producing 19 characters. The MIME base64 alphabet is actually [A-Za-z0-9+/] however + and / needto be specially encoded in URLs, which makes them less desirable. All values are encoded in network byte orderingso that the encoding is comparable across architectures of different byte ordering. The actual ordering of the encodingis: time stamp, IP address, pid, counter. This ordering has a purpose, but it should be emphasized that applicationsshould not dissect the encoding. Applications should treat the entire encoded UNIQUE ID as an opaque token, whichcan be compared against other UNIQUE IDs for equality only.

The ordering was chosen such that it’s possible to change the encoding in the future without worrying about collisionwith an existing database of UNIQUE IDs. The new encodings should also keep the time stamp as the first element,and can otherwise use the same alphabet and bit length. Since the time stamps are essentially an increasing sequence,it’s sufficient to have a flag second in which all machines in the cluster stop serving and request, and stop using the oldencoding format. Afterwards they can resume requests and begin issuing the new encodings.

This we believe is a relatively portable solution to this problem. It can be extended to multithreaded systems likeWindows NT, and can grow with future needs. The identifiers generated have essentially an infinite life-time becausefuture identifiers can be made longer as required. Essentially no communication is required between machines inthe cluster (only NTP synchronization is required, which is low overhead), and no communication between httpdprocesses is required (the communication is implicit in the pid value assigned by the kernel). In very specific situationsthe identifier can be shortened, but more information needs to be assumed (for example the 32-bit IP address is overkillfor any site, but there is no portable shorter replacement for it).

Page 586: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

578 CHAPTER 10. APACHE MODULES

10.57 Apache Module mod userdir

Description: User-specific directoriesStatus: BaseModuleIdentifier: userdir moduleSourceFile: mod userdir.c

Summary

This module allows user-specific directories to be accessed using the http://example.com/˜user/ syntax.

Directives

• UserDir

See also

• Mapping URLs to the Filesystem (p. 36)

• public html tutorial (p. 202)

UserDir Directive

Description: Location of the user-specific directoriesSyntax: UserDir directory-filenameDefault: UserDir public htmlContext: server config, virtual hostStatus: BaseModule: mod userdir

The USERDIR directive sets the real directory in a user’s home directory to use when a request for a document for auser is received. Directory-filename is one of the following:

• The name of a directory or a pattern such as those shown below.

• The keyword disabled. This turns off all username-to-directory translations except those explicitly namedwith the enabled keyword (see below).

• The keyword disabled followed by a space-delimited list of usernames. Usernames that appear in such a listwill never have directory translation performed, even if they appear in an enabled clause.

• The keyword enabled followed by a space-delimited list of usernames. These usernames will have directorytranslation performed even if a global disable is in effect, but not if they also appear in a disabled clause.

If neither the enabled nor the disabled keywords appear in the Userdir directive, the argument istreated as a filename pattern, and is used to turn the name into a directory specification. A request forhttp://www.foo.com/˜bob/one/two.html will be translated to:

UserDir directive used Translated pathUserDir public html ˜bob/public html/one/two.htmlUserDir /usr/web /usr/web/bob/one/two.htmlUserDir /home/*/www /home/bob/www/one/two.html

The following directives will send redirects to the client:

Page 587: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.57. APACHE MODULE MOD USERDIR 579

UserDir directive used Translated pathUserDir http://www.foo.com/users http://www.foo.com/users/bob/one/two.htmlUserDir http://www.foo.com/*/usr http://www.foo.com/bob/usr/one/two.htmlUserDir http://www.foo.com/˜*/ http://www.foo.com/˜bob/one/two.html

=⇒Be careful when using this directive; for instance, "UserDir ./" would map"/˜root" to "/" - which is probably undesirable. It is strongly recommended thatyour configuration include a "UserDir disabled root" declaration. See also theDIRECTORY directive and the Security Tips (p. 40) page for more information.

Additional examples:

To allow a few users to have UserDir directories, but not anyone else, use the following:

UserDir disabled

UserDir enabled user1 user2 user3

To allow most users to have UserDir directories, but deny this to a few, use the following:

UserDir enabled

UserDir disabled user4 user5 user6

It is also possible to specify alternative user directories. If you use a command like:

Userdir public html /usr/web http://www.foo.com/

With a request for http://www.foo.com/˜bob/one/two.html, will try to find the page at ˜bob/public html/one/two.htmlfirst, then /usr/web/bob/one/two.html, and finally it will send a redirect to http://www.foo.com/bob/one/two.html.

If you add a redirect, it must be the last alternative in the list. Apache cannot determine if the redirect succeeded ornot, so if you have the redirect earlier in the list, that will always be the alternative that is used.

See also

• public html tutorial (p. 202)

Page 588: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

580 CHAPTER 10. APACHE MODULES

10.58 Apache Module mod usertrack

Description: Clickstream logging of user activity on a siteStatus: ExtensionModuleIdentifier: usertrack moduleSourceFile: mod usertrack.c

Summary

Previous releases of Apache have included a module which generates a ’clickstream’ log of user activity on a siteusing cookies. This was called the "cookies" module, mod cookies. In Apache 1.2 and later this module has beenrenamed the "user tracking" module, mod usertrack. This module has been simplified and new directives added.

Directives

• CookieDomain

• CookieExpires

• CookieName

• CookieStyle

• CookieTracking

Logging

Previously, the cookies module (now the user tracking module) did its own logging, using the COOKIELOG directive.In this release, this module does no logging at all. Instead, a configurable log format file should be used to log userclick-streams. This is possible because the logging module now allows multiple log files. The cookie itself is loggedby using the text %{cookie}n in the log file format. For example:

CustomLog logs/clickstream "%{cookie}n %r %t"

For backward compatibility the configurable log module implements the old COOKIELOG directive, but this shouldbe upgraded to the above CUSTOMLOG directive.

2-digit or 4-digit dates for cookies?

(the following is from message <[email protected]> in the new-httpdarchives)

From: "Christian Allen" <[email protected]>Subject: Re: Apache Y2K bug in mod_usertrack.cDate: Tue, 30 Jun 1998 11:41:56 -0400

Did some work with cookies and dug up some info that might be useful.

True, Netscape claims that the correct format NOW is four digit dates, andfour digit dates do in fact work... for Netscape 4.x (Communicator), thatis. However, 3.x and below do NOT accept them. It seems that Netscapeoriginally had a 2-digit standard, and then with all of the Y2K hype and

Page 589: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.58. APACHE MODULE MOD USERTRACK 581

probably a few complaints, changed to a four digit date for Communicator.Fortunately, 4.x also understands the 2-digit format, and so the best way toensure that your expiration date is legible to the client’s browser is touse 2-digit dates.

However, this does not limit expiration dates to the year 2000; if you usean expiration year of "13", for example, it is interpreted as 2013, NOT1913! In fact, you can use an expiration year of up to "37", and it will beunderstood as "2037" by both MSIE and Netscape versions 3.x and up (not sureabout versions previous to those). Not sure why Netscape used thatparticular year as its cut-off point, but my guess is that it was in respectto UNIX’s 2038 problem. Netscape/MSIE 4.x seem to be able to understand2-digit years beyond that, at least until "50" for sure (I think theyunderstand up until about "70", but not for sure).

Summary: Mozilla 3.x and up understands two digit dates up until "37"(2037). Mozilla 4.x understands up until at least "50" (2050) in 2-digitform, but also understands 4-digit years, which can probably reach up until9999. Your best bet for sending a long-life cookie is to send it for sometime late in the year "37".

CookieDomain Directive

Description: The domain to which the tracking cookie appliesSyntax: CookieDomain domainContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: ExtensionModule: mod usertrack

This directive controls the setting of the domain to which the tracking cookie applies. If not present, no domain isincluded in the cookie header field.

The domain string must begin with a dot, and must include at least one embedded dot. That is, .foo.com is legal,but foo.bar.com and .com are not.

=⇒Most browsers in use today will not allow cookies to be set for a two-part top level domain,such as .co.uk, although such a domain ostensibly fulfills the requirements above.

These domains are equivalent to top level domains such as .com, and allowing such cookiesmay be a security risk. Thus, if you are under a two-part top level domain, you should stilluse your actual domain, as you would with any other top level domain (for example, use.foo.co.uk).

CookieExpires Directive

Description: Expiry time for the tracking cookieSyntax: CookieExpires expiry-periodContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: ExtensionModule: mod usertrack

Page 590: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

582 CHAPTER 10. APACHE MODULES

When used, this directive sets an expiry time on the cookie generated by the usertrack module. The expiry-period canbe given either as a number of seconds, or in the format such as "2 weeks 3 days 7 hours". Valid denominations are:years, months, weeks, days, hours, minutes and seconds. If the expiry time is in any format other than one numberindicating the number of seconds, it must be enclosed by double quotes.

If this directive is not used, cookies last only for the current browser session.

CookieName Directive

Description: Name of the tracking cookieSyntax: CookieName tokenDefault: CookieName ApacheContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: ExtensionModule: mod usertrack

This directive allows you to change the name of the cookie this module uses for its tracking purposes. By default thecookie is named "Apache".

You must specify a valid cookie name; results are unpredictable if you use a name containing unusual characters. Validcharacters include A-Z, a-z, 0-9, " ", and "-".

CookieStyle Directive

Description: Format of the cookie header fieldSyntax: CookieStyle Netscape|Cookie|Cookie2|RFC2109|RFC2965Default: CookieStyle NetscapeContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: ExtensionModule: mod usertrack

This directive controls the format of the cookie header field. The three formats allowed are:

• Netscape, which is the original but now deprecated syntax. This is the default, and the syntax Apache hashistorically used.

• Cookie or RFC2109, which is the syntax that superseded the Netscape syntax.

• Cookie2 or RFC2965, which is the most current cookie syntax.

Not all clients can understand all of these formats. but you should use the newest one that is generally acceptable toyour users’ browsers. At the time of writing, most browsers only fully support CookieStyle Netscape.

CookieTracking Directive

Description: Enables tracking cookieSyntax: CookieTracking on|offDefault: CookieTracking offContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: ExtensionModule: mod usertrack

Page 591: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.58. APACHE MODULE MOD USERTRACK 583

When MOD USERTRACK is loaded, and CookieTracking on is set, Apache will send a user-tracking cookie forall new requests. This directive can be used to turn this behavior on or off on a per-server or per-directory basis. Bydefault, enabling MOD USERTRACK will not activate cookies.

Page 592: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

584 CHAPTER 10. APACHE MODULES

10.59 Apache Module mod version

Description: Version dependent configurationStatus: ExtensionModuleIdentifier: version moduleSourceFile: mod version.cCompatibility: Available in version 2.0.56 and later

Summary

This module is designed for the use in test suites and large networks which have to deal with different httpd versionsand different configurations. It provides a new container – <IFVERSION>, which allows a flexible version checkingincluding numeric comparisons and regular expressions.

Examples<IfVersion 2.1.0>

# current httpd version is exactly 2.1.0

</IfVersion>

<IfVersion >= 2.2>

# use really new features :-)

</IfVersion>

See below for further possibilities.

Directives

• <IfVersion>

IfVersion Directive

Description: contains version dependent configurationSyntax: <IfVersion [[!]operator] version> ... </IfVersion>Context: server config, virtual host, directory, .htaccessOverride: AllStatus: ExtensionModule: mod version

The <IFVERSION> section encloses configuration directives which are executed only if the httpd ver-sion matches the desired criteria. For normal (numeric) comparisons the version argument has the formatmajor[.minor[.patch]], e.g. 2.1.0 or 2.2. minor and patch are optional. If these numbers are omitted,they are assumed to be zero. The following numerical operators are possible:

operator description= or == httpd version is equal> httpd version is greater than>= httpd version is greater or equal< httpd version is less than<= httpd version is less or equal

Page 593: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.59. APACHE MODULE MOD VERSION 585

Example<IfVersion >= 2.1>

# this happens only in versions greater or# equal 2.1.0.

</IfVersion>

Besides the numerical comparison it is possible to match a regular expression against the httpd version. There are twoways to write it:

operator description= or == version has the form /regex/

˜ version has the form regex

Example<IfVersion = /ˆ2.1.[01234]$/>

# e.g. workaround for buggy versions

</IfVersion>

In order to reverse the meaning, all operators can be preceded by an exclamation mark (!):

<IfVersion !˜ ˆ2.1.[01234]$>

# not for those versions

</IfVersion>

If the operator is omitted, it is assumed to be =.

Page 594: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

586 CHAPTER 10. APACHE MODULES

10.60 Apache Module mod vhost alias

Description: Provides for dynamically configured mass virtual hostingStatus: ExtensionModuleIdentifier: vhost alias moduleSourceFile: mod vhost alias.c

Summary

This module creates dynamically configured virtual hosts, by allowing the IP address and/or the Host: header of theHTTP request to be used as part of the pathname to determine what files to serve. This allows for easy use of a hugenumber of virtual hosts with similar configurations.

=⇒NoteIf MOD ALIAS or MOD USERDIR are used for translating URIs to filenames,they will override the directives of MOD VHOST ALIAS described below. Forexample, the following configuration will map /cgi-bin/script.pl to/usr/local/apache2/cgi-bin/script.pl in all cases:

ScriptAlias /cgi-bin/ /usr/local/apache2/cgi-bin/

VirtualScriptAlias /never/found/%0/cgi-bin/

Directives

• VirtualDocumentRoot

• VirtualDocumentRootIP

• VirtualScriptAlias

• VirtualScriptAliasIP

See also

• USECANONICALNAME

• Dynamically configured mass virtual hosting (p. 116)

Directory Name Interpolation

All the directives in this module interpolate a string into a pathname. The interpolated string (henceforth calledthe "name") may be either the server name (see the USECANONICALNAME directive for details on how this isdetermined) or the IP address of the virtual host on the server in dotted-quad format. The interpolation is controlledby specifiers inspired by printf which have a number of formats:

%% insert a %%p insert the port number of the virtual host%N.M insert (part of) the name

N and M are used to specify substrings of the name. N selects from the dot-separated components of the name, and Mselects characters within whatever N has selected. M is optional and defaults to zero if it isn’t present; the dot must bepresent if and only if M is present. The interpretation is as follows:

Page 595: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.60. APACHE MODULE MOD VHOST ALIAS 587

0 the whole name1 the first part2 the second part-1 the last part-2 the penultimate part2+ the second and all subsequent parts-2+ the penultimate and all preceding parts1+ and -1+ the same as 0

If N or M is greater than the number of parts available a single underscore is interpolated.

Examples

For simple name-based virtual hosts you might use the following directives in your server configuration file:

UseCanonicalName Off

VirtualDocumentRoot /usr/local/apache/vhosts/%0

A request for http://www.example.com/directory/file.html will be satisfied by the file/usr/local/apache/vhosts/www.example.com/directory/file.html.

For a very large number of virtual hosts it is a good idea to arrange the files to reduce the size of the vhosts directory.To do this you might use the following in your configuration file:

UseCanonicalName Off

VirtualDocumentRoot /usr/local/apache/vhosts/%3+/%2.1/%2.2/%2.3/%2

A request for http://www.domain.example.com/directory/file.html will be satisfied by the file/usr/local/apache/vhosts/example.com/d/o/m/domain/directory/file.html.

A more even spread of files can be achieved by hashing from the end of the name, for example:

VirtualDocumentRoot /usr/local/apache/vhosts/%3+/%2.-1/%2.-2/%2.-3/%2

The example request would come from /usr/local/apache/vhosts/example.com/n/i/a/domain/directory/file.html.

Alternatively you might use:

VirtualDocumentRoot /usr/local/apache/vhosts/%3+/%2.1/%2.2/%2.3/%2.4+

The example request would come from /usr/local/apache/vhosts/example.com/d/o/m/ain/directory/file.html.

For IP-based virtual hosting you might use the following in your configuration file:

UseCanonicalName DNSVirtualDocumentRootIP /usr/local/apache/vhosts/%1/%2/%3/%4/docs

VirtualScriptAliasIP /usr/local/apache/vhosts/%1/%2/%3/%4/cgi-bin

A request for http://www.domain.example.com/directory/file.html would be satis-fied by the file /usr/local/apache/vhosts/10/20/30/40/docs/directory/file.htmlif the IP address of www.domain.example.com were 10.20.30.40. A request for

Page 596: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

588 CHAPTER 10. APACHE MODULES

http://www.domain.example.com/cgi-bin/script.pl would be satisfied by executing theprogram /usr/local/apache/vhosts/10/20/30/40/cgi-bin/script.pl.

If you want to include the . character in a VirtualDocumentRoot directive, but it clashes with a % directive, youcan work around the problem in the following way:

VirtualDocumentRoot /usr/local/apache/vhosts/%2.0.%3.0

A request for http://www.domain.example.com/directory/file.html will be satisfied by the file/usr/local/apache/vhosts/domain.example/directory/file.html.

The LOGFORMAT directives %V and %A are useful in conjunction with this module.

VirtualDocumentRoot Directive

Description: Dynamically configure the location of the document root for a given virtual hostSyntax: VirtualDocumentRoot interpolated-directory|noneDefault: VirtualDocumentRoot noneContext: server config, virtual hostStatus: ExtensionModule: mod vhost alias

The VIRTUALDOCUMENTROOT directive allows you to determine where Apache will find your documents based onthe value of the server name. The result of expanding interpolated-directory is used as the root of the document treein a similar manner to the DOCUMENTROOT directive’s argument. If interpolated-directory is none then VIRTUAL-DOCUMENTROOT is turned off. This directive cannot be used in the same context as VIRTUALDOCUMENTROOTIP.

VirtualDocumentRootIP Directive

Description: Dynamically configure the location of the document root for a given virtual hostSyntax: VirtualDocumentRootIP interpolated-directory|noneDefault: VirtualDocumentRootIP noneContext: server config, virtual hostStatus: ExtensionModule: mod vhost alias

The VIRTUALDOCUMENTROOTIP directive is like the VIRTUALDOCUMENTROOT directive, except that it uses theIP address of the server end of the connection for directory interpolation instead of the server name.

VirtualScriptAlias Directive

Description: Dynamically configure the location of the CGI directory for a given virtual hostSyntax: VirtualScriptAlias interpolated-directory|noneDefault: VirtualScriptAlias noneContext: server config, virtual hostStatus: ExtensionModule: mod vhost alias

The VIRTUALSCRIPTALIAS directive allows you to determine where Apache will find CGI scripts in a similar mannerto VIRTUALDOCUMENTROOT does for other documents. It matches requests for URIs starting /cgi-bin/, muchlike SCRIPTALIAS /cgi-bin/ would.

Page 597: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.60. APACHE MODULE MOD VHOST ALIAS 589

VirtualScriptAliasIP Directive

Description: Dynamically configure the location of the cgi directory for a given virtual hostSyntax: VirtualScriptAliasIP interpolated-directory|noneDefault: VirtualScriptAliasIP noneContext: server config, virtual hostStatus: ExtensionModule: mod vhost alias

The VIRTUALSCRIPTALIASIP directive is like the VIRTUALSCRIPTALIAS directive, except that it uses the IP addressof the server end of the connection for directory interpolation instead of the server name.

Page 598: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

590 CHAPTER 10. APACHE MODULES

10.61 Apache Module beos

Description: This Multi-Processing Module is optimized for BeOS.Status: MPMModuleIdentifier: mpm beos moduleSourceFile: beos.c

Summary

This Multi-Processing Module (MPM) is the default for BeOS. It uses a single control process which creates threadsto handle requests.

Directives

• CoreDumpDirectory (p. 593)

• Group (p. 594)

• Listen (p. 595)

• ListenBacklog (p. 595)

• MaxClients (p. 596)

• MaxMemFree (p. 597)

• MaxRequestsPerThread

• MaxSpareThreads (p. 597)

• MinSpareThreads (p. 598)

• PidFile (p. 598)

• ReceiveBufferSize (p. 599)

• ScoreBoardFile (p. 599)

• SendBufferSize (p. 600)

• StartThreads (p. 601)

• User (p. 602)

See also

• Setting which addresses and ports Apache uses (p. 57)

MaxRequestsPerThread Directive

Description: Limit on the number of requests that an individual thread will handle during its lifeSyntax: MaxRequestsPerThread numberDefault: MaxRequestsPerThread 0Context: server configStatus: MPMModule: beos

The MAXREQUESTSPERTHREAD directive sets the limit on the number of requests that an individual server threadwill handle. After MAXREQUESTSPERTHREAD requests, the thread will die. If MAXREQUESTSPERTHREAD is 0,then the thread will never expire.

Setting MAXREQUESTSPERTHREAD to a non-zero limit has two beneficial effects:

Page 599: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.61. APACHE MODULE BEOS 591

• it limits the amount of memory that a thread can consume by (accidental) memory leakage;

• by giving threads a finite lifetime, it helps reduce the number of threads when the server load reduces.

=⇒Note:For KEEPALIVE requests, only the first request is counted towards this limit. In effect, itchanges the behavior to limit the number of connections per thread.

Page 600: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

592 CHAPTER 10. APACHE MODULES

10.62 Apache Module mpm common

Description: A collection of directives that are implemented by more than one multi-processing mod-ule (MPM)

Status: MPM

Directives

• AcceptMutex

• BS2000Account

• CoreDumpDirectory

• EnableExceptionHook

• Group

• Listen

• ListenBackLog

• LockFile

• MaxClients

• MaxMemFree

• MaxRequestsPerChild

• MaxSpareThreads

• MinSpareThreads

• PidFile

• ReceiveBufferSize

• ScoreBoardFile

• SendBufferSize

• ServerLimit

• StartServers

• StartThreads

• ThreadLimit

• ThreadsPerChild

• User

AcceptMutex Directive

Description: Method that Apache uses to serialize multiple children accepting requests on network socketsSyntax: AcceptMutex Default|methodDefault: AcceptMutex DefaultContext: server configStatus: MPMModule: LEADER, PERCHILD, PREFORK, THREADPOOL, WORKER

The ACCEPTMUTEX directives sets the method that Apache uses to serialize multiple children accepting requests onnetwork sockets. Prior to Apache 2.0, the method was selectable only at compile time. The optimal method to use ishighly architecture and platform dependent. For further details, see the performance tuning (p. 74) documentation.

If this directive is set to Default, then the compile-time selected default will be used. Other possible methods arelisted below. Note that not all methods are available on all platforms. If a method is specified which is not available, amessage will be written to the error log listing the available methods.

Page 601: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.62. APACHE MODULE MPM COMMON 593

flock uses the flock(2) system call to lock the file defined by the LOCKFILE directive.

fcntl uses the fcntl(2) system call to lock the file defined by the LOCKFILE directive.

posixsem uses POSIX compatible semaphores to implement the mutex.

pthread uses POSIX mutexes as implemented by the POSIX Threads (PThreads) specification.

sysvsem uses SySV-style semaphores to implement the mutex.

If you want to find out the compile time chosen default for your system, you may set your LOGLEVEL to debug.Then the default ACCEPTMUTEX will be written into the ERRORLOG.

BS2000Account Directive

Description: Define the non-privileged account on BS2000 machinesSyntax: BS2000Account accountContext: server configStatus: MPMModule: PERCHILD, PREFORKCompatibility: Only available for BS2000 machines

The BS2000ACCOUNT directive is available for BS2000 hosts only. It must be used to define the account numberfor the non-privileged apache server user (which was configured using the USER directive). This is required by theBS2000 POSIX subsystem (to change the underlying BS2000 task environment by performing a sub-LOGON) toprevent CGI scripts from accessing resources of the privileged account which started the server, usually SYSROOT.

=⇒NoteOnly one BS2000Account directive can be used.

See also

• Apache EBCDIC port (p. 230)

CoreDumpDirectory Directive

Description: Directory where Apache attempts to switch before dumping coreSyntax: CoreDumpDirectory directoryDefault: See usage for the default settingContext: server configStatus: MPMModule: BEOS, LEADER, MPM WINNT, PERCHILD, PREFORK, THREADPOOL, WORKER

This controls the directory to which Apache attempts to switch before dumping core. The default is in the SERVER-ROOT directory, however since this should not be writable by the user the server runs as, core dumps won’t normallyget written. If you want a core dump for debugging, you can use this directive to place it in a different location.

=⇒Core Dumps on LinuxIf Apache starts as root and switches to another user, the Linux kernel disables core dumps evenif the directory is writable for the process. Apache (2.0.46 and later) reenables core dumps onLinux 2.4 and beyond, but only if you explicitly configure a COREDUMPDIRECTORY.

=⇒Core Dumps on BSDTo enable core-dumping of suid-executables on BSD-systems (such as FreeBSD), setkern.sugid coredump to 1.

Page 602: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

594 CHAPTER 10. APACHE MODULES

EnableExceptionHook Directive

Description: Enables a hook that runs exception handlers after a crashSyntax: EnableExceptionHook On|OffDefault: EnableExceptionHook OffContext: server configStatus: MPMModule: LEADER, PERCHILD, PREFORK, THREADPOOL, WORKERCompatibility: Available in version 2.0.49 and later

For safety reasons this directive is only available if the server was configured with the--enable-exception-hook option. It enables a hook that allows external modules to plug in and dosomething after a child crashed.

There are already two modules, mod whatkilledus and mod backtrace that make use of this hook. Pleasehave a look at Jeff Trawick’s EnableExceptionHook site38 for more information about these.

Group Directive

Description: Group under which the server will answer requestsSyntax: Group unix-groupDefault: Group #-1Context: server configStatus: MPMModule: BEOS, LEADER, MPMT OS2, PERCHILD, PREFORK, THREADPOOL, WORKERCompatibility: Only valid in global server config since Apache 2.0

The GROUP directive sets the group under which the server will answer requests. In order to use this directive, theserver must be run initially as root. If you start the server as a non-root user, it will fail to change to the specifiedgroup, and will instead continue to run as the group of the original user. Unix-group is one of:

A group name Refers to the given group by name.

# followed by a group number. Refers to a group by its number.

ExampleGroup www-group

It is recommended that you set up a new group specifically for running the server. Some admins use user nobody,but this is not always possible or desirable.

! SecurityDon’t set GROUP (or USER) to root unless you know exactly what you are doing, and whatthe dangers are.

Special note: Use of this directive in <VIRTUALHOST> is no longer supported. To configure your server for suexecuse SUEXECUSERGROUP.

=⇒NoteAlthough the GROUP directive is present in the BEOS and MPMT OS2 MPMs, it is actually ano-op there and only exists for compatibility reasons.

38http://www.apache.org/˜trawick/exception hook.html

Page 603: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.62. APACHE MODULE MPM COMMON 595

Listen Directive

Description: IP addresses and ports that the server listens toSyntax: Listen [IP-address:]portnumberContext: server configStatus: MPMModule: BEOS, LEADER, MPM NETWARE, MPM WINNT, MPMT OS2, PERCHILD, PREFORK, THREAD-

POOL, WORKERCompatibility: Required directive since Apache 2.0

The LISTEN directive instructs Apache to listen to only specific IP addresses or ports; by default it responds to requestson all IP interfaces. LISTEN is now a required directive. If it is not in the config file, the server will fail to start. Thisis a change from previous versions of Apache.

The LISTEN directive tells the server to accept incoming requests on the specified port or address-and-port combina-tion. If only a port number is specified, the server listens to the given port on all interfaces. If an IP address is given aswell as a port, the server will listen on the given port and interface.

Multiple LISTEN directives may be used to specify a number of addresses and ports to listen to. The server willrespond to requests from any of the listed addresses and ports.

For example, to make the server accept connections on both port 80 and port 8000, use:

Listen 80

Listen 8000

To make the server accept connections on two specified interfaces and port numbers, use

Listen 192.170.2.1:80

Listen 192.170.2.5:8000

IPv6 addresses must be surrounded in square brackets, as in the following example:

Listen [2001:db8::a00:20ff:fea7:ccea]:80

=⇒Error conditionMultiple LISTEN directives for the same ip address and port will result in an Addressalready in use error message.

See also

• DNS Issues (p. 136)

• Setting which addresses and ports Apache uses (p. 57)

ListenBackLog Directive

Description: Maximum length of the queue of pending connectionsSyntax: ListenBacklog backlogDefault: ListenBacklog 511Context: server configStatus: MPMModule: BEOS, LEADER, MPM NETWARE, MPM WINNT, MPMT OS2, PERCHILD, PREFORK, THREAD-

POOL, WORKER

Page 604: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

596 CHAPTER 10. APACHE MODULES

The maximum length of the queue of pending connections. Generally no tuning is needed or desired, however onsome systems it is desirable to increase this when under a TCP SYN flood attack. See the backlog parameter to thelisten(2) system call.

This will often be limited to a smaller number by the operating system. This varies from OS to OS. Also note thatmany OSes do not use exactly what is specified as the backlog, but use a number based on (but normally larger than)what is set.

LockFile Directive

Description: Location of the accept serialization lock fileSyntax: LockFile filenameDefault: LockFile logs/accept.lockContext: server configStatus: MPMModule: LEADER, PERCHILD, PREFORK, THREADPOOL, WORKER

The LOCKFILE directive sets the path to the lockfile used when Apache is used with an ACCEPTMUTEX value ofeither fcntl or flock. This directive should normally be left at its default value. The main reason for changing it isif the logs directory is NFS mounted, since the lockfile must be stored on a local disk. The PID of the main serverprocess is automatically appended to the filename.

! SecurityIt is best to avoid putting this file in a world writable directory such as /var/tmp becausesomeone could create a denial of service attack and prevent the server from starting by creatinga lockfile with the same name as the one the server will try to create.

See also

• ACCEPTMUTEX

MaxClients Directive

Description: Maximum number of connections that will be processed simultaneouslySyntax: MaxClients numberDefault: See usage for detailsContext: server configStatus: MPMModule: BEOS, LEADER, PREFORK, THREADPOOL, WORKER

The MAXCLIENTS directive sets the limit on the number of simultaneous requests that will be served. Any connectionattempts over the MAXCLIENTS limit will normally be queued, up to a number based on the LISTENBACKLOGdirective. Once a child process is freed at the end of a different request, the connection will then be serviced.

For non-threaded servers (i.e., PREFORK), MAXCLIENTS translates into the maximum number of child processes thatwill be launched to serve requests. The default value is 256; to increase it, you must also raise SERVERLIMIT.

For threaded and hybrid servers (e.g. BEOS or WORKER) MAXCLIENTS restricts the total number of threads thatwill be available to serve clients. The default value for BEOS is 50. For hybrid MPMs the default value is 16(SERVERLIMIT) multiplied by the value of 25 (THREADSPERCHILD). Therefore, to increase MAXCLIENTS to avalue that requires more than 16 processes, you must also raise SERVERLIMIT.

Page 605: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.62. APACHE MODULE MPM COMMON 597

MaxMemFree Directive

Description: Maximum amount of memory that the main allocator is allowed to hold without callingfree()

Syntax: MaxMemFree KBytesDefault: MaxMemFree 0Context: server configStatus: MPMModule: BEOS, LEADER, MPM NETWARE, PREFORK, THREADPOOL, WORKER, MPM WINNT

The MAXMEMFREE directive sets the maximum number of free Kbytes that the main allocator is allowed to holdwithout calling free(). When not set, or when set to zero, the threshold will be set to unlimited.

MaxRequestsPerChild Directive

Description: Limit on the number of requests that an individual child server will handle during its lifeSyntax: MaxRequestsPerChild numberDefault: MaxRequestsPerChild 10000Context: server configStatus: MPMModule: LEADER, MPM NETWARE, MPM WINNT, MPMT OS2, PERCHILD, PREFORK, THREADPOOL,

WORKER

The MAXREQUESTSPERCHILD directive sets the limit on the number of requests that an individual child server pro-cess will handle. After MAXREQUESTSPERCHILD requests, the child process will die. If MAXREQUESTSPERCHILDis 0, then the process will never expire.

=⇒Different default valuesThe default value for MPM NETWARE and MPM WINNT is 0.

Setting MAXREQUESTSPERCHILD to a non-zero value limits the amount of memory that process can consume by(accidental) memory leakage.

=⇒NoteFor KEEPALIVE requests, only the first request is counted towards this limit. In effect, itchanges the behavior to limit the number of connections per child.

MaxSpareThreads Directive

Description: Maximum number of idle threadsSyntax: MaxSpareThreads numberDefault: See usage for detailsContext: server configStatus: MPMModule: BEOS, LEADER, MPM NETWARE, MPMT OS2, PERCHILD, THREADPOOL, WORKER

Maximum number of idle threads. Different MPMs deal with this directive differently.

For PERCHILD the default is MaxSpareThreads 10. This MPM monitors the number of idle threads on a per-childbasis. If there are too many idle threads in that child, the server will begin to kill threads within that child.

For WORKER, LEADER and THREADPOOL the default is MaxSpareThreads 250. These MPMs deal with idlethreads on a server-wide basis. If there are too many idle threads in the server then child processes are killed until thenumber of idle threads is less than this number.

For MPM NETWARE the default is MaxSpareThreads 100. Since this MPM runs a single-process, the sparethread count is also server-wide.

Page 606: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

598 CHAPTER 10. APACHE MODULES

BEOS and MPMT OS2 work similar to MPM NETWARE. The default for BEOS is MaxSpareThreads 50. ForMPMT OS2 the default value is 10.

=⇒RestrictionsThe range of the MAXSPARETHREADS value is restricted. Apache will correct the given valueautomatically according to the following rules:

• PERCHILD requires MAXSPARETHREADS to be less or equal than THREADLIMIT.

• MPM NETWARE wants the value to be greater than MINSPARETHREADS.

• For LEADER, THREADPOOL and WORKER the value must be greater or equal than thesum of MINSPARETHREADS and THREADSPERCHILD.

See also

• MINSPARETHREADS

• STARTSERVERS

MinSpareThreads Directive

Description: Minimum number of idle threads available to handle request spikesSyntax: MinSpareThreads numberDefault: See usage for detailsContext: server configStatus: MPMModule: BEOS, LEADER, MPM NETWARE, MPMT OS2, PERCHILD, THREADPOOL, WORKER

Minimum number of idle threads to handle request spikes. Different MPMs deal with this directive differently.

PERCHILD uses a default of MinSpareThreads 5 and monitors the number of idle threads on a per-child basis. Ifthere aren’t enough idle threads in that child, the server will begin to create new threads within that child. Thus, if youset NUMSERVERS to 10 and a MINSPARETHREADS value of 5, you’ll have at least 50 idle threads on your system.

WORKER, LEADER and THREADPOOL use a default of MinSpareThreads 75 and deal with idle threads on aserver-wide basis. If there aren’t enough idle threads in the server then child processes are created until the number ofidle threads is greater than number.

MPM NETWARE uses a default of MinSpareThreads 10 and, since it is a single-process MPM, tracks this on aserver-wide bases.

BEOS and MPMT OS2 work similar to MPM NETWARE. The default for BEOS is MinSpareThreads 1. ForMPMT OS2 the default value is 5.

See also

• MAXSPARETHREADS

• STARTSERVERS

PidFile Directive

Description: File where the server records the process ID of the daemonSyntax: PidFile filenameDefault: PidFile logs/httpd.pidContext: server configStatus: MPMModule: BEOS, LEADER, MPM WINNT, MPMT OS2, PERCHILD, PREFORK, THREADPOOL, WORKER

Page 607: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.62. APACHE MODULE MPM COMMON 599

The PIDFILE directive sets the file to which the server records the process id of the daemon. If the filename is notabsolute then it is assumed to be relative to the SERVERROOT.

ExamplePidFile /var/run/apache.pid

It is often useful to be able to send the server a signal, so that it closes and then re-opens its ERRORLOG and TRANS-FERLOG, and re-reads its configuration files. This is done by sending a SIGHUP (kill -1) signal to the process id listedin the PIDFILE.

The PIDFILE is subject to the same warnings about log file placement and security (p. 40) .

=⇒NoteAs of Apache 2 it is recommended to use only the apachectl script for (re-)starting orstopping the server.

ReceiveBufferSize Directive

Description: TCP receive buffer sizeSyntax: ReceiveBufferSize bytesDefault: ReceiveBufferSize 0Context: server configStatus: MPMModule: BEOS, LEADER, MPM NETWARE, MPM WINNT, MPMT OS2, PERCHILD, PREFORK, THREAD-

POOL, WORKER

The server will set the TCP receive buffer size to the number of bytes specified.

If set to the value of 0, the server will use the OS default.

ScoreBoardFile Directive

Description: Location of the file used to store coordination data for the child processesSyntax: ScoreBoardFile file-pathDefault: ScoreBoardFile logs/apache statusContext: server configStatus: MPMModule: BEOS, LEADER, MPM WINNT, PERCHILD, PREFORK, THREADPOOL, WORKER

Apache uses a scoreboard to communicate between its parent and child processes. Some architectures require a file tofacilitate this communication. If the file is left unspecified, Apache first attempts to create the scoreboard entirely inmemory (using anonymous shared memory) and, failing that, will attempt to create the file on disk (using file-basedshared memory). Specifying this directive causes Apache to always create the file on the disk.

ExampleScoreBoardFile /var/run/apache status

File-based shared memory is useful for third-party applications that require direct access to the scoreboard.

If you use a SCOREBOARDFILE then you may see improved speed by placing it on a RAM disk. But be careful thatyou heed the same warnings about log file placement and security (p. 40) .

See also

• Stopping and Restarting Apache (p. 16)

Page 608: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

600 CHAPTER 10. APACHE MODULES

SendBufferSize Directive

Description: TCP buffer sizeSyntax: SendBufferSize bytesDefault: SendBufferSize 0Context: server configStatus: MPMModule: BEOS, LEADER, MPM NETWARE, MPM WINNT, MPMT OS2, PERCHILD, PREFORK, THREAD-

POOL, WORKER

The server will set the TCP send buffer size to the number of bytes specified. Very useful to increase past standard OSdefaults on high speed high latency (i.e., 100ms or so, such as transcontinental fast pipes).

If set to the value of 0, the server will use the OS default.

ServerLimit Directive

Description: Upper limit on configurable number of processesSyntax: ServerLimit numberDefault: See usage for detailsContext: server configStatus: MPMModule: LEADER, PERCHILD, PREFORK, THREADPOOL, WORKER

For the PREFORK MPM, this directive sets the maximum configured value for MAXCLIENTS for the lifetime ofthe Apache process. For the WORKER MPM, this directive in combination with THREADLIMIT sets the maximumconfigured value for MAXCLIENTS for the lifetime of the Apache process. Any attempts to change this directiveduring a restart will be ignored, but MAXCLIENTS can be modified during a restart.

Special care must be taken when using this directive. If SERVERLIMIT is set to a value much higher than necessary,extra, unused shared memory will be allocated. If both SERVERLIMIT and MAXCLIENTS are set to values higher thanthe system can handle, Apache may not start or the system may become unstable.

With the PREFORK MPM, use this directive only if you need to set MAXCLIENTS higher than 256 (default). Do notset the value of this directive any higher than what you might want to set MAXCLIENTS to.

With WORKER, LEADER and THREADPOOL use this directive only if your MAXCLIENTS and THREADSPERCHILDsettings require more than 16 server processes (default). Do not set the value of this directive any higher than thenumber of server processes required by what you may want for MAXCLIENTS and THREADSPERCHILD.

With the PERCHILD MPM, use this directive only if you need to set NUMSERVERS higher than 8 (default).

=⇒NoteThere is a hard limit of ServerLimit 20000 compiled into the server. This is intended toavoid nasty effects caused by typos.

See also

• Stopping and Restarting Apache (p. 16)

StartServers Directive

Description: Number of child server processes created at startupSyntax: StartServers numberDefault: See usage for detailsContext: server configStatus: MPMModule: LEADER, MPMT OS2, PREFORK, THREADPOOL, WORKER

Page 609: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.62. APACHE MODULE MPM COMMON 601

The STARTSERVERS directive sets the number of child server processes created on startup. As the number of processesis dynamically controlled depending on the load, there is usually little reason to adjust this parameter.

The default value differs from MPM to MPM. For LEADER, THREADPOOL and WORKER the default isStartServers 3. For PREFORK defaults to 5 and for MPMT OS2 to 2.

StartThreads Directive

Description: Number of threads created on startupSyntax: StartThreads numberDefault: See usage for detailsContext: server configStatus: MPMModule: BEOS, MPM NETWARE, PERCHILD

Number of threads created on startup. As the number of threads is dynamically controlled depending on the load, thereis usually little reason to adjust this parameter.

For PERCHILD the default is StartThreads 5 and this directive tracks the number of threads per process at startup.

For MPM NETWARE the default is StartThreads 50 and, since there is only a single process, this is the totalnumber of threads created at startup to serve requests.

For BEOS the default is StartThreads 10. It also reflects the total number of threads created at startup to serverequests.

ThreadLimit Directive

Description: Sets the upper limit on the configurable number of threads per child processSyntax: ThreadLimit numberDefault: See usage for detailsContext: server configStatus: MPMModule: LEADER, MPM WINNT, PERCHILD, THREADPOOL, WORKERCompatibility: Available for MPM WINNT in Apache 2.0.41 and later

This directive sets the maximum configured value for THREADSPERCHILD for the lifetime of the Apache process.Any attempts to change this directive during a restart will be ignored, but THREADSPERCHILD can be modified duringa restart up to the value of this directive.

Special care must be taken when using this directive. If THREADLIMIT is set to a value much higher thanTHREADSPERCHILD, extra unused shared memory will be allocated. If both THREADLIMIT and THREADSPER-CHILD are set to values higher than the system can handle, Apache may not start or the system may become unstable.Do not set the value of this directive any higher than your greatest predicted setting of THREADSPERCHILD for thecurrent run of Apache.

The default value for THREADLIMIT is 1920 when used with MPM WINNT and 64 when used with the others.

=⇒NoteThere is a hard limit of ThreadLimit 20000 (or ThreadLimit 15000 withMPM WINNT) compiled into the server. This is intended to avoid nasty effects caused by typos.

Page 610: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

602 CHAPTER 10. APACHE MODULES

ThreadsPerChild Directive

Description: Number of threads created by each child processSyntax: ThreadsPerChild numberDefault: See usage for detailsContext: server configStatus: MPMModule: LEADER, MPM WINNT, THREADPOOL, WORKER

This directive sets the number of threads created by each child process. The child creates these threads at startup andnever creates more. If using an MPM like MPM WINNT, where there is only one child process, this number should behigh enough to handle the entire load of the server. If using an MPM like WORKER, where there are multiple childprocesses, the total number of threads should be high enough to handle the common load on the server.

The default value for THREADSPERCHILD is 64 when used with MPM WINNT and 25 when used with the others.

User Directive

Description: The userid under which the server will answer requestsSyntax: User unix-useridDefault: User #-1Context: server configStatus: MPMModule: LEADER, PERCHILD, PREFORK, THREADPOOL, WORKERCompatibility: Only valid in global server config since Apache 2.0

The USER directive sets the user ID as which the server will answer requests. In order to use this directive, the servermust be run initially as root. If you start the server as a non-root user, it will fail to change to the lesser privilegeduser, and will instead continue to run as that original user. If you do start the server as root, then it is normal for theparent process to remain running as root. Unix-userid is one of:

A username Refers to the given user by name.

# followed by a user number. Refers to a user by its number.

The user should have no privileges that result in it being able to access files that are not intended to be visible to theoutside world, and similarly, the user should not be able to execute code that is not meant for HTTP requests. It isrecommended that you set up a new user and group specifically for running the server. Some admins use user nobody,but this is not always desirable, since the nobody user can have other uses on the system.

! SecurityDon’t set USER (or GROUP) to root unless you know exactly what you are doing, and whatthe dangers are.

With the PERCHILD MPM, which is intended to server virtual hosts run under different user IDs, the USER directivedefines the user ID for the main server and the fallback for <VIRTUALHOST> sections without an ASSIGNUSERIDdirective.

Special note: Use of this directive in <VIRTUALHOST> is no longer supported. To configure your server for suexecuse SUEXECUSERGROUP.

=⇒NoteAlthough the USER directive is present in the BEOS and MPMT OS2 MPMs, it is actually ano-op there and only exists for compatibility reasons.

Page 611: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.63. APACHE MODULE LEADER 603

10.63 Apache Module leader

Description: An experimental variant of the standard WORKER MPMStatus: MPMModuleIdentifier: mpm leader moduleSourceFile: leader.c

Summary

! WarningThis MPM is experimental, so it may or may not work as expected.

This is an experimental variant of the standard WORKER MPM. It uses a Leader/Followers design pattern to coordinatework among threads. For more info, see http://deuce.doc.wustl.edu/doc/pspdfs/lf.pdf.

To use the LEADER MPM, add --with-mpm=leader to the configure script’s arguments when building thehttpd.

This MPM depends on APR’s atomic compare-and-swap operations for thread synchronization. If you are compilingfor an x86 target and you don’t need to support 386s, or you are compiling for a SPARC and you don’t need to run onpre-UltraSPARC chips, add --enable-nonportable-atomics=yes to the configure script’s arguments.This will cause APR to implement atomic operations using efficient opcodes not available in older CPUs.

Directives

• AcceptMutex (p. 592)

• CoreDumpDirectory (p. 593)

• EnableExceptionHook (p. 594)

• Group (p. 594)

• Listen (p. 595)

• ListenBacklog (p. 595)

• LockFile (p. 596)

• MaxClients (p. 596)

• MaxMemFree (p. 597)

• MaxRequestsPerChild (p. 597)

• MaxSpareThreads (p. 597)

• MinSpareThreads (p. 598)

• PidFile (p. 598)

• ReceiveBufferSize (p. 599)

• ScoreBoardFile (p. 599)

• SendBufferSize (p. 600)

• ServerLimit (p. 600)

• StartServers (p. 600)

• ThreadLimit (p. 601)

• ThreadsPerChild (p. 602)

• User (p. 602)

Page 612: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

604 CHAPTER 10. APACHE MODULES

10.64 Apache Module mpm netware

Description: Multi-Processing Module implementing an exclusively threaded web server optimizedfor Novell NetWare

Status: MPMModuleIdentifier: mpm netware moduleSourceFile: mpm netware.c

Summary

This Multi-Processing Module (MPM) implements an exclusively threaded web server that has been optimized forNovell NetWare.

The main thread is responsible for launching child worker threads which listen for connections and serve them whenthey arrive. Apache always tries to maintain several spare or idle worker threads, which stand ready to serve incomingrequests. In this way, clients do not need to wait for a new child threads to be spawned before their requests can beserved.

The STARTTHREADS, MINSPARETHREADS, MAXSPARETHREADS, and MAXTHREADS regulate how the mainthread creates worker threads to serve requests. In general, Apache is very self-regulating, so most sites do not needto adjust these directives from their default values. Sites with limited memory may need to decrease MAXTHREADSto keep the server from thrashing (spawning and terminating idle threads). More information about tuning processcreation is provided in the performance hints (p. 74) documentation.

MAXREQUESTSPERCHILD controls how frequently the server recycles processes by killing old ones and launchingnew ones. On the NetWare OS it is highly recommended that this directive remain set to 0. This allows worker threadsto continue servicing requests indefinitely.

Directives

• Listen (p. 595)

• ListenBacklog (p. 595)

• MaxMemFree (p. 597)

• MaxRequestsPerChild (p. 597)

• MaxSpareThreads (p. 597)

• MaxThreads

• MinSpareThreads (p. 598)

• ReceiveBufferSize (p. 599)

• SendBufferSize (p. 600)

• StartThreads (p. 601)

• ThreadStackSize

See also

• Setting which addresses and ports Apache uses (p. 57)

Page 613: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.64. APACHE MODULE MPM NETWARE 605

MaxThreads Directive

Description: Set the maximum number of worker threadsSyntax: MaxThreads numberDefault: MaxThreads 2048Context: server configStatus: MPMModule: mpm netware

The MAXTHREADS directive sets the desired maximum number worker threads allowable. The default value is alsothe compiled in hard limit. Therefore it can only be lowered, for example:

MaxThreads 512

ThreadStackSize Directive

Description: Determine the stack size for each threadSyntax: ThreadStackSize numberDefault: ThreadStackSize 65536Context: server configStatus: MPMModule: mpm netware

This directive tells the server what stack size to use for each of the running threads. If you ever get a stack overflowyou will need to bump this number to a higher setting.

Page 614: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

606 CHAPTER 10. APACHE MODULES

10.65 Apache Module mpmt os2

Description: Hybrid multi-process, multi-threaded MPM for OS/2Status: MPMModuleIdentifier: mpm mpmt os2 moduleSourceFile: mpmt os2.c

Summary

The Server consists of a main, parent process and a small, static number of child processes.

The parent process’s job is to manage the child processes. This involves spawning children as required to ensure thereare always STARTSERVERS processes accepting connections.

Each child process consists of a a pool of worker threads and a main thread that accepts connections and passes themto the workers via a work queue. The worker thread pool is dynamic, managed by a maintenance thread so that thenumber of idle threads is kept between MINSPARETHREADS and MAXSPARETHREADS.

Directives

• Group (p. 594)

• Listen (p. 595)

• ListenBacklog (p. 595)

• MaxRequestsPerChild (p. 597)

• MaxSpareThreads (p. 597)

• MinSpareThreads (p. 598)

• PidFile (p. 598)

• ReceiveBufferSize (p. 599)

• SendBufferSize (p. 600)

• StartServers (p. 600)

• User (p. 602)

See also

• Setting which addresses and ports Apache uses (p. 57)

Page 615: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.66. APACHE MODULE PERCHILD 607

10.66 Apache Module perchild

Description: Multi-Processing Module allowing for daemon processes serving requests to be assigneda variety of different userids

Status: MPMModuleIdentifier: mpm perchild moduleSourceFile: perchild.c

Summary

! This module is not functional. Development of this module is not complete and is not currentlyactive. Do not use PERCHILD unless you are a programmer willing to help fix it.

This Multi-Processing Module (MPM) implements a hybrid multi-process, multi-threaded web server. A fixed numberof processes create threads to handle requests. Fluctuations in load are handled by increasing or decreasing the numberof threads in each process.

Directives

• AcceptMutex (p. 592)

• AssignUserID

• BS2000Account (p. 593)

• ChildPerUserID

• CoreDumpDirectory (p. 593)

• EnableExceptionHook (p. 594)

• Group (p. 594)

• Listen (p. 595)

• ListenBacklog (p. 595)

• LockFile (p. 596)

• MaxRequestsPerChild (p. 597)

• MaxSpareThreads (p. 597)

• MaxThreadsPerChild

• MinSpareThreads (p. 598)

• NumServers

• PidFile (p. 598)

• ReceiveBufferSize (p. 599)

• ScoreBoardFile (p. 599)

• SendBufferSize (p. 600)

• ServerLimit (p. 600)

• StartThreads (p. 601)

• ThreadLimit (p. 601)

• User (p. 602)

See also

• Setting which addresses and ports Apache uses (p. 57)

Page 616: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

608 CHAPTER 10. APACHE MODULES

How it works

A single control process launches the number of child processes indicated by the NUMSERVERS directive at serverstartup. Each child process creates threads as specified in the STARTTHREADS directive. The individual threads thenlisten for connections and serve them when they arrive.

Apache always tries to maintain a pool of spare or idle server threads, which stand ready to serve incoming requests.In this way, clients do not need to wait for new threads to be created. For each child process, Apache assessesthe number of idle threads and creates or destroys threads to keep this number within the boundaries specified byMINSPARETHREADS and MAXSPARETHREADS. Since this process is very self-regulating, it is rarely necessary tomodify these directives from their default values. The maximum number of clients that may be served simultaneouslyis determined by multiplying the number of server processes that will be created (NUMSERVERS) by the maximumnumber of threads created in each process (MAXTHREADSPERCHILD).

While the parent process is usually started as root under Unix in order to bind to port 80, the child processes and threadsare launched by Apache as a less-privileged user. The USER and GROUP directives are used to set the privileges of theApache child processes. The child processes must be able to read all the content that will be served, but should haveas few privileges beyond that as possible. In addition, unless suexec is used, these directives also set the privilegeswhich will be inherited by CGI scripts.

MAXREQUESTSPERCHILD controls how frequently the server recycles processes by killing old ones and launchingnew ones.

Working with different user-IDs

The PERCHILD MPM adds the extra ability to specify that particular processes should serve requests under differentuser-IDs. These user-IDs can then be associated with specific virtual hosts. You have to use one CHILDPERUSERIDdirective for every user/group combination you want to be run. Then you can tie particular virtual hosts to that userand group IDs.

The following example runs 7 child processes. Two of them are run under user1/group1. The next four are rununder user2/group2 and the remaining process uses the USER and GROUP of the main server:

Global configNumServers 7ChildPerUserID user1 group1 2

ChildPerUserID user2 group2 4

Using unbalanced numbers of processes as above is useful, if the particular virtual hosts produce different load. Theassignment to the virtual hosts is easily done as in the example below. In conclusion with the example above thefollowing assumes, that server2 has to serve about twice of the hits of server1.

Page 617: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.66. APACHE MODULE PERCHILD 609

ExampleNameVirtualHost *

<VirtualHost *>

ServerName fallbackhost# no assignment; use fallback

</VirtualHost>

<VirtualHost *>

ServerName server1AssignUserID user1 group1

</VirtualHost>

<VirtualHost *>

ServerName server2AssignUserID user2 group2

</VirtualHost>

AssignUserID Directive

Description: Tie a virtual host to a user and group IDSyntax: AssignUserID user-id group-idContext: virtual hostStatus: MPMModule: perchild

Tie a virtual host to a specific user/group combination. Requests addressed to the virtual host where this directiveappears will be served by a process running with the specified user and group ID.

The user and group ID has to be assigned to a number of children in the global server config using the CHILDPE-RUSERID directive. See the section above for a configuration example.

ChildPerUserID Directive

Description: Specify user ID and group ID for a number of child processesSyntax: ChildPerUserID user-id group-id num-childrenContext: server configStatus: MPMModule: perchild

Specify a user ID and group ID for a number of child processes. The third argument, num-children, is the number ofchild processes to start with the specified user and group. It does not represent a specific child number. In order to usethis directive, the server must be run initially as root. If you start the server as a non-root user, it will fail to changeto the lesser privileged user.

If the total number of child processes, found by totaling all of the third arguments to all CHILDPERUSERID directivesin the config file, is less than NUMSERVERS, then all remaining children will inherit the USER and GROUP settingsfrom the main server. See the section above for a configuration example.

! SecurityDon’t set user-id (or group-id) to root unless you know exactly what you are doing, and whatthe dangers are.

Page 618: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

610 CHAPTER 10. APACHE MODULES

MaxThreadsPerChild Directive

Description: Maximum number of threads per child processSyntax: MaxThreadsPerChild numberDefault: MaxThreadsPerChild 64Context: server configStatus: MPMModule: perchild

This directive sets the maximum number of threads that will be created in each child process. To increase this valuebeyond its default, it is necessary to change the value of the THREADLIMIT directive and stop and re-start the server.

NumServers Directive

Description: Total number of children alive at the same timeSyntax: NumServers numberDefault: NumServers 2Context: server configStatus: MPMModule: perchild

The NUMSERVERS directive determines the number of children alive at the same time. This number should be largeenough to handle the requests for the entire site. To increase this value beyond the value of 8, it is necessary to changethe value of the SERVERLIMIT directive and stop and re-start the server. See the section above for a configurationexample.

Page 619: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.67. APACHE MODULE PREFORK 611

10.67 Apache Module prefork

Description: Implements a non-threaded, pre-forking web serverStatus: MPMModuleIdentifier: mpm prefork moduleSourceFile: prefork.c

Summary

This Multi-Processing Module (MPM) implements a non-threaded, pre-forking web server that handles requests in amanner similar to Apache 1.3. It is appropriate for sites that need to avoid threading for compatibility with non-thread-safe libraries. It is also the best MPM for isolating each request, so that a problem with a single request will not affectany other.

This MPM is very self-regulating, so it is rarely necessary to adjust its configuration directives. Most important is thatMAXCLIENTS be big enough to handle as many simultaneous requests as you expect to receive, but small enough toassure that there is enough physical RAM for all processes.

Directives

• AcceptMutex (p. 592)

• BS2000Account (p. 593)

• CoreDumpDirectory (p. 593)

• EnableExceptionHook (p. 594)

• Group (p. 594)

• Listen (p. 595)

• ListenBacklog (p. 595)

• LockFile (p. 596)

• MaxClients (p. 596)

• MaxMemFree (p. 597)

• MaxRequestsPerChild (p. 597)

• MaxSpareServers

• MinSpareServers

• PidFile (p. 598)

• ReceiveBufferSize (p. 599)

• ScoreBoardFile (p. 599)

• SendBufferSize (p. 600)

• ServerLimit (p. 600)

• StartServers (p. 600)

• User (p. 602)

See also

• Setting which addresses and ports Apache uses (p. 57)

Page 620: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

612 CHAPTER 10. APACHE MODULES

How it Works

A single control process is responsible for launching child processes which listen for connections and serve themwhen they arrive. Apache always tries to maintain several spare or idle server processes, which stand ready to serveincoming requests. In this way, clients do not need to wait for a new child processes to be forked before their requestscan be served.

The STARTSERVERS, MINSPARESERVERS, MAXSPARESERVERS, and MAXCLIENTS regulate how the parent pro-cess creates children to serve requests. In general, Apache is very self-regulating, so most sites do not need to adjustthese directives from their default values. Sites which need to serve more than 256 simultaneous requests may needto increase MAXCLIENTS, while sites with limited memory may need to decrease MAXCLIENTS to keep the serverfrom thrashing (swapping memory to disk and back). More information about tuning process creation is provided inthe performance hints (p. 74) documentation.

While the parent process is usually started as root under Unix in order to bind to port 80, the child processes arelaunched by Apache as a less-privileged user. The USER and GROUP directives are used to set the privileges of theApache child processes. The child processes must be able to read all the content that will be served, but should haveas few privileges beyond that as possible.

MAXREQUESTSPERCHILD controls how frequently the server recycles processes by killing old ones and launchingnew ones.

MaxSpareServers Directive

Description: Maximum number of idle child server processesSyntax: MaxSpareServers numberDefault: MaxSpareServers 10Context: server configStatus: MPMModule: prefork

The MAXSPARESERVERS directive sets the desired maximum number of idle child server processes. An idle processis one which is not handling a request. If there are more than MAXSPARESERVERS idle, then the parent process willkill off the excess processes.

Tuning of this parameter should only be necessary on very busy sites. Setting this parameter to a large number is almostalways a bad idea. If you are trying to set the value lower than MINSPARESERVERS, Apache will automatically adjustit to MINSPARESERVERS + 1.

See also

• MINSPARESERVERS

• STARTSERVERS

MinSpareServers Directive

Description: Minimum number of idle child server processesSyntax: MinSpareServers numberDefault: MinSpareServers 5Context: server configStatus: MPMModule: prefork

The MINSPARESERVERS directive sets the desired minimum number of idle child server processes. An idle process isone which is not handling a request. If there are fewer than MINSPARESERVERS idle, then the parent process createsnew children at a maximum rate of 1 per second.

Page 621: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.67. APACHE MODULE PREFORK 613

Tuning of this parameter should only be necessary on very busy sites. Setting this parameter to a large number isalmost always a bad idea.

See also

• MAXSPARESERVERS

• STARTSERVERS

Page 622: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

614 CHAPTER 10. APACHE MODULES

10.68 Apache Module threadpool

Description: Yet another experimental variant of the standard WORKER MPMStatus: MPMModuleIdentifier: mpm threadpool moduleSourceFile: threadpool.c

Summary

! WarningThis MPM is a developer playground and highly experimental, so it may or may not work asexpected.

This is an experimental variant of the standard worker MPM. Rather than queuing connections like the worker MPM,the THREADPOOL MPM queues idle worker threads and hands each accepted connection to the next available worker.

The THREADPOOL MPM can’t match the performance of the WORKER MPM in benchmark testing. As of 2.0.39,some of the key load-throtting concepts from the THREADPOOL MPM have been incorporated into the WORKER MPM.The THREADPOOL code is useful primarily as a research platform. For general-purpose use and for any productionenvironments, use WORKER instead.

Directives

• AcceptMutex (p. 592)

• CoreDumpDirectory (p. 593)

• EnableExceptionHook (p. 594)

• Group (p. 594)

• Listen (p. 595)

• ListenBacklog (p. 595)

• LockFile (p. 596)

• MaxClients (p. 596)

• MaxMemFree (p. 597)

• MaxRequestsPerChild (p. 597)

• MaxSpareThreads (p. 597)

• MinSpareThreads (p. 598)

• PidFile (p. 598)

• ReceiveBufferSize (p. 599)

• ScoreBoardFile (p. 599)

• SendBufferSize (p. 600)

• ServerLimit (p. 600)

• StartServers (p. 600)

• ThreadLimit (p. 601)

• ThreadsPerChild (p. 602)

• User (p. 602)

Page 623: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.69. APACHE MODULE MPM WINNT 615

10.69 Apache Module mpm winnt

Description: This Multi-Processing Module is optimized for Windows NT.Status: MPMModuleIdentifier: mpm winnt moduleSourceFile: mpm winnt.c

Summary

This Multi-Processing Module (MPM) is the default for the Windows NT operating systems. It uses a single controlprocess which launches a single child process which in turn creates threads to handle requests

Directives

• CoreDumpDirectory (p. 593)

• Listen (p. 595)

• ListenBacklog (p. 595)

• MaxMemFree (p. 597)

• MaxRequestsPerChild (p. 597)

• PidFile (p. 598)

• ReceiveBufferSize (p. 599)

• ScoreBoardFile (p. 599)

• SendBufferSize (p. 600)

• ThreadLimit (p. 601)

• ThreadsPerChild (p. 602)

• Win32DisableAcceptEx

Win32DisableAcceptEx Directive

Description: Use accept() rather than AcceptEx() to accept network connectionsSyntax: Win32DisableAcceptExDefault: AcceptEx() is enabled by default. Use this directive to

disable use of AcceptEx()Context: server configStatus: MPMModule: mpm winntCompatibility: Available in Version 2.0.49 and later

AcceptEx() is a Microsoft WinSock v2 API that provides some performance improvements over the use of the BSDstyle accept() API in certain circumstances. Some popular Windows products, typically virus scanning or virtualprivate network packages, have bugs that interfere with the proper operation of AcceptEx(). If you encounter anerror condition like:

[error] (730038)An operation was attempted on something that is not a

socket.: winnt accept: AcceptEx failed. Attempting to recover.

you should use this directive to disable the use of AcceptEx().

Page 624: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

616 CHAPTER 10. APACHE MODULES

10.70 Apache Module worker

Description: Multi-Processing Module implementing a hybrid multi-threaded multi-process webserver

Status: MPMModuleIdentifier: mpm worker moduleSourceFile: worker.c

Summary

This Multi-Processing Module (MPM) implements a hybrid multi-process multi-threaded server. By using threads toserve requests, it is able to serve a large number of requests with less system resources than a process-based server.Yet it retains much of the stability of a process-based server by keeping multiple processes available, each with manythreads.

The most important directives used to control this MPM are THREADSPERCHILD, which controls the number ofthreads deployed by each child process and MAXCLIENTS, which controls the maximum total number of threads thatmay be launched.

Directives

• AcceptMutex (p. 592)

• CoreDumpDirectory (p. 593)

• EnableExceptionHook (p. 594)

• Group (p. 594)

• Listen (p. 595)

• ListenBacklog (p. 595)

• LockFile (p. 596)

• MaxClients (p. 596)

• MaxMemFree (p. 597)

• MaxRequestsPerChild (p. 597)

• MaxSpareThreads (p. 597)

• MinSpareThreads (p. 598)

• PidFile (p. 598)

• ReceiveBufferSize (p. 599)

• ScoreBoardFile (p. 599)

• SendBufferSize (p. 600)

• ServerLimit (p. 600)

• StartServers (p. 600)

• ThreadLimit (p. 601)

• ThreadsPerChild (p. 602)

• User (p. 602)

See also

• Setting which addresses and ports Apache uses (p. 57)

Page 625: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

10.70. APACHE MODULE WORKER 617

How it Works

A single control process (the parent) is responsible for launching child processes. Each child process creates a fixednumber of server threads as specified in the THREADSPERCHILD directive, as well as a listener thread which listensfor connections and passes them to a server thread for processing when they arrive.

Apache always tries to maintain a pool of spare or idle server threads, which stand ready to serve incoming requests.In this way, clients do not need to wait for a new threads or processes to be created before their requests can beserved. The number of processes that will initially launched is set by the STARTSERVERS directive. Then duringoperation, Apache assesses the total number of idle threads in all processes, and forks or kills processes to keep thisnumber within the boundaries specified by MINSPARETHREADS and MAXSPARETHREADS. Since this process isvery self-regulating, it is rarely necessary to modify these directives from their default values. The maximum numberof clients that may be served simultaneously (i.e., the maximum total number of threads in all processes) is determinedby the MAXCLIENTS directive. The maximum number of active child processes is determined by the MAXCLIENTSdirective divided by the THREADSPERCHILD directive.

Two directives set hard limits on the number of active child processes and the number of server threads in a childprocess, and can only be changed by fully stopping the server and then starting it again. SERVERLIMIT is a hardlimit on the number of active child processes, and must be greater than or equal to the MAXCLIENTS directive dividedby the THREADSPERCHILD directive. THREADLIMIT is a hard limit of the number of server threads, and must begreater than or equal to the THREADSPERCHILD directive. If non-default values are specified for these directives,they should appear before other WORKER directives.

In addition to the set of active child processes, there may be additional child processes which are terminating but whereat least one server thread is still handling an existing client connection. Up to MAXCLIENTS terminating processesmay be present, though the actual number can be expected to be much smaller. This behavior can be avoided bydisabling the termination of individual child processes, which is achieved by the following:

• set the value of MAXREQUESTSPERCHILD to zero

• set the value of MAXSPARETHREADS to the same value as MAXCLIENTS

A typical configuration of the process-thread controls in the WORKER MPM could look as follows:

ServerLimit 16StartServers 2MaxClients 150MinSpareThreads 25MaxSpareThreads 75

ThreadsPerChild 25

While the parent process is usually started as root under Unix in order to bind to port 80, the child processes andthreads are launched by Apache as a less-privileged user. The USER and GROUP directives are used to set the privilegesof the Apache child processes. The child processes must be able to read all the content that will be served, but shouldhave as few privileges beyond that as possible. In addition, unless suexec is used, these directives also set theprivileges which will be inherited by CGI scripts.

MAXREQUESTSPERCHILD controls how frequently the server recycles processes by killing old ones and launchingnew ones.

Page 626: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

618 CHAPTER 10. APACHE MODULES

Page 627: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

Chapter 11

Developer Documentation

619

Page 628: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

620 CHAPTER 11. DEVELOPER DOCUMENTATION

11.1 Developer Documentation for Apache 2.0

Many of the documents on these Developer pages are lifted from Apache 1.3’s documentation. While they are all beingupdated to Apache 2.0, they are in different stages of progress. Please be patient, and point out any discrepancies orerrors on the developer/ pages directly to the [email protected] mailing list.

Topics

• Apache 1.3 API Notes (p. 621)

• Apache 2.0 Hook Functions (p. 641)

• Request Processing in Apache 2.0 (p. 648)

• How filters work in Apache 2.0 (p. 652)

• Converting Modules from Apache 1.3 to Apache 2.0 (p. 644)

• Debugging Memory Allocation in APR (p. 637)

• Documenting Apache 2.0 (p. 640)

• Apache 2.0 Thread Safety Issues (p. ??)

External Resources

• Tools provided by Ian Holsman:

– Apache 2 cross reference2

– Autogenerated Apache 2 code documentation3

• Module Development Tutorials by Kevin O’Donnell

– Integrating a module into the Apache build system4

– Handling configuration directives5

• Some notes on Apache module development by Ryan Bloom6

1http://httpd.apache.org/lists.html#http-dev2http://lxr.webperf.org/3http://docx.webperf.org/4http://threebit.net/tutorials/apache2 modules/tut1/tutorial1.html5http://threebit.net/tutorials/apache2 modules/tut2/tutorial2.html6http://www.onlamp.com/pub/ct/38

Page 629: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

11.2. APACHE 1.3 API NOTES 621

11.2 Apache 1.3 API notes

! WarningThis document has not been updated to take into account changes made in the 2.0 version ofthe Apache HTTP Server. Some of the information may still be relevant, but please use it withcare.

These are some notes on the Apache API and the data structures you have to deal with, etc. They are not yet nearlycomplete, but hopefully, they will help you get your bearings. Keep in mind that the API is still subject to change aswe gain experience with it. (See the TODO file for what might be coming). However, it will be easy to adapt modulesto any changes that are made. (We have more modules to adapt than you do).

A few notes on general pedagogical style here. In the interest of conciseness, all structure declarations here areincomplete – the real ones have more slots that I’m not telling you about. For the most part, these are reserved to onecomponent of the server core or another, and should be altered by modules with caution. However, in some cases, theyreally are things I just haven’t gotten around to yet. Welcome to the bleeding edge.

Finally, here’s an outline, to give you some bare idea of what’s coming up, and in what order:

• Basic concepts.

– Handlers, Modules, and Requests– A brief tour of a module

• How handlers work

– A brief tour of the request rec

– Where request rec structures come from– Handling requests, declining, and returning error codes– Special considerations for response handlers– Special considerations for authentication handlers– Special considerations for logging handlers

• Resource allocation and resource pools

• Configuration, commands and the like

– Per-directory configuration structures– Command handling– Side notes — per-server configuration, virtual servers, etc.

Basic concepts

We begin with an overview of the basic concepts behind the API, and how they are manifested in the code.

Handlers, Modules, and Requests

Apache breaks down request handling into a series of steps, more or less the same way the Netscape server API does(although this API has a few more stages than NetSite does, as hooks for stuff I thought might be useful in the future).These are:

• URI -> Filename translation

Page 630: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

622 CHAPTER 11. DEVELOPER DOCUMENTATION

• Auth ID checking [is the user who they say they are?]

• Auth access checking [is the user authorized here?]

• Access checking other than auth

• Determining MIME type of the object requested

• ‘Fixups’ – there aren’t any of these yet, but the phase is intended as a hook for possible extensions like SETENV,which don’t really fit well elsewhere.

• Actually sending a response back to the client.

• Logging the request

These phases are handled by looking at each of a succession of modules, looking to see if each of them has a handlerfor the phase, and attempting invoking it if so. The handler can typically do one of three things:

• Handle the request, and indicate that it has done so by returning the magic constant OK.

• Decline to handle the request, by returning the magic integer constant DECLINED. In this case, the serverbehaves in all respects as if the handler simply hadn’t been there.

• Signal an error, by returning one of the HTTP error codes. This terminates normal handling of the request,although an ErrorDocument may be invoked to try to mop up, and it will be logged in any case.

Most phases are terminated by the first module that handles them; however, for logging, ‘fixups’, and non-accessauthentication checking, all handlers always run (barring an error). Also, the response phase is unique in that modulesmay declare multiple handlers for it, via a dispatch table keyed on the MIME type of the requested object. Modulesmay declare a response-phase handler which can handle any request, by giving it the key */* (i.e., a wildcard MIMEtype specification). However, wildcard handlers are only invoked if the server has already tried and failed to find amore specific response handler for the MIME type of the requested object (either none existed, or they all declined).

The handlers themselves are functions of one argument (a request rec structure. vide infra), which returns aninteger, as above.

A brief tour of a module

At this point, we need to explain the structure of a module. Our candidate will be one of the messier ones, the CGImodule – this handles both CGI scripts and the SCRIPTALIAS config file command. It’s actually a great deal morecomplicated than most modules, but if we’re going to have only one example, it might as well be the one with itsfingers in every place.

Let’s begin with handlers. In order to handle the CGI scripts, the module declares a response handler for them.Because of SCRIPTALIAS, it also has handlers for the name translation phase (to recognize SCRIPTALIASed URIs),the type-checking phase (any SCRIPTALIASed request is typed as a CGI script).

The module needs to maintain some per (virtual) server information, namely, the SCRIPTALIASes in effect; the modulestructure therefore contains pointers to a functions which builds these structures, and to another which combines twoof them (in case the main server and a virtual server both have SCRIPTALIASes declared).

Finally, this module contains code to handle the SCRIPTALIAS command itself. This particular module only declaresone command, but there could be more, so modules have command tables which declare their commands, and describewhere they are permitted, and how they are to be invoked.

A final note on the declared types of the arguments of some of these commands: a pool is a pointer to a resource poolstructure; these are used by the server to keep track of the memory which has been allocated, files opened, etc., eitherto service a particular request, or to handle the process of configuring itself. That way, when the request is over (or, forthe configuration pool, when the server is restarting), the memory can be freed, and the files closed, en masse, withoutanyone having to write explicit code to track them all down and dispose of them. Also, a cmd parms structure

Page 631: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

11.2. APACHE 1.3 API NOTES 623

contains various information about the config file being read, and other status information, which is sometimes ofuse to the function which processes a config-file command (such as SCRIPTALIAS). With no further ado, the moduleitself:

/* Declarations of handlers. */

int translate scriptalias (request rec *);int type scriptalias (request rec *);int cgi handler (request rec *);

/* Subsidiary dispatch table for response-phase

* handlers, by MIME type */

handler rec cgi handlers[] = {{ "application/x-httpd-cgi", cgi handler },{ NULL }

};/* Declarations of routines to manipulate the

* module’s configuration info. Note that these are

* returned, and passed in, as void *’s; the server

* core keeps track of them, but it doesn’t, and can’t,

* know their internal structure.

*/

void *make cgi server config (pool *);void *merge cgi server config (pool *, void *, void *);

/* Declarations of routines to handle config-file commands */

extern char *script alias(cmd parms *, void *per dir config, char

*fake, char *real);

command rec cgi cmds[] = {{ "ScriptAlias", script alias, NULL, RSRC CONF, TAKE2,

"a fakename and a realname"},{ NULL }

};module cgi module = {

STANDARD_MODULE_STUFF,NULL, /* initializer */NULL, /* dir config creator */NULL, /* dir merger */make_cgi_server_config, /* server config */merge_cgi_server_config, /* merge server config */cgi_cmds, /* command table */cgi_handlers, /* handlers */translate_scriptalias, /* filename translation */NULL, /* check_user_id */NULL, /* check auth */NULL, /* check access */type_scriptalias, /* type_checker */NULL, /* fixups */NULL, /* logger */NULL /* header parser */

};

Page 632: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

624 CHAPTER 11. DEVELOPER DOCUMENTATION

How handlers work

The sole argument to handlers is a request rec structure. This structure describes a particular request whichhas been made to the server, on behalf of a client. In most cases, each connection to the client generates only onerequest rec structure.

A brief tour of the request rec

The request rec contains pointers to a resource pool which will be cleared when the server is finished handlingthe request; to structures containing per-server and per-connection information, and most importantly, information onthe request itself.

The most important such information is a small set of character strings describing attributes of the object being re-quested, including its URI, filename, content-type and content-encoding (these being filled in by the translation andtype-check handlers which handle the request, respectively).

Other commonly used data items are tables giving the MIME headers on the client’s original request, MIME headersto be sent back with the response (which modules can add to at will), and environment variables for any subprocesseswhich are spawned off in the course of servicing the request. These tables are manipulated using the ap table getand ap table set routines.

=⇒Note that the Content-type header value cannot be set by module content-handlers usingthe ap table *() routines. Rather, it is set by pointing the content type field in therequest rec structure to an appropriate string. e.g.,

r->content type = "text/html";

Finally, there are pointers to two data structures which, in turn, point to per-module configuration structures. Specifi-cally, these hold pointers to the data structures which the module has built to describe the way it has been configuredto operate in a given directory (via .htaccess files or <DIRECTORY> sections), for private data it has built in thecourse of servicing the request (so modules’ handlers for one phase can pass ‘notes’ to their handlers for other phases).There is another such configuration vector in the server rec data structure pointed to by the request rec, whichcontains per (virtual) server configuration data.

Here is an abridged declaration, giving the fields most commonly used:

Page 633: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

11.2. APACHE 1.3 API NOTES 625

struct request rec {pool *pool;conn rec *connection;server rec *server;

/* What object is being requested */

char *uri;char *filename;char *path info;

char *args; /* QUERY_ARGS, if any */struct stat finfo; /* Set by server core;

* st_mode set to zero if no such file */

char *content type;char *content encoding;

/* MIME header environments, in and out. Also,

* an array containing environment variables to

* be passed to subprocesses, so people can write

* modules to add to that environment.

** The difference between headers out and

* err headers out is that the latter are printed

* even on error, and persist across internal

* redirects (so the headers printed for

* ERRORDOCUMENT handlers will have them).

*/

table *headers in;table *headers out;table *err headers out;table *subprocess env;

/* Info about the request itself... */

int header_only; /* HEAD request, as opposed to GET */char *protocol; /* Protocol, as given to us, or HTTP/0.9 */char *method; /* GET, HEAD, POST, etc. */int method_number; /* M_GET, M_POST, etc. */

/* Info for logging */

char *the request;int bytes sent;

/* A flag which modules can set, to indicate that

* the data being returned is volatile, and clients

* should be told not to cache it.

*/

int no cache;

/* Various other config info which may change

* with .htaccess files

* These are config vectors, with one void** pointer for each module (the thing pointed

* to being the module’s business).

*/

void *per_dir_config; /* Options set in config files, etc. */void *request_config; /* Notes on *this* request */

};

Page 634: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

626 CHAPTER 11. DEVELOPER DOCUMENTATION

Where request rec structures come from

Most request rec structures are built by reading an HTTP request from a client, and filling in the fields. However,there are a few exceptions:

• If the request is to an imagemap, a type map (i.e., a *.var file), or a CGI script which returned a local‘Location:’, then the resource which the user requested is going to be ultimately located by some URI otherthan what the client originally supplied. In this case, the server does an internal redirect, constructing a newrequest rec for the new URI, and processing it almost exactly as if the client had requested the new URIdirectly.

• If some handler signaled an error, and an ErrorDocument is in scope, the same internal redirect machinerycomes into play.

• Finally, a handler occasionally needs to investigate ‘what would happen if’ some other request were run. Forinstance, the directory indexing module needs to know what MIME type would be assigned to a request for eachdirectory entry, in order to figure out what icon to use.

Such handlers can construct a sub-request, using the functions ap sub req lookup file,ap sub req lookup uri, and ap sub req method uri; these construct a new request recstructure and processes it as you would expect, up to but not including the point of actually sending a response.(These functions skip over the access checks if the sub-request is for a file in the same directory as the originalrequest).

(Server-side includes work by building sub-requests and then actually invoking the response handler for them,via the function ap run sub req).

Handling requests, declining, and returning error codes

As discussed above, each handler, when invoked to handle a particular request rec, has to return an int to indicatewhat happened. That can either be

• OK – the request was handled successfully. This may or may not terminate the phase.

• DECLINED – no erroneous condition exists, but the module declines to handle the phase; the server tries to findanother.

• an HTTP error code, which aborts handling of the request.

Note that if the error code returned is REDIRECT, then the module should put a Location in the request’sheaders out, to indicate where the client should be redirected to.

Special considerations for response handlers

Handlers for most phases do their work by simply setting a few fields in the request rec structure (or, in the caseof access checkers, simply by returning the correct error code). However, response handlers have to actually send arequest back to the client.

They should begin by sending an HTTP response header, using the function ap send http header. (You don’thave to do anything special to skip sending the header for HTTP/0.9 requests; the function figures out on its own thatit shouldn’t do anything). If the request is marked header only, that’s all they should do; they should return afterthat, without attempting any further output.

Otherwise, they should produce a request body which responds to the client as appropriate. The primitives for this areap rputc and ap rprintf, for internally generated output, and ap send fd, to copy the contents of some FILE* straight to the client.

Page 635: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

11.2. APACHE 1.3 API NOTES 627

At this point, you should more or less understand the following piece of code, which is the handler which handles GETrequests which have no more specific handler; it also shows how conditional GETs can be handled, if it’s desirableto do so in a particular response handler – ap set last modified checks against the If-modified-sincevalue supplied by the client, if any, and returns an appropriate code (which will, if nonzero, be USE LOCAL COPY).No similar considerations apply for ap set content length, but it returns an error code for symmetry.

int default handler (request rec *r){

int errstatus;FILE *f;

if (r->method number != M GET) return DECLINED;if (r->finfo.st mode == 0) return NOT FOUND;

if ((errstatus = ap set content length (r, r->finfo.st size))|| (errstatus = ap set last modified (r, r->finfo.st mtime)))return errstatus;

f = fopen (r->filename, "r");

if (f == NULL) {log reason("file permissions deny server access", r->filename,r);return FORBIDDEN;

}register timeout ("send", r);ap send http header (r);

if (!r->header only) send fd (f, r);ap pfclose (r->pool, f);return OK;

}

Finally, if all of this is too much of a challenge, there are a few ways out of it. First off, as shown above, a responsehandler which has not yet produced any output can simply return an error code, in which case the server will automati-cally produce an error response. Secondly, it can punt to some other handler by invoking ap internal redirect,which is how the internal redirection machinery discussed above is invoked. A response handler which has internallyredirected should always return OK.

(Invoking ap internal redirect from handlers which are not response handlers will lead to serious confusion).

Special considerations for authentication handlers

Stuff that should be discussed here in detail:

• Authentication-phase handlers not invoked unless auth is configured for the directory.

• Common auth configuration stored in the core per-dir configuration; it has accessors ap auth type,ap auth name, and ap requires.

• Common routines, to handle the protocol end of things, at least for HTTP basic authentication(ap get basic auth pw, which sets the connection->user structure field automatically, andap note basic auth failure, which arranges for the proper WWW-Authenticate: header to be sentback).

Page 636: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

628 CHAPTER 11. DEVELOPER DOCUMENTATION

Special considerations for logging handlers

When a request has internally redirected, there is the question of what to log. Apache handles this by bundlingthe entire chain of redirects into a list of request rec structures which are threaded through the r->prev andr->next pointers. The request rec which is passed to the logging handlers in such cases is the one which wasoriginally built for the initial request from the client; note that the bytes sent field will only be correct in the lastrequest in the chain (the one for which a response was actually sent).

Resource allocation and resource pools

One of the problems of writing and designing a server-pool server is that of preventing leakage, that is, allocatingresources (memory, open files, etc.), without subsequently releasing them. The resource pool machinery is designedto make it easy to prevent this from happening, by allowing resource to be allocated in such a way that they areautomatically released when the server is done with them.

The way this works is as follows: the memory which is allocated, file opened, etc., to deal with a particular request aretied to a resource pool which is allocated for the request. The pool is a data structure which itself tracks the resourcesin question.

When the request has been processed, the pool is cleared. At that point, all the memory associated with it is releasedfor reuse, all files associated with it are closed, and any other clean-up functions which are associated with the poolare run. When this is over, we can be confident that all the resource tied to the pool have been released, and that noneof them have leaked.

Server restarts, and allocation of memory and resources for per-server configuration, are handled in a similar way.There is a configuration pool, which keeps track of resources which were allocated while reading the server config-uration files, and handling the commands therein (for instance, the memory that was allocated for per-server moduleconfiguration, log files and other files that were opened, and so forth). When the server restarts, and has to reread theconfiguration files, the configuration pool is cleared, and so the memory and file descriptors which were taken up byreading them the last time are made available for reuse.

It should be noted that use of the pool machinery isn’t generally obligatory, except for situations like logging handlers,where you really need to register cleanups to make sure that the log file gets closed when the server restarts (this ismost easily done by using the function ap pfopen, which also arranges for the underlying file descriptor to be closedbefore any child processes, such as for CGI scripts, are execed), or in case you are using the timeout machinery (whichisn’t yet even documented here). However, there are two benefits to using it: resources allocated to a pool never leak(even if you allocate a scratch string, and just forget about it); also, for memory allocation, ap palloc is generallyfaster than malloc.

We begin here by describing how memory is allocated to pools, and then discuss how other resources are tracked bythe resource pool machinery.

Allocation of memory in pools

Memory is allocated to pools by calling the function ap palloc, which takes two arguments, one being a pointerto a resource pool structure, and the other being the amount of memory to allocate (in chars). Within handlers forhandling requests, the most common way of getting a resource pool structure is by looking at the pool slot of therelevant request rec; hence the repeated appearance of the following idiom in module code:

Page 637: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

11.2. APACHE 1.3 API NOTES 629

int my handler(request rec *r){

struct my structure *foo;...

foo = (foo *)ap palloc (r->pool, sizeof(my structure));

}

Note that there is no ap pfree – ap palloced memory is freed only when the associated resource pool is cleared.This means that ap palloc does not have to do as much accounting as malloc(); all it does in the typical case isto round up the size, bump a pointer, and do a range check.

(It also raises the possibility that heavy use of ap palloc could cause a server process to grow excessively large.There are two ways to deal with this, which are dealt with below; briefly, you can use malloc, and try to be sure thatall of the memory gets explicitly freed, or you can allocate a sub-pool of the main pool, allocate your memory in thesub-pool, and clear it out periodically. The latter technique is discussed in the section on sub-pools below, and is usedin the directory-indexing code, in order to avoid excessive storage allocation when listing directories with thousandsof files).

Allocating initialized memory

There are functions which allocate initialized memory, and are frequently useful. The function ap pcalloc has thesame interface as ap palloc, but clears out the memory it allocates before it returns it. The function ap pstrduptakes a resource pool and a char * as arguments, and allocates memory for a copy of the string the pointer points to,returning a pointer to the copy. Finally ap pstrcat is a varargs-style function, which takes a pointer to a resourcepool, and at least two char * arguments, the last of which must be NULL. It allocates enough memory to fit copiesof each of the strings, as a unit; for instance:

ap pstrcat (r->pool, "foo", "/", "bar", NULL);

returns a pointer to 8 bytes worth of memory, initialized to "foo/bar".

Commonly-used pools in the Apache Web server

A pool is really defined by its lifetime more than anything else. There are some static pools in http main which arepassed to various non-http main functions as arguments at opportune times. Here they are:

permanent pool never passed to anything else, this is the ancestor of all pools

pconf • subpool of permanent pool• created at the beginning of a config "cycle"; exists until the server is terminated or restarts; passed to all

config-time routines, either via cmd->pool, or as the "pool *p" argument on those which don’t take pools• passed to the module init() functions

ptemp • sorry I lie, this pool isn’t called this currently in 1.3, I renamed it this in my pthreads development. I’mreferring to the use of ptrans in the parent... contrast this with the later definition of ptrans in the child.• subpool of permanent pool• created at the beginning of a config "cycle"; exists until the end of config parsing; passed to config-time

routines via cmd->temp pool. Somewhat of a "bastard child" because it isn’t available everywhere. Usedfor temporary scratch space which may be needed by some config routines but which is deleted at the endof config.

Page 638: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

630 CHAPTER 11. DEVELOPER DOCUMENTATION

pchild • subpool of permanent pool• created when a child is spawned (or a thread is created); lives until that child (thread) is destroyed• passed to the module child init functions• destruction happens right after the child exit functions are called... (which may explain why I think

child exit is redundant and unneeded)

ptrans • should be a subpool of pchild, but currently is a subpool of permanent pool, see above• cleared by the child before going into the accept() loop to receive a connection• used as connection->pool

r->pool • for the main request this is a subpool of connection->pool; for subrequests it is a subpool of theparent request’s pool.• exists until the end of the request (i.e., ap destroy sub req, or in child main after process request has

finished)• note that r itself is allocated from r->pool; i.e., r->pool is first created and then r is the first thing palloc()d

from it

For almost everything folks do, r->pool is the pool to use. But you can see how other lifetimes, such as pchild, areuseful to some modules... such as modules that need to open a database connection once per child, and wish to cleanit up when the child dies.

You can also see how some bugs have manifested themself, such as setting connection->user to a value fromr->pool – in this case connection exists for the lifetime of ptrans, which is longer than r->pool (especially ifr->pool is a subrequest!). So the correct thing to do is to allocate from connection->pool.

And there was another interesting bug in MOD INCLUDE / MOD CGI. You’ll see in those that they do this test to decideif they should use r->pool or r->main->pool. In this case the resource that they are registering for cleanup isa child process. If it were registered in r->pool, then the code would wait() for the child when the subrequestfinishes. With MOD INCLUDE this could be any old #include, and the delay can be up to 3 seconds... and happenedquite frequently. Instead the subprocess is registered in r->main->pool which causes it to be cleaned up whenthe entire request is done – i.e., after the output has been sent to the client and logging has happened.

Tracking open files, etc.

As indicated above, resource pools are also used to track other sorts of resources besides memory. The most commonare open files. The routine which is typically used for this is ap pfopen, which takes a resource pool and two stringsas arguments; the strings are the same as the typical arguments to fopen, e.g.,

...FILE *f = ap pfopen (r->pool, r->filename, "r");

if (f == NULL) { ... } else { ... }

There is also a ap popenf routine, which parallels the lower-level open system call. Both of these routines arrangefor the file to be closed when the resource pool in question is cleared.

Unlike the case for memory, there are functions to close files allocated with ap pfopen, and ap popenf, namelyap pfclose and ap pclosef. (This is because, on many systems, the number of files which a single processcan have open is quite limited). It is important to use these functions to close files allocated with ap pfopen andap popenf, since to do otherwise could cause fatal errors on systems such as Linux, which react badly if the sameFILE* is closed more than once.

(Using the close functions is not mandatory, since the file will eventually be closed regardless, but you shouldconsider it in cases where your module is opening, or could open, a lot of files).

Page 639: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

11.2. APACHE 1.3 API NOTES 631

Other sorts of resources – cleanup functions

More text goes here. Describe the cleanup primitives in terms of which the file stuff is implemented; also,spawn process.

Pool cleanups live until clear pool() is called: clear pool(a) recursively calls destroy pool() on allsubpools of a; then calls all the cleanups for a; then releases all the memory for a. destroy pool(a) callsclear pool(a) and then releases the pool structure itself. i.e., clear pool(a) doesn’t delete a, it just frees upall the resources and you can start using it again immediately.

Fine control – creating and dealing with sub-pools, with a note on sub-requests

On rare occasions, too-free use of ap palloc() and the associated primitives may result in undesirably profligateresource allocation. You can deal with such a case by creating a sub-pool, allocating within the sub-pool rather thanthe main pool, and clearing or destroying the sub-pool, which releases the resources which were associated with it.(This really is a rare situation; the only case in which it comes up in the standard module set is in case of listingdirectories, and then only with very large directories. Unnecessary use of the primitives discussed here can hair upyour code quite a bit, with very little gain).

The primitive for creating a sub-pool is ap make sub pool, which takes another pool (the parent pool) as an argu-ment. When the main pool is cleared, the sub-pool will be destroyed. The sub-pool may also be cleared or destroyedat any time, by calling the functions ap clear pool and ap destroy pool, respectively. (The difference is thatap clear pool frees resources associated with the pool, while ap destroy pool also deallocates the pool itself.In the former case, you can allocate new resources within the pool, and clear it again, and so forth; in the latter case,it is simply gone).

One final note – sub-requests have their own resource pools, which are sub-pools of the resource pool for the mainrequest. The polite way to reclaim the resources associated with a sub request which you have allocated (using theap sub req ... functions) is ap destroy sub req, which frees the resource pool. Before calling this function,be sure to copy anything that you care about which might be allocated in the sub-request’s resource pool into someplacea little less volatile (for instance, the filename in its request rec structure).

(Again, under most circumstances, you shouldn’t feel obliged to call this function; only 2K of memory or so areallocated for a typical sub request, and it will be freed anyway when the main request pool is cleared. It is onlywhen you are allocating many, many sub-requests for a single main request that you should seriously consider theap destroy ... functions).

Configuration, commands and the like

One of the design goals for this server was to maintain external compatibility with the NCSA 1.3 server — that is,to read the same configuration files, to process all the directives therein correctly, and in general to be a drop-inreplacement for NCSA. On the other hand, another design goal was to move as much of the server’s functionality intomodules which have as little as possible to do with the monolithic server core. The only way to reconcile these goalsis to move the handling of most commands from the central server into the modules.

However, just giving the modules command tables is not enough to divorce them completely from the server core. Theserver has to remember the commands in order to act on them later. That involves maintaining data which is private tothe modules, and which can be either per-server, or per-directory. Most things are per-directory, including in particularaccess control and authorization information, but also information on how to determine file types from suffixes, whichcan be modified by ADDTYPE and DEFAULTTYPE directives, and so forth. In general, the governing philosophy isthat anything which can be made configurable by directory should be; per-server information is generally used in thestandard set of modules for information like ALIASes and REDIRECTs which come into play before the request is tiedto a particular place in the underlying file system.

Another requirement for emulating the NCSA server is being able to handle the per-directory configuration files,

Page 640: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

632 CHAPTER 11. DEVELOPER DOCUMENTATION

generally called .htaccess files, though even in the NCSA server they can contain directives which have nothing atall to do with access control. Accordingly, after URI -> filename translation, but before performing any other phase,the server walks down the directory hierarchy of the underlying filesystem, following the translated pathname, toread any .htaccess files which might be present. The information which is read in then has to be merged with theapplicable information from the server’s own config files (either from the <DIRECTORY> sections in access.conf,or from defaults in srm.conf, which actually behaves for most purposes almost exactly like <Directory />).

Finally, after having served a request which involved reading .htaccess files, we need to discard the storageallocated for handling them. That is solved the same way it is solved wherever else similar problems come up, bytying those structures to the per-transaction resource pool.

Per-directory configuration structures

Let’s look out how all of this plays out in mod mime.c, which defines the file typing handler which emulates theNCSA server’s behavior of determining file types from suffixes. What we’ll be looking at, here, is the code whichimplements the ADDTYPE and ADDENCODING commands. These commands can appear in .htaccess files, sothey must be handled in the module’s private per-directory data, which in fact, consists of two separate tables forMIME types and encoding information, and is declared as follows:

typedef struct {table *forced_types; /* Additional AddTyped stuff */table *encoding_types; /* Added with AddEncoding... */

} mime_dir_config;

When the server is reading a configuration file, or <DIRECTORY> section, which includes one of the MIME module’scommands, it needs to create a mime dir config structure, so those commands have something to act on. It doesthis by invoking the function it finds in the module’s ‘create per-dir config slot’, with two arguments: the name of thedirectory to which this configuration information applies (or NULL for srm.conf), and a pointer to a resource poolin which the allocation should happen.

(If we are reading a .htaccess file, that resource pool is the per-request resource pool for the request; otherwiseit is a resource pool which is used for configuration data, and cleared on restarts. Either way, it is important for thestructure being created to vanish when the pool is cleared, by registering a cleanup on the pool if necessary).

For the MIME module, the per-dir config creation function just ap pallocs the structure above, and a creates acouple of tables to fill it. That looks like this:

void *create mime dir config (pool *p, char *dummy){

mime dir config *new =

(mime dir config *) ap palloc (p, sizeof(mime dir config));

new->forced types = ap make table (p, 4);new->encoding types = ap make table (p, 4);

return new;

}

Now, suppose we’ve just read in a .htaccess file. We already have the per-directory configuration structure for thenext directory up in the hierarchy. If the .htaccess file we just read in didn’t have any ADDTYPE or ADDENCOD-ING commands, its per-directory config structure for the MIME module is still valid, and we can just use it. Otherwise,we need to merge the two structures somehow.

Page 641: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

11.2. APACHE 1.3 API NOTES 633

To do that, the server invokes the module’s per-directory config merge function, if one is present. That function takesthree arguments: the two structures being merged, and a resource pool in which to allocate the result. For the MIMEmodule, all that needs to be done is overlay the tables from the new per-directory config structure with those from theparent:

void *merge mime dir configs (pool *p, void *parent dirv, void

*subdirv){

mime dir config *parent dir = (mime dir config *)parent dirv;mime dir config *subdir = (mime dir config *)subdirv;mime dir config *new =

(mime dir config *)ap palloc (p, sizeof(mime dir config));

new->forced types = ap overlay tables (p, subdir->forced types,

parent dir->forced types);

new->encoding types = ap overlay tables (p, subdir->encoding types,

parent dir->encoding types);

return new;

}

As a note – if there is no per-directory merge function present, the server will just use the subdirectory’s configurationinfo, and ignore the parent’s. For some modules, that works just fine (e.g., for the includes module, whose per-directory configuration information consists solely of the state of the XBITHACK), and for those modules, you canjust not declare one, and leave the corresponding structure slot in the module itself NULL.

Command handling

Now that we have these structures, we need to be able to figure out how to fill them. That involves processing theactual ADDTYPE and ADDENCODING commands. To find commands, the server looks in the module’s commandtable. That table contains information on how many arguments the commands take, and in what formats, where it ispermitted, and so forth. That information is sufficient to allow the server to invoke most command-handling functionswith pre-parsed arguments. Without further ado, let’s look at the ADDTYPE command handler, which looks like this(the ADDENCODING command looks basically the same, and won’t be shown here):

char *add type(cmd parms *cmd, mime dir config *m, char *ct, char *ext){

if (*ext == ’.’) ++ext;ap table set (m->forced types, ext, ct);return NULL;

}

This command handler is unusually simple. As you can see, it takes four arguments, two of which are pre-parsedarguments, the third being the per-directory configuration structure for the module in question, and the fourth beinga pointer to a cmd parms structure. That structure contains a bunch of arguments which are frequently of use tosome, but not all, commands, including a resource pool (from which memory can be allocated, and to which cleanupsshould be tied), and the (virtual) server being configured, from which the module’s per-server configuration data canbe obtained if required.

Another way in which this particular command handler is unusually simple is that there are no error conditions whichit can encounter. If there were, it could return an error message instead of NULL; this causes an error to be printed out

Page 642: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

634 CHAPTER 11. DEVELOPER DOCUMENTATION

on the server’s stderr, followed by a quick exit, if it is in the main config files; for a .htaccess file, the syntaxerror is logged in the server error log (along with an indication of where it came from), and the request is bouncedwith a server error response (HTTP error status, code 500).

The MIME module’s command table has entries for these commands, which look like this:

command rec mime cmds[] = {{ "AddType", add type, NULL, OR FILEINFO, TAKE2,

"a mime type followed by a file extension" },{ "AddEncoding", add encoding, NULL, OR FILEINFO, TAKE2,

"an encoding (e.g., gzip), followed by a file extension" },{ NULL }

};

The entries in these tables are:

• The name of the command

• The function which handles it

• a (void *) pointer, which is passed in the cmd parms structure to the command handler — this is useful incase many similar commands are handled by the same function.

• A bit mask indicating where the command may appear. There are mask bits corresponding to eachAllowOverride option, and an additional mask bit, RSRC CONF, indicating that the command may appearin the server’s own config files, but not in any .htaccess file.

• A flag indicating how many arguments the command handler wants pre-parsed, and how they should be passedin. TAKE2 indicates two pre-parsed arguments. Other options are TAKE1, which indicates one pre-parsedargument, FLAG, which indicates that the argument should be On or Off, and is passed in as a boolean flag,RAW ARGS, which causes the server to give the command the raw, unparsed arguments (everything but thecommand name itself). There is also ITERATE, which means that the handler looks the same as TAKE1,but that if multiple arguments are present, it should be called multiple times, and finally ITERATE2, whichindicates that the command handler looks like a TAKE2, but if more arguments are present, then it should becalled multiple times, holding the first argument constant.

• Finally, we have a string which describes the arguments that should be present. If the arguments in the actualconfig file are not as required, this string will be used to help give a more specific error message. (You can safelyleave this NULL).

Finally, having set this all up, we have to use it. This is ultimately done in the module’s handlers, specifically for itsfile-typing handler, which looks more or less like this; note that the per-directory configuration structure is extractedfrom the request rec’s per-directory configuration vector by using the ap get module config function.

Page 643: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

11.2. APACHE 1.3 API NOTES 635

int find ct(request rec *r){

int i;char *fn = ap pstrdup (r->pool, r->filename);mime dir config *conf = (mime dir config *)

ap get module config(r->per dir config, &mime module);

char *type;

if (S ISDIR(r->finfo.st mode)) {r->content type = DIR MAGIC TYPE;return OK;

}if((i=ap rind(fn,’.’)) < 0) return DECLINED;++i;

if ((type = ap table get (conf->encoding types, &fn[i]))){

r->content encoding = type;

/* go back to previous extension to try to use it as a type */fn[i-1] = ’\0’;if((i=ap rind(fn,’.’)) < 0) return OK;++i;

}if ((type = ap table get (conf->forced types, &fn[i]))){

r->content type = type;

}return OK;

}

Side notes – per-server configuration, virtual servers, etc.

The basic ideas behind per-server module configuration are basically the same as those for per-directory configuration;there is a creation function and a merge function, the latter being invoked where a virtual server has partially overriddenthe base server configuration, and a combined structure must be computed. (As with per-directory configuration, thedefault if no merge function is specified, and a module is configured in some virtual server, is that the base configurationis simply ignored).

The only substantial difference is that when a command needs to configure the per-server private module data, it needsto go to the cmd parms data to get at it. Here’s an example, from the alias module, which also indicates how asyntax error can be returned (note that the per-directory configuration argument to the command handler is declaredas a dummy, since the module doesn’t actually have per-directory config data):

Page 644: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

636 CHAPTER 11. DEVELOPER DOCUMENTATION

char *add redirect(cmd parms *cmd, void *dummy, char *f, char *url){

server rec *s = cmd->server;alias server conf *conf = (alias server conf *)

ap get module config(s->module config,&alias module);

alias entry *new = ap push array (conf->redirects);

if (!ap is url (url)) return "Redirect to non-URL";

new->fake = f; new->real = url;return NULL;

}

Page 645: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

11.3. DEBUGGING MEMORY ALLOCATION IN APR 637

11.3 Debugging Memory Allocation in APR

The allocation mechanism’s within APR have a number of debugging modes that can be used to assist in findingmemory problems. This document describes the modes available and gives instructions on activating them.

Available debugging options

Allocation Debugging - ALLOC DEBUG

=⇒Debugging support: Define this to enable code which helps detect re-use of free()d memoryand other such nonsense.

The theory is simple. The FILL BYTE (0xa5) is written over all malloc’d memory as we receive it, and is writ-ten over everything that we free up during a clear pool. We check that blocks on the free list always have theFILL BYTE in them, and we check during palloc() that the bytes still have FILL BYTE in them. If you eversee garbage URLs or whatnot containing lots of 0xa5s then you know something used data that’s been freed oruninitialized.

Malloc Support - ALLOC USE MALLOC

=⇒If defined all allocations will be done with malloc() and free()d appropriately at the end.

This is intended to be used with something like Electric Fence or Purify to help detect memory problems. Note thatif you’re using efence then you should also add in ALLOC DEBUG. But don’t add in ALLOC DEBUG if you’re usingPurify because ALLOC DEBUG would hide all the uninitialized read errors that Purify can diagnose.

Pool Debugging - POOL DEBUG

=⇒This is intended to detect cases where the wrong pool is used when assigning data to an objectin another pool.

In particular, it causes the table {set,add,merge}n routines to check that their arguments are safe for theapr table t they’re being placed in. It currently only works with the unix multiprocess model, but could beextended to others.

Table Debugging - MAKE TABLE PROFILE

=⇒Provide diagnostic information about make table() calls which are possibly too small.

This requires a recent gcc which supports builtin return address(). The error log output will be a messagesuch as:

table push: apr table t created by 0x804d874 hit limit of 10

Use l *0x804d874 to find the source that corresponds to. It indicates that a apr table t allocated by a call atthat address has possibly too small an initial apr table t size guess.

Page 646: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

638 CHAPTER 11. DEVELOPER DOCUMENTATION

Allocation Statistics - ALLOC STATS

=⇒Provide some statistics on the cost of allocations.

This requires a bit of an understanding of how alloc.c works.

Allowable Combinations

Not all the options outlined above can be activated at the same time. the following table gives more information.

ALLOC DEBUG ALLOC USEMALLOC

POOL DEBUG MAKE TABLEPROFILE

ALLOC STATS

ALLOC DEBUG - No Yes Yes YesALLOC USEMALLOC

No - No No No

POOL DEBUG Yes No - Yes YesMAKE TABLEPROFILE

Yes No Yes - Yes

ALLOC STATS Yes No Yes Yes -

Additionally the debugging options are not suitable for multi-threaded versions of the server. When trying to debugwith these options the server should be started in single process mode.

Activating Debugging Options

The various options for debugging memory are now enabled in the apr general.h header file in APR. The variousoptions are enabled by uncommenting the define for the option you wish to use. The section of the code currentlylooks like this (contained in srclib/apr/include/apr pools.h)

Page 647: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

11.3. DEBUGGING MEMORY ALLOCATION IN APR 639

/*#define ALLOC DEBUG#define POOL DEBUG#define ALLOC USE MALLOC#define MAKE TABLE PROFILE#define ALLOC STATS/

typedef struct ap pool t {union block hdr *first;union block hdr *last;struct cleanup *cleanups;struct process chain *subprocesses;struct ap pool t *sub pools;struct ap pool t *sub next;struct ap pool t *sub prev;struct ap pool t *parent;char *free first avail;

#ifdef ALLOC USE MALLOC

void *allocation list;

#endif#ifdef POOL DEBUG

struct ap pool t *joined;

#endif

int (*apr abort)(int retcode);struct datastruct *prog data;

} ap pool t;

To enable allocation debugging simply move the #define ALLOC DEBUG above the start of the comments blockand rebuild the server.

=⇒NoteIn order to use the various options the server must be rebuilt after editing the header file.

Page 648: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

640 CHAPTER 11. DEVELOPER DOCUMENTATION

11.4 Documenting Apache 2.0

Apache 2.0 uses Doxygen7 to document the APIs and global variables in the code. This will explain the basics of howto document using Doxygen.

Brief Description

To start a documentation block, use /**To end a documentation block, use */

In the middle of the block, there are multiple tags we can use:

Description of this functions purpose@param parameter name description@return description

@deffunc signature of the function

The deffunc is not always necessary. DoxyGen does not have a full parser in it, so any prototype that use a macroin the return type declaration is too complex for scandoc. Those functions require a deffunc. An example (using&gt; rather than >):

/*** return the final element of the pathname

* @param pathname The path to get the final element of

* @return the final element of the path

* @tip Examples:

* <pre>

* "/foo/bar/gum" -&gt; "gum"

* "/foo/bar/gum/" -&gt; ""

* "gum" -&gt; "gum"

* "wi\\n32\\stuff" -&gt; "stuff"

* </pre>

* @deffunc const char * ap filename of pathname(const char *pathname)

*/

At the top of the header file, always include:

/*** @package Name of library header

*/

Doxygen uses a new HTML file for each package. The HTML files are named {Name of library header}.html, so tryto be concise with your names.

For a further discussion of the possibilities please refer to the Doxygen site8.

7http://www.doxygen.org/8http://www.doxygen.org/

Page 649: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

11.5. APACHE 2.0 HOOK FUNCTIONS 641

11.5 Apache 2.0 Hook Functions

! WarningThis document is still in development and may be partially out of date.

In general, a hook function is one that Apache will call at some point during the processing of a request. Modules canprovide functions that are called, and specify when they get called in comparison to other modules.

Creating a hook function

In order to create a new hook, four things need to be done:

Declare the hook function

Use the AP DECLARE HOOK macro, which needs to be given the return type of the hook function, the name of thehook, and the arguments. For example, if the hook returns an int and takes a request rec * and an int and iscalled do something, then declare it like this:

AP DECLARE HOOK(int, do something, (request rec *r, int n))

This should go in a header which modules will include if they want to use the hook.

Create the hook structure

Each source file that exports a hook has a private structure which is used to record the module functions that use thehook. This is declared as follows:

APR HOOK STRUCT(

APR HOOK LINK(do something)...

)

Implement the hook caller

The source file that exports the hook has to implement a function that will call the hook. There are currently threepossible ways to do this. In all cases, the calling function is called ap run hookname().

Void hooks

If the return value of a hook is void, then all the hooks are called, and the caller is implemented like this:

AP IMPLEMENT HOOK VOID(do something, (request rec *r, int n), (r, n))

The second and third arguments are the dummy argument declaration and the dummy arguments as they will be usedwhen calling the hook. In other words, this macro expands to something like this:

Page 650: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

642 CHAPTER 11. DEVELOPER DOCUMENTATION

void ap run do something(request rec *r, int n){

...do something(r, n);

}

Hooks that return a value

If the hook returns a value, then it can either be run until the first hook that does something interesting, like so:

AP IMPLEMENT HOOK RUN FIRST(int, do something, (request rec *r, int n),

(r, n), DECLINED)

The first hook that does not return DECLINED stops the loop and its return value is returned from the hook caller.Note that DECLINED is the tradition Apache hook return meaning "I didn’t do anything", but it can be whatever suitsyou.

Alternatively, all hooks can be run until an error occurs. This boils down to permitting two return values, one of whichmeans "I did something, and it was OK" and the other meaning "I did nothing". The first function that returns avalue other than one of those two stops the loop, and its return is the return value. Declare these like so:

AP IMPLEMENT HOOK RUN ALL(int, do something, (request rec *r, int n),

(r, n), OK, DECLINED)

Again, OK and DECLINED are the traditional values. You can use what you want.

Call the hook callers

At appropriate moments in the code, call the hook caller, like so:

int n, ret;request rec *r;

ret=ap run do something(r, n);

Hooking the hook

A module that wants a hook to be called needs to do two things.

Implement the hook function

Include the appropriate header, and define a static function of the correct type:

static int my something doer(request rec *r, int n){

...return OK;

}

Page 651: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

11.5. APACHE 2.0 HOOK FUNCTIONS 643

Add a hook registering function

During initialisation, Apache will call each modules hook registering function, which is included in the module struc-ture:

static void my register hooks(){

ap hook do something(my something doer, NULL, NULL, HOOK MIDDLE);

}mode MODULE VAR EXPORT my module ={

...my register hooks /* register hooks */

};

Controlling hook calling order

In the example above, we didn’t use the three arguments in the hook registration function that control calling order.There are two mechanisms for doing this. The first, rather crude, method, allows us to specify roughly where thehook is run relative to other modules. The final argument control this. There are three possible values: HOOK FIRST,HOOK MIDDLE and HOOK LAST.

All modules using any particular value may be run in any order relative to each other, but, of course, all modules usingHOOK FIRST will be run before HOOK MIDDLE which are before HOOK LAST. Modules that don’t care when theyare run should use HOOK MIDDLE. (I spaced these out so people could do stuff like HOOK FIRST-2 to get in slightlyearlier, but is this wise? - Ben)

Note that there are two more values, HOOK REALLY FIRST and HOOK REALLY LAST. These should only be usedby the hook exporter.

The other method allows finer control. When a module knows that it must be run before (or after) some other modules,it can specify them by name. The second (third) argument is a NULL-terminated array of strings consisting of thenames of modules that must be run before (after) the current module. For example, suppose we want "mod xyz.c"and "mod abc.c" to run before we do, then we’d hook as follows:

static void register hooks(){

static const char * const aszPre[] = { "mod xyz.c", "mod abc.c",NULL };ap hook do something(my something doer, aszPre, NULL, HOOK MIDDLE);

}

Note that the sort used to achieve this is stable, so ordering set by HOOK ORDER is preserved, as far as is possible.

Ben Laurie, 15th August 1999

Page 652: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

644 CHAPTER 11. DEVELOPER DOCUMENTATION

11.6 Converting Modules from Apache 1.3 to Apache 2.0

This is a first attempt at writing the lessons I learned when trying to convert the mod mmap static module toApache 2.0. It’s by no means definitive and probably won’t even be correct in some ways, but it’s a start.

The easier changes ...

Cleanup Routines

These now need to be of type apr status t and return a value of that type. Normally the return value will beAPR SUCCESS unless there is some need to signal an error in the cleanup. Be aware that even though you signal anerror not all code yet checks and acts upon the error.

Initialisation Routines

These should now be renamed to better signify where they sit in the overall process. So the name gets a small changefrom mmap init to mmap post config. The arguments passed have undergone a radical change and now looklike

• apr pool t *p

• apr pool t *plog

• apr pool t *ptemp

• server rec *s

Data Types

A lot of the data types have been moved into the APR9. This means that some have had a name change, such as theone shown above. The following is a brief list of some of the changes that you are likely to have to make.

• pool becomes apr pool t

• table becomes apr table t

The messier changes...

Register Hooks

The new architecture uses a series of hooks to provide for calling your functions. These you’ll need to add to yourmodule by way of a new function, static void register hooks(void). The function is really reasonablystraightforward once you understand what needs to be done. Each function that needs calling at some stage in theprocessing of a request needs to be registered, handlers do not. There are a number of phases where functions can beadded, and for each you can specify with a high degree of control the relative order that the function will be called in.

This is the code that was added to mod mmap static:

9http://apr.apache.org/

Page 653: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

11.6. CONVERTING MODULES FROM APACHE 1.3 TO APACHE 2.0 645

static void register_hooks(void){

static const char * const aszPre[]={ "http_core.c",NULL };ap_hook_post_config(mmap_post_config,NULL,NULL,HOOK_MIDDLE);ap_hook_translate_name(mmap_static_xlat,aszPre,NULL,HOOK_LAST);

};

This registers 2 functions that need to be called, one in the post config stage (virtually every module will needthis one) and one for the translate name phase. note that while there are different function names the format ofeach is identical. So what is the format?

ap hook phase name(function name, predecessors, successors, position);

There are 3 hook positions defined...

• HOOK FIRST

• HOOK MIDDLE

• HOOK LAST

To define the position you use the position and then modify it with the predecessors and successors. Each of themodifiers can be a list of functions that should be called, either before the function is run (predecessors) or after thefunction has run (successors).

In the mod mmap static case I didn’t care about the post config stage, but the mmap static xlat mustbe called after the core module had done it’s name translation, hence the use of the aszPre to define a modifier to theposition HOOK LAST.

Module Definition

There are now a lot fewer stages to worry about when creating your module definition. The old defintion looked like

module MODULE_VAR_EXPORT module_name_module ={

STANDARD_MODULE_STUFF,/* initializer *//* dir config creater *//* dir merger --- default is to override *//* server config *//* merge server config *//* command handlers *//* handlers *//* filename translation *//* check_user_id *//* check auth *//* check access *//* type_checker *//* fixups *//* logger *//* header parser *//* child_init *//* child_exit *//* post read-request */

};

Page 654: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

646 CHAPTER 11. DEVELOPER DOCUMENTATION

The new structure is a great deal simpler...

module MODULE_VAR_EXPORT module_name_module ={

STANDARD20_MODULE_STUFF,/* create per-directory config structures *//* merge per-directory config structures *//* create per-server config structures *//* merge per-server config structures *//* command handlers *//* handlers *//* register hooks */

};

Some of these read directly across, some don’t. I’ll try to summarise what should be done below.

The stages that read directly across :

/* dir config creater */ /* create per-directory config structures */

/* server config */ /* create per-server config structures */

/* dir merger */ /* merge per-directory config structures */

/* merge server config */ /* merge per-server config structures */

/* command table */ /* command apr table t */

/* handlers */ /* handlers */

The remainder of the old functions should be registered as hooks. There are the following hook stages defined so far...

ap hook post config this is where the old init routines get registered

ap hook http method retrieve the http method from a request. (legacy)

ap hook open logs open any specified logs

ap hook auth checker check if the resource requires authorization

ap hook access checker check for module-specific restrictions

ap hook check user id check the user-id and password

ap hook default port retrieve the default port for the server

ap hook pre connection do any setup required just before processing, but after accepting

ap hook process connection run the correct protocol

ap hook child init call as soon as the child is started

ap hook create request ??

ap hook fixups last chance to modify things before generating content

ap hook handler generate the content

ap hook header parser lets modules look at the headers, not used by most modules, because they usepost read request for this

Page 655: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

11.6. CONVERTING MODULES FROM APACHE 1.3 TO APACHE 2.0 647

ap hook insert filter to insert filters into the filter chain

ap hook log transaction log information about the request

ap hook optional fn retrieve retrieve any functions registered as optional

ap hook post read request called after reading the request, before any other phase

ap hook quick handler called before any request processing, used by cache modules.

ap hook translate name translate the URI into a filename

ap hook type checker determine and/or set the doc type

Page 656: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

648 CHAPTER 11. DEVELOPER DOCUMENTATION

11.7 Request Processing in Apache 2.0

! WarningWarning - this is a first (fast) draft that needs further revision!

Several changes in Apache 2.0 affect the internal request processing mechanics. Module authors need to be aware ofthese changes so they may take advantage of the optimizations and security enhancements.

The first major change is to the subrequest and redirect mechanisms. There were a number of different code paths inApache 1.3 to attempt to optimize subrequest or redirect behavior. As patches were introduced to 2.0, these optimiza-tions (and the server behavior) were quickly broken due to this duplication of code. All duplicate code has been foldedback into ap process request internal() to prevent the code from falling out of sync again.

This means that much of the existing code was ’unoptimized’. It is the Apache HTTP Project’s first goal to cre-ate a robust and correct implementation of the HTTP server RFC. Additional goals include security, scalability andoptimization. New methods were sought to optimize the server (beyond the performance of Apache 1.3) withoutintroducing fragile or insecure code.

The Request Processing Cycle

All requests pass through ap process request internal() in request.c, including subrequests and redi-rects. If a module doesn’t pass generated requests through this code, the author is cautioned that the module may bebroken by future changes to request processing.

To streamline requests, the module author can take advantage of the hooks offered to drop out of the request cycleearly, or to bypass core Apache hooks which are irrelevant (and costly in terms of CPU.)

The Request Parsing Phase

Unescapes the URL

The request’s parsed uri path is unescaped, once and only once, at the beginning of internal request processing.

This step is bypassed if the proxyreq flag is set, or the parsed uri.path element is unset. The module has nofurther control of this one-time unescape operation, either failing to unescape or multiply unescaping the URL leadsto security reprecussions.

Strips Parent and This Elements from the URI

All /../ and /./ elements are removed by ap getparents(). This helps to ensure the path is (nearly) absolutebefore the request processing continues.

This step cannot be bypassed.

Initial URI Location Walk

Every request is subject to an ap location walk() call. This ensures that <LOCATION> sections are consis-tently enforced for all requests. If the request is an internal redirect or a sub-request, it may borrow some or all ofthe processing from the previous or parent request’s ap location walk, so this step is generally very efficient afterprocessing the main request.

Page 657: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

11.7. REQUEST PROCESSING IN APACHE 2.0 649

translate name

Modules can determine the file name, or alter the given URI in this step. For example, MOD VHOST ALIAS willtranslate the URI’s path into the configured virtual host, MOD ALIAS will translate the path to an alias path, and if therequest falls back on the core, the DOCUMENTROOT is prepended to the request resource.

If all modules DECLINE this phase, an error 500 is returned to the browser, and a "couldn’t translate name" error islogged automatically.

Hook: map to storage

After the file or correct URI was determined, the appropriate per-dir configurations are merged together. For example,MOD PROXY compares and merges the appropriate <PROXY> sections. If the URI is nothing more than a local(non-proxy) TRACE request, the core handles the request and returns DONE. If no module answers this hook with OKor DONE, the core will run the request filename against the <DIRECTORY> and <FILES> sections. If the request’filename’ isn’t an absolute, legal filename, a note is set for later termination.

URI Location Walk

Every request is hardened by a second ap location walk() call. This reassures that a translated request is stillsubjected to the configured <LOCATION> sections. The request again borrows some or all of the processing from itsprevious location walk above, so this step is almost always very efficient unless the translated URI mapped to asubstantially different path or Virtual Host.

Hook: header parser

The main request then parses the client’s headers. This prepares the remaining request processing steps to better servethe client’s request.

The Security Phase

Needs Documentation. Code is:

Page 658: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

650 CHAPTER 11. DEVELOPER DOCUMENTATION

switch (ap_satisfies(r)) {case SATISFY_ALL:case SATISFY_NOSPEC:

if ((access_status = ap_run_access_checker(r)) != 0) {return decl_die(access_status, "check access", r);

}

if (ap_some_auth_required(r)) {if (((access_status = ap_run_check_user_id(r)) != 0)

|| !ap_auth_type(r)) {return decl_die(access_status, ap_auth_type(r)

? "check user. No user file?": "perform authentication. AuthType not set!",r);

}

if (((access_status = ap_run_auth_checker(r)) != 0)|| !ap_auth_type(r)) {return decl_die(access_status, ap_auth_type(r)

? "check access. No groups file?": "perform authentication. AuthType not set!",r);

}}break;

case SATISFY_ANY:if (((access_status = ap_run_access_checker(r)) != 0)) {

if (!ap_some_auth_required(r)) {return decl_die(access_status, "check access", r);

}

if (((access_status = ap_run_check_user_id(r)) != 0)|| !ap_auth_type(r)) {return decl_die(access_status, ap_auth_type(r)

? "check user. No user file?": "perform authentication. AuthType not set!",r);

}

if (((access_status = ap_run_auth_checker(r)) != 0)|| !ap_auth_type(r)) {return decl_die(access_status, ap_auth_type(r)

? "check access. No groups file?": "perform authentication. AuthType not set!",r);

}}break;

}

Page 659: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

11.7. REQUEST PROCESSING IN APACHE 2.0 651

The Preparation Phase

Hook: type checker

The modules have an opportunity to test the URI or filename against the target resource, and set mime informationfor the request. Both MOD MIME and MOD MIME MAGIC use this phase to compare the file name or contents againstthe administrator’s configuration and set the content type, language, character set and request handler. Some modulesmay set up their filters or other request handling parameters at this time.

If all modules DECLINE this phase, an error 500 is returned to the browser, and a "couldn’t find types" error is loggedautomatically.

Hook: fixups

Many modules are ’trounced’ by some phase above. The fixups phase is used by modules to ’reassert’ their ownershipor force the request’s fields to their appropriate values. It isn’t always the cleanest mechanism, but occasionally it’sthe only option.

The Handler Phase

This phase is not part of the processing in ap process request internal(). Many modules pre-pare one or more subrequests prior to creating any content at all. After the core, or a module callsap process request internal() it then calls ap invoke handler() to generate the request.

Hook: insert filter

Modules that transform the content in some way can insert their values and override existing filters, such that if theuser configured a more advanced filter out-of-order, then the module can move its order as need be. There is no resultcode, so actions in this hook better be trusted to always succeed.

Hook: handler

The module finally has a chance to serve the request in its handler hook. Note that not every prepared request is sent tothe handler hook. Many modules, such as MOD AUTOINDEX, will create subrequests for a given URI, and then neverserve the subrequest, but simply lists it for the user. Remember not to put required teardown from the hooks aboveinto this module, but register pool cleanups against the request pool to free resources as required.

Page 660: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

652 CHAPTER 11. DEVELOPER DOCUMENTATION

11.8 How filters work in Apache 2.0

! WarningThis is a cut ’n paste job from an email (<022501c1c529$f63a9550$7f00000a@KOJ>) andonly reformatted for better readability. It’s not up to date but may be a good start for furtherresearch.

Filter Types

There are three basic filter types (each of these is actually broken down into two categories, but that comes later).

CONNECTION Filters of this type are valid for the lifetime of this connection. (AP FTYPE CONNECTION,AP FTYPE NETWORK)

PROTOCOL Filters of this type are valid for the lifetime of this request from the point of view of the client, thismeans that the request is valid from the time that the request is sent until the time that the response is received.(AP FTYPE PROTOCOL, AP FTYPE TRANSCODE)

RESOURCE Filters of this type are valid for the time that this content is used to satisfy a request. For simple requests,this is identical to PROTOCOL, but internal redirects and sub-requests can change the content without endingthe request. (AP FTYPE RESOURCE, AP FTYPE CONTENT SET)

It is important to make the distinction between a protocol and a resource filter. A resource filter is tied to a specificresource, it may also be tied to header information, but the main binding is to a resource. If you are writing a filter andyou want to know if it is resource or protocol, the correct question to ask is: "Can this filter be removed if the requestis redirected to a different resource?" If the answer is yes, then it is a resource filter. If it is no, then it is most likelya protocol or connection filter. I won’t go into connection filters, because they seem to be well understood. With thisdefinition, a few examples might help:

Byterange We have coded it to be inserted for all requests, and it is removed if not used. Because this filter is activeat the beginning of all requests, it can not be removed if it is redirected, so this is a protocol filter.

http header This filter actually writes the headers to the network. This is obviously a required filter (except in theasis case which is special and will be dealt with below) and so it is a protocol filter.

Deflate The administrator configures this filter based on which file has been requested. If we do an internal redirectfrom an autoindex page to an index.html page, the deflate filter may be added or removed based on config, sothis is a resource filter.

The further breakdown of each category into two more filter types is strictly for ordering. We could remove it, andonly allow for one filter type, but the order would tend to be wrong, and we would need to hack things to make it work.Currently, the RESOURCE filters only have one filter type, but that should change.

How are filters inserted?

This is actually rather simple in theory, but the code is complex. First of all, it is important thateverybody realize that there are three filter lists for each request, but they are all concatenated to-gether. So, the first list is r->output filters, then r->proto output filters, and finallyr->connection->output filters. These correspond to the RESOURCE, PROTOCOL, and CONNECTIONfilters respectively. The problem previously, was that we used a singly linked list to create the filter stack, andwe started from the "correct" location. This means that if I had a RESOURCE filter on the stack, and I added a

Page 661: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

11.8. HOW FILTERS WORK IN APACHE 2.0 653

CONNECTION filter, the CONNECTION filter would be ignored. This should make sense, because we would insert theconnection filter at the top of the c->output filters list, but the end of r->output filters pointed to thefilter that used to be at the front of c->output filters. This is obviously wrong. The new insertion code usesa doubly linked list. This has the advantage that we never lose a filter that has been inserted. Unfortunately, it comeswith a separate set of headaches.

The problem is that we have two different cases were we use subrequests. The first is to insert more data into aresponse. The second is to replace the existing response with an internal redirect. These are two different cases andneed to be treated as such.

In the first case, we are creating the subrequest from within a handler or filter. This means that the next filter shouldbe passed to make sub request function, and the last resource filter in the sub-request will point to the next filterin the main request. This makes sense, because the sub-request’s data needs to flow through the same set of filters asthe main request. A graphical representation might help:

Default_handler --> includes_filter --> byterange --> ...

If the includes filter creates a sub request, then we don’t want the data from that sub-request to go through the includesfilter, because it might not be SSI data. So, the subrequest adds the following:

Default_handler --> includes_filter -/-> byterange --> .../

Default_handler --> sub_request_core

What happens if the subrequest is SSI data? Well, that’s easy, the includes filter is a resource filter, so it willbe added to the sub request in between the Default handler and the sub request core filter.

The second case for sub-requests is when one sub-request is going to become the real request. This happens whenevera sub-request is created outside of a handler or filter, and NULL is passed as the next filter to the make sub requestfunction.

In this case, the resource filters no longer make sense for the new request, because the resource has changed. So,instead of starting from scratch, we simply point the front of the resource filters for the sub-request to the front of theprotocol filters for the old request. This means that we won’t lose any of the protocol filters, neither will we try to sendthis data through a filter that shouldn’t see it.

The problem is that we are using a doubly-linked list for our filter stacks now. But, you should notice that it is possiblefor two lists to intersect in this model. So, you do you handle the previous pointer? This is a very difficult questionto answer, because there is no "right" answer, either method is equally valid. I looked at why we use the previouspointer. The only reason for it is to allow for easier addition of new servers. With that being said, the solution I chosewas to make the previous pointer always stay on the original request.

This causes some more complex logic, but it works for all cases. My concern in having it move to the sub-request, isthat for the more common case (where a sub-request is used to add data to a response), the main filter chain would bewrong. That didn’t seem like a good idea to me.

Asis

The final topic. :-) Mod Asis is a bit of a hack, but the handler needs to remove all filters except for connection filters,and send the data. If you are using MOD ASIS, all other bets are off.

Page 662: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

654 CHAPTER 11. DEVELOPER DOCUMENTATION

Explanations

The absolutely last point is that the reason this code was so hard to get right, was because we had hacked so muchto force it to work. I wrote most of the hacks originally, so I am very much to blame. However, now that thecode is right, I have started to remove some hacks. Most people should have seen that the reset filters andadd required filters functions are gone. Those inserted protocol level filters for error conditions, in fact, bothfunctions did the same thing, one after the other, it was really strange. Because we don’t lose protocol filters forerror cases any more, those hacks went away. The HTTP HEADER, Content-length, and Byterange filters areall added in the insert filters phase, because if they were added earlier, we had some interesting interactions.Now, those could all be moved to be inserted with the HTTP IN, CORE, and CORE IN filters. That would make thecode easier to follow.

Page 663: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

Chapter 12

Glossary and Index

655

Page 664: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

656 CHAPTER 12. GLOSSARY AND INDEX

12.1 Glossary

This glossary defines some of the common terminology related to Apache in particular, and web serving in general.More information on each concept is provided in the links.

Definitions

Access Control The restriction of access to network realms. In an Apache context usually the restriction of access tocertain URLs.See: Authentication, Authorization, and Access Control (p. 181)

Algorithm An unambiguous formula or set of rules for solving a problem in a finite number of steps. Algorithms forencryption are usually called Ciphers.

APache eXtension Tool (apxs) A perl script that aids in compiling module sources into Dynamic Shared Objects(DSOs) and helps install them in the Apache Web server.See: Manual Page: apxs

Authentication The positive identification of a network entity such as a server, a client, or a user.See: Authentication, Authorization, and Access Control (p. 181)

Certificate A data record used for authenticating network entities such as a server or a client. A certificate containsX.509 information pieces about its owner (called the subject) and the signing Certification Authority (called theissuer), plus the owner’s public key and the signature made by the CA. Network entities verify these signaturesusing CA certificates.See: SSL/TLS Encryption (p. 146)

Certificate Signing Request (CSR) An unsigned certificate for submission to a Certification Authority, which signsit with the Private Key of their CA Certificate. Once the CSR is signed, it becomes a real certificate.See: SSL/TLS Encryption (p. 146)

Certification Authority (CA) A trusted third party whose purpose is to sign certificates for network entities it hasauthenticated using secure means. Other network entities can check the signature to verify that a CA hasauthenticated the bearer of a certificate.See: SSL/TLS Encryption (p. 146)

Cipher An algorithm or system for data encryption. Examples are DES, IDEA, RC4, etc.See: SSL/TLS Encryption (p. 146)

Ciphertext The result after Plaintext is passed through a Cipher.See: SSL/TLS Encryption (p. 146)

Common Gateway Interface (CGI) A standard definition for an interface between a web server and an externalprogram that allows the external program to service requests. The interface was originally defined by NCSA1

but there is also an RFC project2.See: Dynamic Content with CGI (p. 185)

Configuration Directive See: Directive

Configuration File A text file containing Directives that control the configuration of Apache.See: Configuration Files (p. 19)

CONNECT An HTTP method for proxying raw data channels over HTTP. It can be used to encapsulate other proto-cols, such as the SSL protocol.

1http://hoohoo.ncsa.uiuc.edu/cgi/overview.html2http://cgi-spec.golux.com/

Page 665: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

12.1. GLOSSARY 657

Context An area in the configuration files where certain types of directives are allowed.See: Terms Used to Describe Apache Directives (p. 299)

Digital Signature An encrypted text block that validates a certificate or other file. A Certification Authority createsa signature by generating a hash of the Public Key embedded in a Certificate, then encrypting the hash with itsown Private Key. Only the CA’s public key can decrypt the signature, verifying that the CA has authenticatedthe network entity that owns the Certificate.See: SSL/TLS Encryption (p. 146)

Directive A configuration command that controls one or more aspects of Apache’s behavior. Directives are placed inthe Configuration FileSee: Directive Index (p. 663)

Dynamic Shared Object (DSO) Modules compiled separately from the Apache httpd binary that can be loadedon-demand.See: Dynamic Shared Object Support (p. 44)

Environment Variable (env-variable) Named variables managed by the operating system shell and used to storeinformation and communicate between programs. Apache also contains internal variables that are referred to asenvironment variables, but are stored in internal Apache structures, rather than in the shell environment.See: Environment Variables in Apache (p. 60)

Export-Crippled Diminished in cryptographic strength (and security) in order to comply with the United States’Export Administration Regulations (EAR). Export-crippled cryptographic software is limited to a small keysize, resulting in Ciphertext which usually can be decrypted by brute force.See: SSL/TLS Encryption (p. 146)

Filter A process that is applied to data that is sent or received by the server. Input filters process data sent by theclient to the server, while output filters process documents on the server before they are sent to the client. Forexample, the INCLUDES output filter processes documents for Server Side Includes.See: Filters (p. 67)

Fully-Qualified Domain-Name (FQDN) The unique name of a network entity, consisting of a hostname and a do-main name that can resolve to an IP address. For example, www is a hostname, example.com is a domainname, and www.example.com is a fully-qualified domain name.

Handler An internal Apache representation of the action to be performed when a file is called. Generally, files haveimplicit handlers, based on the file type. Normally, all files are simply served by the server, but certain file typesare "handled" separately. For example, the cgi-script handler designates files to be processed as CGIs.See: Apache’s Handler Use (p. 65)

Hash A mathematical one-way, irreversable algorithm generating a string with fixed-length from another string ofany length. Different input strings will usually produce different hashes (depending on the hash function).

Header The part of the HTTP request and response that is sent before the actual content, and that contains meta-information describing the content.

.htaccess A configuration file that is placed inside the web tree and applies configuration directives to the directorywhere it is placed and all sub-directories. Despite its name, this file can hold almost any type of directive, notjust access-control directives.See: Configuration Files (p. 19)

httpd.conf The main Apache configuration file. The default location is/usr/local/apache2/conf/httpd.conf, but it may be moved using run-time or compile-time configuration.See: Configuration Files (p. 19)

Page 666: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

658 CHAPTER 12. GLOSSARY AND INDEX

HyperText Transfer Protocol (HTTP) The standard transmission protocol used on the World Wide Web. Apacheimplements version 1.1 of the protocol, referred to as HTTP/1.1 and defined by RFC 26163.

HTTPS The HyperText Transfer Protocol (Secure), the standard encrypted communication mechanism on the WorldWide Web. This is actually just HTTP over SSL.See: SSL/TLS Encryption (p. 146)

Method In the context of HTTP, an action to perform on a resource, specified on the request line by the client. Someof the methods available in HTTP are GET, POST, and PUT.

Message Digest A hash of a message, which can be used to verify that the contents of the message have not beenaltered in transit.See: SSL/TLS Encryption (p. 146)

MIME-type A way to describe the kind of document being transmitted. Its name comes from that fact that its formatis borrowed from the Multipurpose Internet Mail Extensions. It consists of a major type and a minor type,separated by a slash. Some examples are text/html, image/gif, and application/octet-stream.In HTTP, the MIME-type is transmitted in the Content-Type header.See: mod mime (p. 483)

Module An independent part of a program. Much of Apache’s functionality is contained in modules that you canchoose to include or exclude. Modules that are compiled into the Apache httpd binary are called staticmodules, while modules that are stored separately and can be optionally loaded at run-time are called dynamicmodules or DSOs. Modules that are included by default are called base modules. Many modules are availablefor Apache that are not distributed as part of the Apache HTTP Server tarball. These are referred to as third-party modules.See: Module Index (p. 660)

Module Magic Number (MMN) Module Magic Number is a constant defined in the Apache source code that isassociated with binary compatibility of modules. It is changed when internal Apache structures, function callsand other significant parts of API change in such a way that binary compatibility cannot be guaranteed any more.On MMN change, all third party modules have to be at least recompiled, sometimes even slightly changed inorder to work with the new version of Apache.

OpenSSL The Open Source toolkit for SSL/TLSSee http://www.openssl.org/#

Pass Phrase The word or phrase that protects private key files. It prevents unauthorized users from encrypting them.Usually it’s just the secret encryption/decryption key used for Ciphers.See: SSL/TLS Encryption (p. 146)

Plaintext The unencrypted text.

Private Key The secret key in a Public Key Cryptography system, used to decrypt incoming messages and signoutgoing ones.See: SSL/TLS Encryption (p. 146)

Proxy An intermediate server that sits between the client and the origin server. It accepts requests from clients,transmits those requests on to the origin server, and then returns the response from the origin server to theclient. If several clients request the same content, the proxy can deliver that content from its cache, rather thanrequesting it from the origin server each time, thereby reducing response time.See: mod proxy (p. 504)

Public Key The publicly available key in a Public Key Cryptography system, used to encrypt messages bound for itsowner and to decrypt signatures made by its owner.See: SSL/TLS Encryption (p. 146)

3http://ietf.org/rfc/rfc2616.txt

Page 667: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

12.1. GLOSSARY 659

Public Key Cryptography The study and application of asymmetric encryption systems, which use one key for en-cryption and another for decryption. A corresponding pair of such keys constitutes a key pair. Also calledAsymmetric Cryptography.See: SSL/TLS Encryption (p. 146)

Regular Expression (Regex) A way of describing a pattern in text - for example, "all the words that begin with theletter A" or "every 10-digit phone number" or even "Every sentence with two commas in it, and no capital letterQ". Regular expressions are useful in Apache because they let you apply certain attributes against collections offiles or resources in very flexible ways - for example, all .gif and .jpg files under any "images" directory couldbe written as "/images/.*(jpg|gif)$". Apache uses Perl Compatible Regular Expressions provided bythe PCRE4 library.

Reverse Proxy A proxy server that appears to the client as if it is an origin server. This is useful to hide the realorigin server from the client for security reasons, or to load balance.

Secure Sockets Layer (SSL) A protocol created by Netscape Communications Corporation for general communica-tion authentication and encryption over TCP/IP networks. The most popular usage is HTTPS, i.e. the HyperTextTransfer Protocol (HTTP) over SSL.See: SSL/TLS Encryption (p. 146)

Server Side Includes (SSI) A technique for embedding processing directives inside HTML files.See: Introduction to Server Side Includes (p. 191)

Session The context information of a communication in general.

SSLeay The original SSL/TLS implementation library developed by Eric A. Young

Symmetric Cryptography The study and application of Ciphers that use a single secret key for both encryption anddecryption operations.See: SSL/TLS Encryption (p. 146)

Tarball A package of files gathered together using the tar utility. Apache distributions are stored in compressed tararchives or using pkzip.

Transport Layer Security (TLS) The successor protocol to SSL, created by the Internet Engineering Task Force(IETF) for general communication authentication and encryption over TCP/IP networks. TLS version 1 isnearly identical with SSL version 3.See: SSL/TLS Encryption (p. 146)

Uniform Resource Locator (URL) The name/address of a resource on the Internet. This is the com-mon informal term for what is formally called a Uniform Resource Identifier. URLs are usuallymade up of a scheme, like http or https, a hostname, and a path. A URL for this page ishttp://httpd.apache.org/docs/2.0/glossary.html.

Uniform Resource Identifier (URI) A compact string of characters for identifying an abstract or physical resource.It is formally defined by RFC 23965. URIs used on the world-wide web are commonly referred to as URLs.

Virtual Hosting Serving multiple websites using a single instance of Apache. IP virtual hosting differentiates be-tween websites based on their IP address, while name-based virtual hosting uses only the name of the host andcan therefore host many sites on the same IP address.See: Apache Virtual Host documentation (p. 110)

X.509 An authentication certificate scheme recommended by the International Telecommunication Union (ITU-T)which is used for SSL/TLS authentication.See: SSL/TLS Encryption (p. 146)

4http://www.pcre.org/5http://www.ietf.org/rfc/rfc2396.txt

Page 668: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

660 CHAPTER 12. GLOSSARY AND INDEX

12.2 Module Index

Below is a list of all of the modules that come as part of the Apache distribution. See also the complete alphabeticallist of all Apache directives (p. 663) .

See also

• Multi-Processing Modules (MPMs) (p. 59)

• Directive Quick Reference (p. 663)

Core Features and Multi-Processing Modules

core (p. 302) Core Apache HTTP Server features that are always available

mpm common (p. 592) A collection of directives that are implemented by more than one multi-processing module(MPM)

beos (p. 590) This Multi-Processing Module is optimized for BeOS.

leader (p. 603) An experimental variant of the standard WORKER MPM

mpm netware (p. 604) Multi-Processing Module implementing an exclusively threaded web server optimized forNovell NetWare

mpmt os2 (p. 606) Hybrid multi-process, multi-threaded MPM for OS/2

perchild (p. 607) Multi-Processing Module allowing for daemon processes serving requests to be assigned a varietyof different userids

prefork (p. 611) Implements a non-threaded, pre-forking web server

threadpool (p. 614) Yet another experimental variant of the standard WORKER MPM

mpm winnt (p. 615) This Multi-Processing Module is optimized for Windows NT.

worker (p. 616) Multi-Processing Module implementing a hybrid multi-threaded multi-process web server

Other Modules

mod access (p. 342) Provides access control based on client hostname, IP address, or other characteristics of theclient request.

mod actions (p. 346) This module provides for executing CGI scripts based on media type or request method.

mod alias (p. 348) Provides for mapping different parts of the host filesystem in the document tree and for URLredirection

mod asis (p. 353) Sends files that contain their own HTTP headers

mod auth (p. 355) User authentication using text files

mod auth anon (p. 358) Allows "anonymous" user access to authenticated areas

mod auth dbm (p. 361) Provides for user authentication using DBM files

mod auth digest (p. 364) User authentication using MD5 Digest Authentication.

mod auth ldap (p. 369) Allows an LDAP directory to be used to store the database for HTTP Basic authentication.

Page 669: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

12.2. MODULE INDEX 661

mod autoindex (p. 380) Generates directory indexes, automatically, similar to the Unix ls command or the Win32dir shell command

mod cache (p. 391) Content cache keyed to URIs.

mod cern meta (p. 397) CERN httpd metafile semantics

mod cgi (p. 399) Execution of CGI scripts

mod cgid (p. 402) Execution of CGI scripts using an external CGI daemon

mod charset lite (p. 403) Specify character set translation or recoding

mod dav (p. 406) Distributed Authoring and Versioning (WebDAV6) functionality

mod dav fs (p. 410) filesystem provider for MOD DAV

mod deflate (p. 411) Compress content before it is delivered to the client

mod dir (p. 416) Provides for "trailing slash" redirects and serving directory index files

mod disk cache (p. 418) Content cache storage manager keyed to URIs

mod dumpio (p. 423) Dumps all I/O to error log as desired.

mod echo (p. 425) A simple echo server to illustrate protocol modules

mod env (p. 426) Modifies the environment which is passed to CGI scripts and SSI pages

mod example (p. 428) Illustrates the Apache module API

mod expires (p. 430) Generation of Expires and Cache-Control HTTP headers according to user-specifiedcriteria

mod ext filter (p. 433) Pass the response body through an external program before delivery to the client

mod file cache (p. 439) Caches a static list of files in memory

mod headers (p. 442) Customization of HTTP request and response headers

mod imap (p. 446) Server-side imagemap processing

mod include (p. 450) Server-parsed html documents (Server Side Includes)

mod info (p. 459) Provides a comprehensive overview of the server configuration

mod isapi (p. 461) ISAPI Extensions within Apache for Windows

mod ldap (p. 465) LDAP connection pooling and result caching services for use by other LDAP modules

mod log config (p. 471) Logging of the requests made to the server

mod log forensic (p. 476) Forensic Logging of the requests made to the server

mod logio (p. 478) Logging of input and output bytes per request

mod mem cache (p. 479) Content cache keyed to URIs

mod mime (p. 483) Associates the requested filename’s extensions with the file’s behavior (handlers and filters) andcontent (mime-type, language, character set and encoding)

mod mime magic (p. 495) Determines the MIME type of a file by looking at a few bytes of its contents

6http://www.webdav.org/

Page 670: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

662 CHAPTER 12. GLOSSARY AND INDEX

mod negotiation (p. 499) Provides for content negotiation (p. 47)

mod nw ssl (p. 503) Enable SSL encryption for NetWare

mod proxy (p. 504) HTTP/1.1 proxy/gateway server

mod proxy connect (p. 518) MOD PROXY extension for CONNECT request handling

mod proxy ftp (p. 519) FTP support module for MOD PROXY

mod proxy http (p. 520) HTTP support module for MOD PROXY

mod rewrite (p. 521) Provides a rule-based rewriting engine to rewrite requested URLs on the fly

mod setenvif (p. 541) Allows the setting of environment variables based on characteristics of the request

mod so (p. 545) Loading of executable code and modules into the server at start-up or restart time

mod speling (p. 547) Attempts to correct mistaken URLs that users might have entered by ignoring capitalizationand by allowing up to one misspelling

mod ssl (p. 549) Strong cryptography using the Secure Sockets Layer (SSL) and Transport Layer Security (TLS)protocols

mod status (p. 573) Provides information on server activity and performance

mod suexec (p. 575) Allows CGI scripts to run as a specified user and Group

mod unique id (p. 576) Provides an environment variable with a unique identifier for each request

mod userdir (p. 578) User-specific directories

mod usertrack (p. 580) Clickstream logging of user activity on a site

mod version (p. 584) Version dependent configuration

mod vhost alias (p. 586) Provides for dynamically configured mass virtual hosting

Page 671: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

12.3. DIRECTIVE QUICK REFERENCE 663

12.3 Directive Quick Reference

The directive quick reference shows the usage, default, status, and context of each Apache configuration directive. Formore information about each of these, see the Directive Dictionary (p. 299) .

The first column gives the directive name and usage. The second columns shows the default value of the directive, ifa default exists. If the default is too large to display, the first characters will be followed by "+".

The third and fourth columns list the contexts where the directive is allowed and the status of the directive accordingto the legend tables below.

/ AcceptMutex Default|method Default s MMethod that Apache uses to serialize multiple children accepting requests on network sockets p. 592AcceptPathInfo On|Off|Default Default svdh CResources accept trailing pathname information p. 303AccessFileName filename [filename] ... .htaccess sv CName of the distributed configuration file p. 304Action action-type cgi-script svdh BActivates a CGI script for a particular handler or content-type p. 346AddAlt string file [file] ... svdh BAlternate text to display for a file, instead of an icon selected by filename p. 382AddAltByEncoding string MIME-encoding [MIME-encoding] ... svdh BAlternate text to display for a file instead of an icon selected by MIME-encoding p. 383AddAltByType string MIME-type [MIME-type] ... svdh BAlternate text to display for a file, instead of an icon selected by MIME content-type p. 383AddCharset charset extension [extension] ... svdh BMaps the given filename extensions to the specified content charset p. 485AddDefaultCharset On|Off|charset Off svdh CDefault charset parameter to be added when a response content-type is text/plain or text/html p. 305AddDescription string file [file] ... svdh BDescription to display for a file p. 383AddEncoding MIME-enc extension [extension] ... svdh BMaps the given filename extensions to the specified encoding type p. 486AddHandler handler-name extension [extension] ... svdh BMaps the filename extensions to the specified handler p. 487AddIcon icon name [name] ... svdh BIcon to display for a file selected by name p. 384AddIconByEncoding icon MIME-encoding [MIME-encoding] ... svdh BIcon to display next to files selected by MIME content-encoding p. 384AddIconByType icon MIME-type [MIME-type] ... svdh BIcon to display next to files selected by MIME content-type p. 385AddInputFilter filter[;filter...] extension [extension]...

svdh B

Maps filename extensions to the filters that will process client requests p. 487AddLanguage MIME-lang extension [extension] ... svdh BMaps the given filename extension to the specified content language p. 487AddModuleInfo module-name string sv EAdds additional information to the module information displayed by the server-info handler p. 459AddOutputFilter filter[;filter...] extension [extension]...

svdh B

Maps filename extensions to the filters that will process responses from the server p. 488AddOutputFilterByType filter[;filter...] MIME-type[MIME-type] ...

svdh C

assigns an output filter to a particular MIME-type p. 305AddType MIME-type extension [extension] ... svdh BMaps the given filename extensions onto the specified content type p. 489Alias URL-path file-path|directory-path sv BMaps URLs to filesystem locations p. 349AliasMatch regex file-path|directory-path sv BMaps URLs to filesystem locations using regular expressions p. 349Allow from all|host|env=env-variable[host|env=env-variable] ...

dh B

Controls which hosts can access an area of the server p. 342AllowCONNECT port [port] ... 443 563 sv EPorts that are allowed to CONNECT through the proxy p. 508

Page 672: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

664 CHAPTER 12. GLOSSARY AND INDEX

AllowEncodedSlashes On|Off Off sv CDetermines whether encoded path separators in URLs are allowed to be passed through p. 306AllowOverride All|None|directive-type [directive-type] ... All d CTypes of directives that are allowed in .htaccess files p. 307Anonymous user [user] ... dh ESpecifies userIDs that are allowed access without password verification p. 359Anonymous Authoritative On|Off Off dh EConfigures if authorization will fall-through to other methods p. 359Anonymous LogEmail On|Off On dh ESets whether the password entered will be logged in the error log p. 360Anonymous MustGiveEmail On|Off On dh ESpecifies whether blank passwords are allowed p. 360Anonymous NoUserID On|Off Off dh ESets whether the userID field may be empty p. 360Anonymous VerifyEmail On|Off Off dh ESets whether to check the password field for a correctly formatted email address p. 360AssignUserID user-id group-id v MTie a virtual host to a user and group ID p. 609AuthAuthoritative On|Off On dh BSets whether authorization and authentication are passed to lower level modules p. 355AuthDBMAuthoritative On|Off On dh ESets whether authentication and authorization will be passed on to lower level modules p. 361AuthDBMGroupFile file-path dh ESets the name of the database file containing the list of user groups for authentication p. 362AuthDBMType default|SDBM|GDBM|NDBM|DB default dh ESets the type of database file that is used to store passwords p. 362AuthDBMUserFile file-path dh ESets thename of a database file containing the list of users and passwords for authentication p. 363AuthDigestAlgorithm MD5|MD5-sess MD5 dh XSelects the algorithm used to calculate the challenge and response hases in digest authentication p. 365AuthDigestDomain URI [URI] ... dh XURIs that are in the same protection space for digest authentication p. 366AuthDigestFile file-path dh XLocation of the text file containing the list of users and encoded passwords for digest authentication p. 366AuthDigestGroupFile file-path dh XName of the text file containing the list of groups for digest authentication p. 366AuthDigestNcCheck On|Off Off s XEnables or disables checking of the nonce-count sent by the server p. 367AuthDigestNonceFormat format dh XDetermines how the nonce is generated p. 367AuthDigestNonceLifetime seconds 300 dh XHow long the server nonce is valid p. 367AuthDigestQop none|auth|auth-int [auth|auth-int] auth dh XDetermines the quality-of-protection to use in digest authentication p. 368AuthDigestShmemSize size 1000 s XThe amount of shared memory to allocate for keeping track of clients p. 368AuthGroupFile file-path dh BSets the name of a text file containing the list of user groups for authentication p. 356AuthLDAPAuthoritative on|off on dh XPrevent other authentication modules from authenticating the user if this one fails p. 375AuthLDAPBindDN distinguished-name dh XOptional DN to use in binding to the LDAP server p. 375AuthLDAPBindPassword password dh XPassword used in conjuction with the bind DN p. 376AuthLDAPCharsetConfig file-path s XLanguage to charset conversion configuration file p. 376AuthLDAPCompareDNOnServer on|off on dh XUse the LDAP server to compare the DNs p. 376AuthLDAPDereferenceAliases never|searching|finding|always Always dh XWhen will the module de-reference aliases p. 377AuthLDAPEnabled on|off on dh X

Turn on or off LDAP authentication p. 377AuthLDAPFrontPageHack on|off off dh XAllow LDAP authentication to work with MS FrontPage p. 377

Page 673: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

12.3. DIRECTIVE QUICK REFERENCE 665

AuthLDAPGroupAttribute attribute dh XLDAP attributes used to check for group membership p. 377AuthLDAPGroupAttributeIsDN on|off on dh XUse the DN of the client username when checking for group membership p. 378AuthLDAPRemoteUserIsDN on|off off dh XUse the DN of the client username to set the REMOTE USER environment variable p. 378AuthLDAPUrl url dh XURL specifying the LDAP search parameters p. 378AuthName auth-domain dh CAuthorization realm for use in HTTP authentication p. 308AuthType Basic|Digest dh CType of user authentication p. 308AuthUserFile file-path dh BSets the name of a text file containing the list of users and passwords for authentication p. 356BrowserMatch regex [!]env-variable[=value][[!]env-variable[=value]] ...

svdh B

Sets environment variables conditional on HTTP User-Agent p. 541BrowserMatchNoCase regex [!]env-variable[=value][[!]env-variable[=value]] ...

svdh B

Sets environment variables conditional on User-Agent without respect to case p. 542BS2000Account account s MDefine the non-privileged account on BS2000 machines p. 593BufferedLogs On|Off Off s BBuffer log entries in memory before writing to disk p. 473CacheDefaultExpire seconds 3600 (one hour) sv XThe default duration to cache a document when no expiry date is specified. p. 393CacheDirLength length 2 sv XThe number of characters in subdirectory names p. 418CacheDirLevels levels 3 sv XThe number of levels of subdirectories in the cache. p. 419CacheDisable url-string sv XDisable caching of specified URLs p. 393CacheEnable cache type url-string sv XEnable caching of specified URLs using a specified storage manager p. 393CacheExpiryCheck On|Off On sv XIndicates if the cache observes Expires dates when seeking files p. 419CacheFile file-path [file-path] ... s XCache a list of file handles at startup time p. 440CacheForceCompletion Percentage 60 sv XPercentage of document served, after which the server will complete caching the file even if the request is cancelled. p. 394CacheGcClean hours url-string ? sv XThe time to retain unchanged cached files that match a URL p. 419CacheGcDaily time ? sv XThe recurring time each day for garbage collection to be run. (24 hour clock) p. 420CacheGcInterval hours sv XThe interval between garbage collection attempts. p. 420CacheGcMemUsage KBytes ? sv XThe maximum kilobytes of memory used for garbage collection p. 420CacheGcUnused hours url-string ? sv XThe time to retain unreferenced cached files that match a URL. p. 421CacheIgnoreCacheControl On|Off Off sv XIgnore the fact that the client requested the content not be cached. p. 394CacheIgnoreHeaders header-string [header-string] ... None sv XDo not store the given HTTP header(s) in the cache. p. 394CacheIgnoreNoLastMod On|Off Off sv XIgnore the fact that a response has no Last Modified header. p. 395CacheLastModifiedFactor float 0.1 sv XThe factor used to compute an expiry date based on the LastModified date. p. 396CacheMaxExpire seconds 86400 (one day) sv XThe maximum time in seconds to cache a document p. 396CacheMaxFileSize bytes 1000000 sv XThe maximum size (in bytes) of a document to be placed in the cache p. 421CacheMinFileSize bytes 1 sv XThe minimum size (in bytes) of a document to be placed in the cache p. 421

Page 674: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

666 CHAPTER 12. GLOSSARY AND INDEX

CacheNegotiatedDocs On|Off Off sv BAllows content-negotiated documents to be cached by proxy servers p. 500CacheRoot directory sv XThe directory root under which cache files are stored p. 421CacheSize KBytes 1000000 sv XThe maximum amount of disk space that will be used by the cache in KBytes p. 422CacheTimeMargin ? ? sv XThe minimum time margin to cache a document p. 422CGIMapExtension cgi-path .extension dh CTechnique for locating the interpreter for CGI scripts p. 308CharsetDefault charset svdh XCharset to translate into p. 404CharsetOptions option [option] ... DebugLevel=0 NoImpl + svdh XConfigures charset translation behavior p. 404CharsetSourceEnc charset svdh XSource charset of files p. 404CheckSpelling on|off Off svdh EEnables the spelling module p. 547ChildPerUserID user-id group-id num-children s MSpecify user ID and group ID for a number of child processes p. 609ContentDigest On|Off Off svdh CEnables the generation of Content-MD5 HTTP Response headers p. 309CookieDomain domain svdh EThe domain to which the tracking cookie applies p. 581CookieExpires expiry-period svdh EExpiry time for the tracking cookie p. 581CookieLog filename sv BSets filename for the logging of cookies p. 473CookieName token Apache svdh EName of the tracking cookie p. 582CookieStyle Netscape|Cookie|Cookie2|RFC2109|RFC2965 Netscape svdh EFormat of the cookie header field p. 582CookieTracking on|off off svdh EEnables tracking cookie p. 582CoreDumpDirectory directory s MDirectory where Apache attempts to switch before dumping core p. 593CustomLog file|pipe format|nickname [env=[!]environment-variable] sv BSets filename and format of log file p. 474Dav On|Off|provider-name Off d EEnable WebDAV HTTP methods p. 408DavDepthInfinity on|off off svd EAllow PROPFIND, Depth: Infinity requests p. 408DavLockDB file-path sv ELocation of the DAV lock database p. 410DavMinTimeout seconds 0 svd EMinimum amount of time the server holds a lock on a DAV resource p. 408DefaultIcon url-path svdh BIcon to display for files when no specific icon is configured p. 385DefaultLanguage MIME-lang svdh BSets all files in the given scope to the specified language p. 489DefaultType MIME-type text/plain svdh CMIME content-type that will be sent if the server cannot determine a type in any other way p. 309DeflateBufferSize value 8096 sv EFragment size to be compressed at one time by zlib p. 414DeflateCompressionLevel value sv EHow much compression do we apply to the output p. 414DeflateFilterNote [type] notename sv EPlaces the compression ratio in a note for logging p. 414DeflateMemLevel value 9 sv EHow much memory should be used by zlib for compression p. 415DeflateWindowSize value 15 sv EZlib compression window size p. 415Deny from all|host|env=env-variable [host|env=env-variable]...

dh B

Controls which hosts are denied access to the server p. 344

Page 675: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

12.3. DIRECTIVE QUICK REFERENCE 667

<Directory directory-path> ... </Directory> sv CEnclose a group of directives that apply only to the named file-system directory and sub-directories p. 310DirectoryIndex local-url [local-url] ... index.html svdh BList of resources to look for when the client requests a directory p. 416<DirectoryMatch regex> ... </DirectoryMatch> sv CEnclose directives that apply to file-system directories matching a regular expression and their subdirectories p. 311DirectorySlash On|Off On svdh BToggle trailing slash redirects on or off p. 417DocumentRoot directory-path /usr/local/apache/h + sv CDirectory that forms the main document tree visible from the web p. 312DumpIOInput On|Off Off s XDump all input data to the error log p. 423DumpIOOutput On|Off Off s XDump all output data to the error log p. 423EnableExceptionHook On|Off Off s MEnables a hook that runs exception handlers after a crash p. 594EnableMMAP On|Off On svdh CUse memory-mapping to read files during delivery p. 312EnableSendfile On|Off On svdh CUse the kernel sendfile support to deliver files to the client p. 313ErrorDocument error-code document svdh CWhat the server will return to the client in case of an error p. 313ErrorLog file-path|syslog[:facility] logs/error log (Uni + sv C

Location where the server will log errors p. 315Example svdh XDemonstration directive to illustrate the Apache module API p. 429ExpiresActive On|Off svdh EEnables generation of Expires headers p. 431ExpiresByType MIME-type <code>seconds svdh EValue of the Expires header configured by MIME type p. 431ExpiresDefault <code>seconds svdh EDefault algorithm for calculating expiration time p. 432ExtendedStatus On|Off Off s BKeep track of extended status information for each request p. 574ExtFilterDefine filtername parameters s EDefine an external filter p. 436ExtFilterOptions option [option] ... DebugLevel=0 NoLogS + d EConfigure MOD EXT FILTER options p. 437FileETag component ... INode MTime Size svdh CFile attributes used to create the ETag HTTP response header p. 315<Files filename> ... </Files> svdh CContains directives that apply to matched filenames p. 316<FilesMatch regex> ... </FilesMatch> svdh CContains directives that apply to regular-expression matched filenames p. 317ForceLanguagePriority None|Prefer|Fallback[Prefer|Fallback]

Prefer svdh B

Action to take if a single acceptable document is not found p. 501ForceType MIME-type|None dh CForces all matching files to be served with the specified MIME content-type p. 317ForensicLog filename|pipe sv ESets filename of the forensic log p. 477Group unix-group #-1 s MGroup under which the server will answer requests p. 594Header [condition] set|append|add|unset|echo header[value] [env=[!]variable]

svdh E

Configure HTTP response headers p. 443HeaderName filename svdh BName of the file that will be inserted at the top of the index listing p. 385HostnameLookups On|Off|Double Off svd CEnables DNS lookups on client IP addresses p. 318IdentityCheck On|Off Off svd CEnables logging of the RFC1413 identity of the remote user p. 318<IfDefine [!]parameter-name> ... </IfDefine> svdh CEncloses directives that will be processed only if a test is true at startup p. 318

Page 676: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

668 CHAPTER 12. GLOSSARY AND INDEX

<IfModule [!]module-name> ... </IfModule> svdh CEncloses directives that are processed conditional on the presence or absence of a specific module p. 319<IfVersion [[!]operator] version> ... </IfVersion> svdh Econtains version dependent configuration p. 584ImapBase map|referer|URL http://servername/ svdh BDefault base for imagemap files p. 448ImapDefault error|nocontent|map|referer|URL nocontent svdh BDefault action when an imagemap is called with coordinates that are not explicitly mapped p. 449ImapMenu none|formatted|semiformatted|unformatted svdh BAction if no coordinates are given when calling an imagemap p. 449Include file-path|directory-path svd CIncludes other configuration files from within the server configuration files p. 320IndexIgnore file [file] ... "." svdh BAdds to the list of files to hide when listing a directory p. 386IndexOptions [+|-]option [[+|-]option] ... svdh BVarious configuration settings for directory indexing p. 386IndexOrderDefault Ascending|DescendingName|Date|Size|Description

Ascending Name svdh B

Sets the default ordering of the directory index p. 389ISAPIAppendLogToErrors on|off off svdh BRecord HSE APPEND LOG PARAMETER requests from ISAPI extensions to the error log p. 463ISAPIAppendLogToQuery on|off on svdh BRecord HSE APPEND LOG PARAMETER requests from ISAPI extensions to the query field p. 463ISAPICacheFile file-path [file-path] ... sv BISAPI .dll files to be loaded at startup p. 463ISAPIFakeAsync on|off off svdh BFake asynchronous support for ISAPI callbacks p. 464ISAPILogNotSupported on|off off svdh BLog unsupported feature requests from ISAPI extensions p. 464ISAPIReadAheadBuffer size 49152 svdh BSize of the Read Ahead Buffer sent to ISAPI extensions p. 464KeepAlive On|Off On sv CEnables HTTP persistent connections p. 320KeepAliveTimeout seconds 15 sv CAmount of time the server will wait for subsequent requests on a persistent connection p. 321LanguagePriority MIME-lang [MIME-lang] ... svdh BThe precendence of language variants for cases where the client does not express a preference p. 502LDAPCacheEntries number 1024 s XMaximum number of entries in the primary LDAP cache p. 468LDAPCacheTTL seconds 600 s XTime that cached items remain valid p. 468LDAPConnectionTimeout seconds s XSpecifies the socket connection timeout in seconds p. 468LDAPOpCacheEntries number 1024 s XNumber of entries used to cache LDAP compare operations p. 468LDAPOpCacheTTL seconds 600 s XTime that entries in the operation cache remain valid p. 469LDAPSharedCacheFile directory-path/filename s XSets the shared memory cache file p. 469LDAPSharedCacheSize bytes 102400 s XSize in bytes of the shared-memory cache p. 469LDAPTrustedCA directory-path/filename s XSets the file containing the trusted Certificate Authority certificate or database p. 469LDAPTrustedCAType type s XSpecifies the type of the Certificate Authority file p. 469<Limit method [method] ... > ... </Limit> svdh CRestrict enclosed access controls to only certain HTTP methods p. 321<LimitExcept method [method] ... > ... </LimitExcept> svdh CRestrict access controls to all HTTP methods except the named ones p. 322LimitInternalRecursion number [number] 10 sv CDetermine maximum number of internal redirects and nested subrequests p. 322LimitRequestBody bytes 0 svdh CRestricts the total size of the HTTP request body sent from the client p. 322LimitRequestFields number 100 sv CLimits the number of HTTP request header fields that will be accepted from the client p. 323

Page 677: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

12.3. DIRECTIVE QUICK REFERENCE 669

LimitRequestFieldsize bytes sv CLimits the size of the HTTP request header allowed from the client p. 324LimitRequestLine bytes 8190 sv CLimit the size of the HTTP request line that will be accepted from the client p. 324LimitXMLRequestBody bytes 1000000 svdh CLimits the size of an XML-based request body p. 325Listen [IP-address:]portnumber s MIP addresses and ports that the server listens to p. 595ListenBacklog backlog s MMaximum length of the queue of pending connections p. 595LoadFile filename [filename] ... s ELink in the named object file or library p. 546LoadModule module filename s ELinks in the object file or library, and adds to the list of active modules p. 546<Location URL-path|URL> ... </Location> sv CApplies the enclosed directives only to matching URLs p. 325<LocationMatch regex> ... </LocationMatch> sv CApplies the enclosed directives only to regular-expression matching URLs p. 326LockFile filename logs/accept.lock s MLocation of the accept serialization lock file p. 596LogFormat format|nickname [nickname] "%h %l %u %t \"%r\" + sv BDescribes a format for use in a log file p. 475LogLevel level warn sv CControls the verbosity of the ErrorLog p. 327MaxClients number s MMaximum number of connections that will be processed simultaneously p. 596MaxKeepAliveRequests number 100 sv CNumber of requests allowed on a persistent connection p. 327MaxMemFree KBytes 0 s MMaximum amount of memory that the main allocator is allowed to hold without calling free() p. 597MaxRanges default | unlimited | none | number-of-ranges 200 svd CNumber of ranges allowed before returning the complete resource p. 328MaxRequestsPerChild number 10000 s MLimit on the number of requests that an individual child server will handle during its life p. 597MaxRequestsPerThread number 0 s MLimit on the number of requests that an individual thread will handle during its life p. 590MaxSpareServers number 10 s MMaximum number of idle child server processes p. 612MaxSpareThreads number s MMaximum number of idle threads p. 597MaxThreads number 2048 s MSet the maximum number of worker threads p. 605MaxThreadsPerChild number 64 s MMaximum number of threads per child process p. 610MCacheMaxObjectCount value 1009 s XThe maximum number of objects allowed to be placed in the cache p. 479MCacheMaxObjectSize bytes 10000 s XThe maximum size (in bytes) of a document allowed in the cache p. 480MCacheMaxStreamingBuffer size in bytes the smaller of 1000 + s XMaximum amount of a streamed response to buffer in memory before declaring the response uncacheable p. 480MCacheMinObjectSize bytes 0 s XThe minimum size (in bytes) of a document to be allowed in the cache p. 481MCacheRemovalAlgorithm LRU|GDSF GDSF s XThe algorithm used to select documents for removal from the cache p. 481MCacheSize KBytes 100 s XThe maximum amount of memory used by the cache in KBytes p. 481MetaDir directory .web svdh EName of the directory to find CERN-style meta information files p. 397MetaFiles on|off off svdh EActivates CERN meta-file processing p. 398MetaSuffix suffix .meta svdh EFile name suffix for the file containg CERN-style meta information p. 398MimeMagicFile file-path sv EEnable MIME-type determination based on file contents using the specified magic file p. 498

Page 678: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

670 CHAPTER 12. GLOSSARY AND INDEX

MinSpareServers number 5 s MMinimum number of idle child server processes p. 612MinSpareThreads number s MMinimum number of idle threads available to handle request spikes p. 598MMapFile file-path [file-path] ... s XMap a list of files into memory at startup time p. 440ModMimeUsePathInfo On|Off Off d BTells MOD MIME to treat path info components as part of the filename p. 490MultiviewsMatch Any|NegotiatedOnly|Filters|Handlers[Handlers|Filters]

NegotiatedOnly svdh B

The types of files that will be included when searching for a matching file with MultiViews p. 490NameVirtualHost addr[:port] s CDesignates an IP address for name-virtual hosting p. 328NoProxy host [host] ... sv EHosts, domains, or networks that will be connected to directly p. 508NumServers number 2 s MTotal number of children alive at the same time p. 610NWSSLTrustedCerts filename [filename] ... s BList of additional client certificates p. 503NWSSLUpgradeable [IP-address:]portnumber s BAllows a connection to be upgraded to an SSL connection upon request p. 503Options [+|-]option [[+|-]option] ... All svdh CConfigures what features are available in a particular directory p. 329Order ordering Deny,Allow dh B

Controls the default access state and the order in which ALLOW and DENY are evaluated. p. 344PassEnv env-variable [env-variable] ... svdh BPasses environment variables from the shell p. 426PidFile filename logs/httpd.pid s MFile where the server records the process ID of the daemon p. 598ProtocolEcho On|Off Off sv XTurn the echo server on or off p. 425<Proxy wildcard-url> ...</Proxy> sv EContainer for directives applied to proxied resources p. 510ProxyBadHeader IsError|Ignore|StartBody IsError sv EDetermines how to handle bad header lines in a response p. 510ProxyBlock *|word|host|domain [word|host|domain] ... sv EWords, hosts, or domains that are banned from being proxied p. 511ProxyDomain Domain sv EDefault domain name for proxied requests p. 511ProxyErrorOverride On|Off Off sv EOverride error pages for proxied content p. 512ProxyFtpDirCharset character set ISO-8859-1 svd EDefine the character set for proxied FTP listings p. 512ProxyIOBufferSize bytes 8192 sv EDetermine size of internal data throughput buffer p. 512<ProxyMatch regex> ...</ProxyMatch> sv EContainer for directives applied to regular-expression-matched proxied resources p. 512ProxyMaxForwards number 10 sv EMaximium number of proxies that a request can be forwarded through p. 513ProxyPass [path] !|url svd EMaps remote servers into the local server URL-space p. 513ProxyPassReverse [path] url svd EAdjusts the URL in HTTP response headers sent from a reverse proxied server p. 514ProxyPreserveHost On|Off Off sv EUse incoming Host HTTP request header for proxy request p. 514ProxyReceiveBufferSize bytes 0 sv ENetwork buffer size for proxied HTTP and FTP connections p. 515ProxyRemote match remote-server sv ERemote proxy used to handle certain requests p. 515ProxyRemoteMatch regex remote-server sv ERemote proxy used to handle requests matched by regular expressions p. 515ProxyRequests On|Off Off sv EEnables forward (standard) proxy requests p. 516ProxyTimeout seconds 300 sv ENetwork timeout for proxied requests p. 516

Page 679: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

12.3. DIRECTIVE QUICK REFERENCE 671

ProxyVia On|Off|Full|Block Off sv EInformation provided in the Via HTTP response header for proxied requests p. 516ReadmeName filename svdh BName of the file that will be inserted at the end of the index listing p. 390ReceiveBufferSize bytes 0 s MTCP receive buffer size p. 599Redirect [status] URL-path URL svdh BSends an external redirect asking the client to fetch a different URL p. 350RedirectMatch [status] regex URL svdh BSends an external redirect based on a regular expression match of the current URL p. 351RedirectPermanent URL-path URL svdh BSends an external permanent redirect asking the client to fetch a different URL p. 351RedirectTemp URL-path URL svdh BSends an external temporary redirect asking the client to fetch a different URL p. 351RemoveCharset extension [extension] ... vdh BRemoves any character set associations for a set of file extensions p. 491RemoveEncoding extension [extension] ... vdh BRemoves any content encoding associations for a set of file extensions p. 491RemoveHandler extension [extension] ... vdh BRemoves any handler associations for a set of file extensions p. 492RemoveInputFilter extension [extension] ... vdh BRemoves any input filter associations for a set of file extensions p. 492RemoveLanguage extension [extension] ... vdh BRemoves any language associations for a set of file extensions p. 493RemoveOutputFilter extension [extension] ... vdh BRemoves any output filter associations for a set of file extensions p. 493RemoveType extension [extension] ... vdh BRemoves any content type associations for a set of file extensions p. 493RequestHeader set|append|add|unset header [value[env=[!]variable]]

svdh E

Configure HTTP request headers p. 444Require entity-name [entity-name] ... dh CSelects which authenticated users can access a resource p. 330RewriteBase URL-path dh ESets the base URL for per-directory rewrites p. 524RewriteCond TestString CondPattern svdh E

Defines a condition under which rewriting will take place p. 525RewriteEngine on|off off svdh EEnables or disables runtime rewriting engine p. 528RewriteLock file-path s ESets the name of the lock file used for REWRITEMAP synchronization p. 529RewriteLog file-path sv ESets the name of the file used for logging rewrite engine processing p. 529RewriteLogLevel Level 0 sv ESets the verbosity of the log file used by the rewrite engine p. 530RewriteMap MapName MapType:MapSource sv EDefines a mapping function for key-lookup p. 530RewriteOptions Options MaxRedirects=10 svdh ESets some special options for the rewrite engine p. 533RewriteRule Pattern Substitution svdh EDefines rules for the rewriting engine p. 534RLimitCPU seconds|max [seconds|max] svdh CLimits the CPU consumption of processes launched by Apache children p. 331RLimitMEM bytes|max [bytes|max] svdh CLimits the memory consumption of processes launched by Apache children p. 331RLimitNPROC number|max [number|max] svdh CLimits the number of processes that can be launched by processes launched by Apache children p. 332Satisfy Any|All All dh CInteraction between host-level access control and user authentication p. 333ScoreBoardFile file-path logs/apache status s MLocation of the file used to store coordination data for the child processes p. 599Script method cgi-script svd BActivates a CGI script for a particular request method. p. 347ScriptAlias URL-path file-path|directory-path sv BMaps a URL to a filesystem location and designates the target as a CGI script p. 351

Page 680: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

672 CHAPTER 12. GLOSSARY AND INDEX

ScriptAliasMatch regex file-path|directory-path sv BMaps a URL to a filesystem location using a regular expression and designates the target as a CGI script p. 352ScriptInterpreterSource Registry|Registry-Strict|Script Script svdh CTechnique for locating the interpreter for CGI scripts p. 333ScriptLog file-path sv BLocation of the CGI script error logfile p. 400ScriptLogBuffer bytes 1024 sv BMaximum amount of PUT or POST requests that will be recorded in the scriptlog p. 401ScriptLogLength bytes 10385760 sv BSize limit of the CGI script logfile p. 401ScriptSock file-path logs/cgisock sv BThe name of the socket to use for communication with the cgi daemon p. 402SecureListen [IP-address:]portnumber Certificate-Name[MUTUAL]

s B

Enables SSL encryption for the specified port p. 503SendBufferSize bytes 0 s MTCP buffer size p. 600ServerAdmin email-address sv CEmail address that the server includes in error messages sent to the client p. 334ServerAlias hostname [hostname] ... v CAlternate names for a host used when matching requests to name-virtual hosts p. 334ServerLimit number s MUpper limit on configurable number of processes p. 600ServerName fully-qualified-domain-name[:port] sv CHostname and port that the server uses to identify itself p. 335ServerPath URL-path v CLegacy URL pathname for a name-based virtual host that is accessed by an incompatible browser p. 335ServerRoot directory-path /usr/local/apache s CBase directory for the server installation p. 336ServerSignature On|Off|EMail Off svdh CConfigures the footer on server-generated documents p. 336ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full Full s CConfigures the Server HTTP response header p. 337SetEnv env-variable value svdh BSets environment variables p. 426SetEnvIf attribute regex [!]env-variable[=value][[!]env-variable[=value]] ...

svdh B

Sets environment variables based on attributes of the request p. 542SetEnvIfNoCase attribute regex [!]env-variable[=value][[!]env-variable[=value]] ...

svdh B

Sets environment variables based on attributes of the request without respect to case p. 544SetHandler handler-name|None svdh CForces all matching files to be processed by a handler p. 337SetInputFilter filter[;filter...] svdh CSets the filters that will process client requests and POST input p. 338SetOutputFilter filter[;filter...] svdh CSets the filters that will process responses from the server p. 338SSIEndTag tag "–>" sv BString that ends an include element p. 456SSIErrorMsg message "[an error occurred + svdh BError message displayed when there is an SSI error p. 456SSIStartTag tag "<!–#" sv BString that starts an include element p. 457SSITimeFormat formatstring "%A, %d-%b-%Y %H:%M + svdh BConfigures the format in which date strings are displayed p. 457SSIUndefinedEcho string "(none)" sv BString displayed when an unset variable is echoed p. 458SSLCACertificateFile file-path sv EFile of concatenated PEM-encoded CA Certificates for Client Auth p. 551SSLCACertificatePath directory-path sv EDirectory of PEM-encoded CA Certificates for Client Auth p. 551SSLCARevocationFile file-path sv EFile of concatenated PEM-encoded CA CRLs for Client Auth p. 552SSLCARevocationPath directory-path sv EDirectory of PEM-encoded CA CRLs for Client Auth p. 552

Page 681: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

12.3. DIRECTIVE QUICK REFERENCE 673

SSLCertificateChainFile file-path sv EFile of PEM-encoded Server CA Certificates p. 552SSLCertificateFile file-path sv EServer PEM-encoded X.509 Certificate file p. 553SSLCertificateKeyFile file-path sv EServer PEM-encoded Private Key file p. 553SSLCipherSuite cipher-spec ALL:!ADH:RC4+RSA:+H + svdh ECipher Suite available for negotiation in SSL handshake p. 554SSLEngine on|off off sv ESSL Engine Operation Switch p. 556SSLHonorCipherOrder flag sv EOption to prefer the server’s cipher preference order p. 557SSLInsecureRenegotiation flag off sv EOption to enable support for insecure renegotiation p. 557SSLMutex type none s ESemaphore for internal mutual exclusion of operations p. 558SSLOptions [+|-]option ... svdh EConfigure various SSL engine run-time options p. 559SSLPassPhraseDialog type builtin s EType of pass phrase dialog for encrypted private keys p. 560SSLProtocol [+|-]protocol ... all sv EConfigure usable SSL protocol flavors p. 561SSLProxyCACertificateFile file-path sv EFile of concatenated PEM-encoded CA Certificates for Remote Server Auth p. 562SSLProxyCACertificatePath directory-path sv EDirectory of PEM-encoded CA Certificates for Remote Server Auth p. 562SSLProxyCARevocationFile file-path sv EFile of concatenated PEM-encoded CA CRLs for Remote Server Auth p. 562SSLProxyCARevocationPath directory-path sv EDirectory of PEM-encoded CA CRLs for Remote Server Auth p. 563SSLProxyCipherSuite cipher-spec ALL:!ADH:RC4+RSA:+H + svdh ECipher Suite available for negotiation in SSL proxy handshake p. 563SSLProxyEngine on|off off sv ESSL Proxy Engine Operation Switch p. 563SSLProxyMachineCertificateFile filename s EFile of concatenated PEM-encoded client certificates and keys to be used by the proxy p. 564SSLProxyMachineCertificatePath directory s EDirectory of PEM-encoded client certificates and keys to be used by the proxy p. 564SSLProxyProtocol [+|-]protocol ... all sv EConfigure usable SSL protocol flavors for proxy usage p. 564SSLProxyVerify level none svdh EType of remote server Certificate verification p. 565SSLProxyVerifyDepth number 1 svdh EMaximum depth of CA Certificates in Remote Server Certificate verification p. 565SSLRandomSeed context source [bytes] s EPseudo Random Number Generator (PRNG) seeding source p. 566SSLRequire expression dh EAllow access only when an arbitrarily complex boolean expression is true p. 567SSLRequireSSL dh EDeny access when SSL is not used for the HTTP request p. 569SSLSessionCache type none s EType of the global/inter-process SSL Session Cache p. 570SSLSessionCacheTimeout seconds 300 sv ENumber of seconds before an SSL session expires in the Session Cache p. 570SSLUserName varname sdh EVariable name to determine user name p. 571SSLVerifyClient level none svdh EType of Client Certificate verification p. 571SSLVerifyDepth number 1 svdh EMaximum depth of CA Certificates in Client Certificate verification p. 572StartServers number s MNumber of child server processes created at startup p. 600StartThreads number s MNumber of threads created on startup p. 601

Page 682: Apache HTTP Server Documentation Version 2 · This version of the Apache HTTP Server Documentation is converted from XML source files to LATEX using XSLT with the help of Apache

674 CHAPTER 12. GLOSSARY AND INDEX

SuexecUserGroup User Group sv EUser and group for CGI programs to run as p. 575ThreadLimit number s MSets the upper limit on the configurable number of threads per child process p. 601ThreadsPerChild number s MNumber of threads created by each child process p. 602ThreadStackSize number 65536 s MDetermine the stack size for each thread p. 605TimeOut seconds 300 sv CAmount of time the server will wait for certain events before failing a request p. 339TraceEnable [on|off|extended] on s CDetermines the behaviour on TRACE requests p. 339TransferLog file|pipe sv BSpecify location of a log file p. 475TypesConfig file-path conf/mime.types s BThe location of the mime.types file p. 494UnsetEnv env-variable [env-variable] ... svdh BRemoves variables from the environment p. 427UseCanonicalName On|Off|DNS On svd CConfigures how the server determines its own name and port p. 339User unix-userid #-1 s MThe userid under which the server will answer requests p. 602UserDir directory-filename public html sv BLocation of the user-specific directories p. 578VirtualDocumentRoot interpolated-directory|none none sv EDynamically configure the location of the document root for a given virtual host p. 588VirtualDocumentRootIP interpolated-directory|none none sv EDynamically configure the location of the document root for a given virtual host p. 588<VirtualHost addr[:port] [addr[:port]] ...> ...</VirtualHost>

s C

Contains directives that apply only to a specific hostname or IP address p. 340VirtualScriptAlias interpolated-directory|none none sv EDynamically configure the location of the CGI directory for a given virtual host p. 588VirtualScriptAliasIP interpolated-directory|none none sv EDynamically configure the location of the cgi directory for a given virtual host p. 589Win32DisableAcceptEx s MUse accept() rather than AcceptEx() to accept network connections p. 615XBitHack on|off|full off svdh BParse SSI directives in files with the execute bit set p. 458