| 62 |  | Out of the box, Trac will pass static resources such as style sheets or images through itself. For a CGI setup this is '''highly undesirable''', because this way CGI script is invoked for documents that could be much more efficiently served directly by web server. | 
          
            | 63 |  |  | 
          
            | 64 |  | Web servers such as [http://httpd.apache.org/ Apache] allow you to create “Aliases” to resources, giving them a virtual URL that doesn't necessarily reflect the layout of the servers file system. We already used this capability by defining a `ScriptAlias` for the CGI script. We also can map requests for static resources directly to the directory on the file system, avoiding processing these requests by CGI script. | 
          
            | 65 |  |  | 
          
            | 66 |  | Add the following snippet to Apache configuration '''before''' the `ScriptAlias` for the CGI script, changing paths to match your deployment: | 
          
            | 67 |  | {{{ | 
          
            | 68 |  | Alias /trac/chrome/common /path/to/www/trac/htdocs | 
          
            | 69 |  | <Directory "/path/to/www/trac/htdocs"> | 
          
            | 70 |  | Order allow,deny | 
          
            | 71 |  | Allow from all | 
          
            | 72 |  | </Directory> | 
          
            | 73 |  | }}} | 
          
            | 74 |  |  | 
          
            | 75 |  | Note that we mapped `/trac` part of the URL to the `trac.cgi` script, and the path `/chrome/common` is the path you have to append to that location to intercept requests to the static resources. | 
          
            | 76 |  |  | 
          
            | 77 |  | For example, if Trac is mapped to `/cgi-bin/trac.cgi` on your server, the URL of the Alias should be `/cgi-bin/trac.cgi/chrome/common`. | 
          
            | 78 |  |  | 
          
            | 79 |  | Similarly, if you have static resources in a project's htdocs directory (which is referenced by /chrome/site URL in themes), you can configure Apache to serve those resources (again, put this '''before''' the `ScriptAlias` for the CGI script, and adjust names and locations to match your installation): | 
          
            | 80 |  |  | 
          
            | 81 |  | {{{ | 
          
            | 82 |  | Alias /trac/chrome/site /path/to/projectenv/htdocs | 
          
            | 83 |  | <Directory "/path/to/projectenv/htdocs"> | 
          
            | 84 |  | Order allow,deny | 
          
            | 85 |  | Allow from all | 
          
            | 86 |  | </Directory> | 
          
            | 87 |  | }}} | 
          
            | 88 |  |  | 
          
            | 89 |  | Alternatively to hacking `/trac/chrome/site`, you can directly specify path to static resources using `htdocs_location` configuration option in [wiki:TracIni trac.ini]: | 
          
            | 90 |  | {{{ | 
          
            | 91 |  | [trac] | 
          
            | 92 |  | htdocs_location = http://yourhost.example.org/trac-htdocs | 
          
            | 93 |  | }}} | 
          
            | 94 |  |  | 
          
            | 95 |  | Trac will then use this URL when embedding static resources into HTML pages. Of course, you still need to make the Trac `htdocs` directory available through the web server at the specified URL, for example by copying (or linking) the directory into the document root of the web server: | 
          
            | 96 |  | {{{ | 
          
            | 97 |  | $ ln -s /path/to/www/trac/htdocs /var/www/yourhost.example.org/trac-htdocs | 
          
            | 98 |  | }}} | 
          
            | 99 |  |  | 
          
            | 100 |  | Note that in order to get this `htdocs` directory, you need first to extract the relevant Trac resources using the `deploy` command of TracAdmin: | 
          
            | 101 |  | [[TracAdminHelp(deploy)]] | 
          
            | 102 |  |  | 
          
            |  | 66 | See TracInstall#MappingStaticResources. | 
        
        
          
            | 106 |  | The simplest way to enable authentication with Apache is to create a password file. Use the `htpasswd` program to create the password file: | 
          
            | 107 |  | {{{ | 
          
            | 108 |  | $ htpasswd -c /somewhere/trac.htpasswd admin | 
          
            | 109 |  | New password: <type password> | 
          
            | 110 |  | Re-type new password: <type password again> | 
          
            | 111 |  | Adding password for user admin | 
          
            | 112 |  | }}} | 
          
            | 113 |  |  | 
          
            | 114 |  | After the first user, you dont need the "-c" option anymore: | 
          
            | 115 |  | {{{ | 
          
            | 116 |  | $ htpasswd /somewhere/trac.htpasswd john | 
          
            | 117 |  | New password: <type password> | 
          
            | 118 |  | Re-type new password: <type password again> | 
          
            | 119 |  | Adding password for user john | 
          
            | 120 |  | }}} | 
          
            | 121 |  |  | 
          
            | 122 |  | ''See the man page for `htpasswd` for full documentation.'' | 
          
            | 123 |  |  | 
          
            | 124 |  | After you've created the users, you can set their permissions using TracPermissions. | 
          
            | 125 |  |  | 
          
            | 126 |  | Now, you'll need to enable authentication against the password file in the Apache configuration: | 
          
            | 127 |  | {{{ | 
          
            | 128 |  | <Location "/trac/login"> | 
          
            | 129 |  | AuthType Basic | 
          
            | 130 |  | AuthName "Trac" | 
          
            | 131 |  | AuthUserFile /somewhere/trac.htpasswd | 
          
            | 132 |  | Require valid-user | 
          
            | 133 |  | </Location> | 
          
            | 134 |  | }}} | 
          
            | 135 |  |  | 
          
            | 136 |  | If you're hosting multiple projects you can use the same password file for all of them: | 
          
            | 137 |  | {{{ | 
          
            | 138 |  | <LocationMatch "/trac/[^/]+/login"> | 
          
            | 139 |  | AuthType Basic | 
          
            | 140 |  | AuthName "Trac" | 
          
            | 141 |  | AuthUserFile /somewhere/trac.htpasswd | 
          
            | 142 |  | Require valid-user | 
          
            | 143 |  | </LocationMatch> | 
          
            | 144 |  | }}} | 
          
            | 145 |  |  | 
          
            | 146 |  | For better security, it is recommended that you either enable SSL or at least use the “digest” authentication scheme instead of “Basic”. Please read the [http://httpd.apache.org/docs/2.0/ Apache HTTPD documentation] to find out more. For example, on a Debian 4.0r1 (etch) system the relevant section  in apache configuration can look like this: | 
          
            | 147 |  | {{{ | 
          
            | 148 |  | <Location "/trac/login"> | 
          
            | 149 |  | LoadModule auth_digest_module /usr/lib/apache2/modules/mod_auth_digest.so | 
          
            | 150 |  | AuthType Digest | 
          
            | 151 |  | AuthName "trac" | 
          
            | 152 |  | AuthDigestDomain /trac | 
          
            | 153 |  | AuthUserFile /somewhere/trac.htpasswd | 
          
            | 154 |  | Require valid-user | 
          
            | 155 |  | </Location> | 
          
            | 156 |  | }}} | 
          
            | 157 |  | and you'll have to create your .htpasswd file with htdigest instead of htpasswd as follows: | 
          
            | 158 |  | {{{ | 
          
            | 159 |  | # htdigest /somewhere/trac.htpasswd trac admin | 
          
            | 160 |  | }}} | 
          
            | 161 |  | where the "trac" parameter above is the same as !AuthName above  ("Realm" in apache-docs). | 
          
            |  | 70 | See TracInstall#ConfiguringAuthentication. |