mirror of
https://github.com/apache/httpd.git
synced 2026-10-23 22:49:01 +03:00
While at it, synch with trunk, fix a typo and remove some trailing spaces. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1934651 13f79535-47bb-0310-9956-ffa450edef68
661 lines
28 KiB
XML
661 lines
28 KiB
XML
<?xml version="1.0" encoding="UTF-8" ?>
|
|
<!DOCTYPE manualpage SYSTEM "./style/manualpage.dtd">
|
|
<?xml-stylesheet type="text/xsl" href="./style/manual.en.xsl"?>
|
|
<!-- $LastChangedRevision$ -->
|
|
|
|
<!--
|
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
|
contributor license agreements. See the NOTICE file distributed with
|
|
this work for additional information regarding copyright ownership.
|
|
The ASF licenses this file to You 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, software
|
|
distributed 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 and
|
|
limitations under the License.
|
|
-->
|
|
|
|
<manualpage metafile="env.xml.meta">
|
|
|
|
<title>Environment Variables in Apache httpd</title>
|
|
|
|
<summary>
|
|
<p>There are two kinds of environment variables that affect
|
|
the Apache HTTP Server.</p>
|
|
|
|
<p>First, there are the environment variables controlled by
|
|
the underlying operating system. These are set before the
|
|
server starts. They can be used in expansions in configuration
|
|
files, and can optionally be passed to CGI scripts and SSI
|
|
using the PassEnv directive.</p>
|
|
|
|
<p>Second, the Apache HTTP Server provides a mechanism for storing
|
|
information in named variables that are also called <em>environment
|
|
variables</em>. This information can be used to control various
|
|
operations such as logging or access control. The variables are
|
|
also used as a mechanism to communicate with external programs
|
|
such as CGI scripts. This document discusses different ways to
|
|
manipulate and use these variables.</p>
|
|
|
|
<p>Although these variables are referred to as <em>environment
|
|
variables</em>, they are not the same as the environment
|
|
variables controlled by the underlying operating system.
|
|
Instead, these variables are stored and manipulated in an
|
|
internal httpd structure. They only become actual operating
|
|
system environment variables when they are provided to CGI
|
|
scripts and Server Side Include scripts. If you wish to
|
|
manipulate the operating system environment under which the
|
|
server itself runs, you must use the standard environment
|
|
manipulation mechanisms provided by your operating system
|
|
shell.</p>
|
|
</summary>
|
|
|
|
<section id="setting">
|
|
<title>Setting Environment Variables</title>
|
|
<related>
|
|
<modulelist>
|
|
<module>mod_cache</module>
|
|
<module>mod_env</module>
|
|
<module>mod_rewrite</module>
|
|
<module>mod_setenvif</module>
|
|
<module>mod_unique_id</module>
|
|
</modulelist>
|
|
<directivelist>
|
|
<directive module="mod_setenvif">BrowserMatch</directive>
|
|
<directive module="mod_setenvif">BrowserMatchNoCase</directive>
|
|
<directive module="mod_env">PassEnv</directive>
|
|
<directive module="mod_rewrite">RewriteRule</directive>
|
|
<directive module="mod_env">SetEnv</directive>
|
|
<directive module="mod_setenvif">SetEnvIf</directive>
|
|
<directive module="mod_setenvif">SetEnvIfNoCase</directive>
|
|
<directive module="mod_env">UnsetEnv</directive>
|
|
</directivelist>
|
|
</related>
|
|
|
|
<section id="basic-manipulation">
|
|
<title>Basic Environment Manipulation</title>
|
|
|
|
<p>The most basic way to set an environment variable in Apache
|
|
is using the unconditional <directive module="mod_env"
|
|
>SetEnv</directive> directive. Variables may also be passed from
|
|
the environment of the shell which started the server using the
|
|
<directive module="mod_env">PassEnv</directive> directive.</p>
|
|
|
|
</section>
|
|
<section id="conditional">
|
|
<title>Conditional Per-Request Settings</title>
|
|
|
|
<p>For additional flexibility, the directives provided by
|
|
<module>mod_setenvif</module> 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 when a
|
|
specific browser (User-Agent) is making a request, or only when
|
|
a specific Referer [sic] header is found. Even more flexibility
|
|
is available through the <module>mod_rewrite</module>'s <directive
|
|
module="mod_rewrite">RewriteRule</directive> which uses the
|
|
<code>[E=...]</code> option to set environment variables.</p>
|
|
|
|
</section>
|
|
<section id="unique-identifiers">
|
|
<title>Unique Identifiers</title>
|
|
|
|
<p>Finally, <module>mod_unique_id</module> sets the environment
|
|
variable <code>UNIQUE_ID</code> for each request to a value which is
|
|
guaranteed to be unique across "all" requests under very
|
|
specific conditions.</p>
|
|
|
|
</section>
|
|
<section id="standard-cgi">
|
|
<title>Standard CGI Variables</title>
|
|
|
|
<p>In addition to all environment variables set within the
|
|
Apache configuration and passed from the shell, CGI scripts and
|
|
SSI pages are provided with a set of environment variables
|
|
containing meta-information about the request as required by
|
|
the CGI specification (<rfc>3875</rfc>).</p>
|
|
|
|
</section>
|
|
<section id="caveats">
|
|
<title>Some Caveats</title>
|
|
|
|
<ul>
|
|
<li>It is not possible to override or change the standard CGI
|
|
variables using the environment manipulation directives.</li>
|
|
|
|
<li>When <program>suexec</program> is used to launch
|
|
CGI scripts, the environment will be cleaned down to a set of
|
|
<em>safe</em> variables before CGI scripts are launched. The
|
|
list of <em>safe</em> variables is defined at compile-time in
|
|
<code>suexec.c</code>.</li>
|
|
|
|
<li>For portability reasons, the names of environment
|
|
variables may contain only letters, numbers, and the
|
|
underscore character. In addition, the first character may
|
|
not be a number. Characters which do not match this
|
|
restriction will be replaced by an underscore when passed to
|
|
CGI scripts and SSI pages.</li>
|
|
|
|
<li>A special case are HTTP headers which are passed to CGI
|
|
scripts and the like via environment variables (see below).
|
|
They are converted to uppercase and only dashes are replaced with
|
|
underscores; if the header contains any other (invalid) character,
|
|
the whole header is silently dropped. See <a href="#fixheader">
|
|
below</a> for a workaround.</li>
|
|
|
|
<li>The <directive module="mod_env">SetEnv</directive> directive runs
|
|
late during request processing meaning that directives such as
|
|
<directive module="mod_setenvif">SetEnvIf</directive> and <directive
|
|
module="mod_rewrite">RewriteCond</directive> will not see the
|
|
variables set with it.</li>
|
|
|
|
<li>When the server looks up a path via an internal
|
|
<glossary ref="subrequest">subrequest</glossary> such as looking
|
|
for a <directive module="mod_dir" >DirectoryIndex</directive>
|
|
or generating a directory listing with <module>mod_autoindex</module>,
|
|
per-request environment variables are <em>not</em> inherited in the
|
|
subrequest. Additionally,
|
|
<directive module="mod_setenvif">SetEnvIf</directive> directives
|
|
are not separately evaluated in the subrequest due to the API phases
|
|
<module>mod_setenvif</module> takes action in.</li>
|
|
</ul>
|
|
</section>
|
|
</section>
|
|
<section id="using">
|
|
<title>Using Environment Variables</title>
|
|
|
|
<related>
|
|
<modulelist>
|
|
<module>mod_authz_host</module>
|
|
<module>mod_cgi</module>
|
|
<module>mod_ext_filter</module>
|
|
<module>mod_headers</module>
|
|
<module>mod_include</module>
|
|
<module>mod_log_config</module>
|
|
<module>mod_rewrite</module>
|
|
</modulelist>
|
|
<directivelist>
|
|
<directive module="mod_authz_core">Require</directive>
|
|
<directive module="mod_log_config">CustomLog</directive>
|
|
<directive module="mod_access_compat">Allow</directive>
|
|
<directive module="mod_access_compat">Deny</directive>
|
|
<directive module="mod_ext_filter">ExtFilterDefine</directive>
|
|
<directive module="mod_headers">Header</directive>
|
|
<directive module="mod_log_config">LogFormat</directive>
|
|
<directive module="mod_rewrite">RewriteCond</directive>
|
|
<directive module="mod_rewrite">RewriteRule</directive>
|
|
</directivelist>
|
|
</related>
|
|
|
|
<note>
|
|
<title>Modern alternative: Expressions</title>
|
|
<p>Many use cases that previously required setting and testing
|
|
environment variables — including conditional headers, access
|
|
control, and logging — can now be handled more directly using
|
|
<directive module="core" type="section">If</directive> expressions
|
|
with the <code>reqenv</code> function. See
|
|
<a href="expr.html">Expressions in Apache HTTP Server</a> for the
|
|
expression syntax and the full list of available
|
|
<a href="expr.html#vars">variables</a>.</p>
|
|
</note>
|
|
|
|
<section id="cgi-scripts">
|
|
<title>CGI Scripts</title>
|
|
|
|
<p>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 variables
|
|
set within the Apache configuration. For more details, see the
|
|
<a href="howto/cgi.html">CGI tutorial</a>.</p>
|
|
|
|
</section>
|
|
<section id="ssi-pages">
|
|
<title>SSI Pages</title>
|
|
|
|
<p>Server-parsed (SSI) documents processed by
|
|
<module>mod_include</module>'s
|
|
<code>INCLUDES</code> filter can print environment variables
|
|
using the <code>echo</code> element, and can use environment
|
|
variables in flow control elements to makes parts of a page
|
|
conditional on characteristics of a request. Apache also
|
|
provides SSI pages with the standard CGI environment variables
|
|
as discussed above. For more details, see the <a
|
|
href="howto/ssi.html">SSI tutorial</a>.</p>
|
|
|
|
</section>
|
|
<section id="access-control">
|
|
<title>Access Control</title>
|
|
|
|
<p>Access to the server can be controlled based on
|
|
environment variables using the <code>Require env</code>
|
|
and <code>Require not env</code> directives. In combination with
|
|
<directive module="mod_setenvif">SetEnvIf</directive>, this
|
|
allows for flexible control of access to the server based on
|
|
characteristics of the client. For example, you can use these
|
|
directives to deny access to a particular browser (User-Agent).
|
|
For more complex conditions,
|
|
<a href="expr.html"><code>Require expr</code></a> provides
|
|
an alternative that can evaluate environment variables using
|
|
the <code>reqenv</code> function alongside other request properties.
|
|
</p>
|
|
|
|
</section>
|
|
<section id="logging">
|
|
<title>Conditional Logging</title>
|
|
|
|
<p>Environment variables can be logged in the access log using
|
|
the <directive module="mod_log_config">LogFormat</directive>
|
|
option <code>%e</code>. In addition, the decision on whether
|
|
or not to log requests can be made based on the status of
|
|
environment variables using the conditional form of the
|
|
<directive module="mod_log_config">CustomLog</directive>
|
|
directive. In combination with <directive module="mod_setenvif"
|
|
>SetEnvIf</directive> this allows for flexible control of which
|
|
requests are logged. For example, you can choose not to log
|
|
requests for filenames ending in <code>gif</code>, or you can
|
|
choose to only log requests from clients which are outside your
|
|
subnet.</p>
|
|
|
|
</section>
|
|
<section id="response-headers">
|
|
<title>Conditional Response Headers</title>
|
|
|
|
<p>The <directive module="mod_headers">Header</directive>
|
|
directive can use the presence or
|
|
absence of an environment variable to determine whether or not
|
|
a certain HTTP header will be placed in the response to the
|
|
client. This allows, for example, a certain response header to
|
|
be sent only if a corresponding header is received in the
|
|
request from the client.</p>
|
|
|
|
</section>
|
|
|
|
<section id="external-filter">
|
|
<title>External Filter Activation</title>
|
|
|
|
<p>External filters configured by <module>mod_ext_filter</module>
|
|
using the <directive
|
|
module="mod_ext_filter">ExtFilterDefine</directive> directive can
|
|
by activated conditional on an environment variable using the
|
|
<code>disableenv=</code> and <code>enableenv=</code> options.</p>
|
|
</section>
|
|
|
|
<section id="url-rewriting">
|
|
<title>URL Rewriting</title>
|
|
|
|
<p>The <code>%{ENV:<em>variable</em>}</code> form of
|
|
<em>TestString</em> in the <directive module="mod_rewrite"
|
|
>RewriteCond</directive> allows <module>mod_rewrite</module>'s rewrite
|
|
engine to make decisions conditional on environment variables.
|
|
Note that the variables accessible in <module>mod_rewrite</module>
|
|
without the <code>ENV:</code> prefix are not actually environment
|
|
variables. Rather, they are variables special to
|
|
<module>mod_rewrite</module> which cannot be accessed from other
|
|
modules.</p>
|
|
</section>
|
|
</section>
|
|
|
|
<section id="cgi">
|
|
<title>CGI environment variables</title>
|
|
|
|
<p>The CGI specification (<rfc section="4.1">3875</rfc>) defines a number of environment
|
|
variables that expand on those defined by the HTTP spec.
|
|
These have been adopted more broadly, and are a standard
|
|
part of passing information between the browser and the
|
|
server, and between processes on the server side. Here we
|
|
discuss a few of these. For the complete list of request
|
|
variables available in <a href="expr.html">expressions</a>
|
|
(including <code>REQUEST_URI</code>, <code>REMOTE_ADDR</code>,
|
|
<code>SERVER_NAME</code>, and many others), see the
|
|
<a href="expr.html#vars">expression variables</a> reference.</p>
|
|
|
|
<p>Refer to the CGI spec for further details of the standard
|
|
CGI meta-variables.</p>
|
|
|
|
<section id="query-string">
|
|
<title>QUERY_STRING</title>
|
|
<p>The <code>QUERY_STRING</code> variable is set to
|
|
anything that appears after a question mark (?) at the
|
|
end of a requested URL. This is used to pass
|
|
information to the server, and may be divided into
|
|
key/value pairs. The string should be
|
|
URL-encoded.</p>
|
|
|
|
<example>
|
|
https://example.com/path/resource.php?key1=value1&key2=another%20value
|
|
</example>
|
|
|
|
<p>In the example here, the variable
|
|
<code>QUERY_STRING</code> is set to everything
|
|
following the ?, and the receiving application (e.g.
|
|
CGI or a PHP script, perhaps) is responsible for
|
|
parsing the key/value pairs.</p>
|
|
|
|
|
|
</section>
|
|
|
|
<section id="path-info">
|
|
<title>PATH_INFO</title>
|
|
|
|
<p>The variable <code>PATH_INFO</code> is set to
|
|
the any value that appears after a matches resource
|
|
at the end of the URL, not including any
|
|
<code>QUERY_STRING</code>. This is best shown by
|
|
an example:</p>
|
|
|
|
<example>
|
|
https://example.com/resource.php/additional/data?key1=value1
|
|
</example>
|
|
|
|
<p>In the example shown,
|
|
<code>PATH_INFO</code> will be set to
|
|
<code>/additional/data</code> and
|
|
<code>QUERY_STRING</code> will be set to
|
|
<code>key1=value1</code>.</p>
|
|
</section>
|
|
|
|
</section>
|
|
|
|
<section id="special">
|
|
<title>Special Purpose Environment Variables</title>
|
|
|
|
<p>Interoperability problems have led to the introduction of
|
|
mechanisms to modify the way Apache behaves when talking to
|
|
particular clients. To make these mechanisms as flexible as
|
|
possible, they are invoked by defining environment variables,
|
|
typically with <directive module="mod_setenvif"
|
|
>BrowserMatch</directive>, though <directive module="mod_env"
|
|
>SetEnv</directive> and <directive module="mod_env"
|
|
>PassEnv</directive> could also be used, for example.</p>
|
|
|
|
<section id="downgrade">
|
|
<title>downgrade-1.0</title>
|
|
|
|
<p>This forces the request to be treated as a HTTP/1.0 request
|
|
even if it was in a later dialect.</p>
|
|
|
|
</section>
|
|
<section id="force-gzip">
|
|
<title>force-gzip</title>
|
|
<p>If you have the <code>DEFLATE</code> filter activated, this
|
|
environment variable will ignore the accept-encoding setting of
|
|
your browser and will send compressed output unconditionally.</p>
|
|
</section>
|
|
<section id="force-no-vary">
|
|
<title>force-no-vary</title>
|
|
|
|
<p>This causes any <code>Vary</code> fields to be removed from
|
|
the response header before it is sent back to the client. Some
|
|
clients don't interpret this field correctly; setting this
|
|
variable can work around this problem. Setting this variable
|
|
also implies <strong>force-response-1.0</strong>.</p>
|
|
|
|
</section>
|
|
<section id="force-response">
|
|
<title>force-response-1.0</title>
|
|
|
|
<p>This forces an HTTP/1.0 response to clients making an HTTP/1.0
|
|
request. It was originally
|
|
implemented as a result of a 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.</p>
|
|
|
|
</section>
|
|
|
|
<section id="gzip-only-text-html">
|
|
<title>gzip-only-text/html</title>
|
|
|
|
<p>When set to a value of "1", this variable disables the
|
|
<code>DEFLATE</code> output filter provided by
|
|
<module>mod_deflate</module> for content-types other than
|
|
<code>text/html</code>. If you'd rather
|
|
use statically compressed files, <module>mod_negotiation</module>
|
|
evaluates the variable as well (not only for gzip, but for all
|
|
encodings that differ from "identity").</p>
|
|
</section>
|
|
|
|
<section id="no-gzip"><title>no-gzip</title>
|
|
|
|
<p>When set, the <code>DEFLATE</code> filter of
|
|
<module>mod_deflate</module> will be turned off and
|
|
<module>mod_negotiation</module> will refuse to deliver encoded
|
|
resources.</p>
|
|
|
|
</section>
|
|
|
|
<section id="no-cache"><title>no-cache</title>
|
|
<p><em>Available in versions 2.2.12 and later</em></p>
|
|
|
|
<p>When set, <module>mod_cache</module> will not save an otherwise
|
|
cacheable response. This environment variable does not influence
|
|
whether a response already in the cache will be served for the current
|
|
request.</p>
|
|
|
|
</section>
|
|
|
|
<section id="nokeepalive">
|
|
<title>nokeepalive</title>
|
|
|
|
<p>This disables <directive module="core">KeepAlive</directive>
|
|
when set.</p>
|
|
|
|
</section>
|
|
|
|
<section id="prefer-language"><title>prefer-language</title>
|
|
|
|
<p>This influences <module>mod_negotiation</module>'s behavior. If
|
|
it contains a language tag (such as <code>en</code>, <code>ja</code>
|
|
or <code>x-klingon</code>), <module>mod_negotiation</module> tries
|
|
to deliver a variant with that language. If there's no such variant,
|
|
the normal <a href="content-negotiation.html">negotiation</a> process
|
|
applies.</p>
|
|
|
|
</section>
|
|
|
|
<section id="redirect-carefully">
|
|
<title>redirect-carefully</title>
|
|
|
|
<p>This forces the server to be more careful when sending a redirect
|
|
to the client. This is typically used when a client has a known
|
|
problem handling redirects. This was originally implemented as a
|
|
result of a problem with Microsoft's WebFolders software which has
|
|
a problem handling redirects on directory resources via DAV
|
|
methods.</p>
|
|
|
|
</section>
|
|
|
|
<section id="suppress-error-charset">
|
|
<title>suppress-error-charset</title>
|
|
|
|
<p>When Apache issues a redirect in response to a client request,
|
|
the response includes some actual text to be displayed in case
|
|
the client can't (or doesn't) automatically follow the redirection.
|
|
Apache ordinarily labels this text according to the character set
|
|
which it uses, which is ISO-8859-1.</p>
|
|
|
|
<p> However, if the redirection is to a page that uses a different
|
|
character set, some broken browser versions will try to use the
|
|
character set from the redirection text rather than the actual page.
|
|
This can result in Greek, for instance, being incorrectly rendered.</p>
|
|
|
|
<p>Setting this environment variable causes Apache to omit the character
|
|
set for the redirection text, and these broken browsers will then correctly
|
|
use that of the destination page.</p>
|
|
|
|
<note type="warning">
|
|
<title>Security note</title>
|
|
|
|
<p>Sending error pages without a specified character set may
|
|
allow a cross-site-scripting attack for existing browsers (MSIE)
|
|
which do not follow the HTTP/1.1 specification and attempt to
|
|
"guess" the character set from the content. Such browsers can
|
|
be easily fooled into using the UTF-7 character set, and UTF-7
|
|
content from input data (such as the request-URI) will not be
|
|
escaped by the usual escaping mechanisms designed to prevent
|
|
cross-site-scripting attacks.</p>
|
|
</note>
|
|
|
|
</section>
|
|
|
|
<section id="proxy"><title>force-proxy-request-1.0, proxy-nokeepalive, proxy-sendchunked,
|
|
proxy-sendcl, proxy-chain-auth, proxy-interim-response, proxy-initial-not-pooled</title>
|
|
|
|
<p>These directives alter the protocol behavior of
|
|
<module>mod_proxy</module>. See the <module>mod_proxy</module> and <module>mod_proxy_http</module>
|
|
documentation for more details.</p>
|
|
</section>
|
|
|
|
<section id="cgilike"><title>ap_trust_cgilike_cl</title>
|
|
<p><em>Available in 2.4.59 and later</em></p>
|
|
<p> This variable allows a script running in CGI-like module to supply its
|
|
own Content-Length HTTP response header. It should
|
|
only be set on configuration sections that contain trusted scripts.
|
|
</p>
|
|
</section>
|
|
|
|
</section>
|
|
|
|
<section id="redirect-vars"><title>REDIRECT_ variables</title>
|
|
|
|
<p>When an internal redirect occurs — whether from an
|
|
<directive module="core">ErrorDocument</directive>,
|
|
<module>mod_rewrite</module>,
|
|
<directive module="mod_dir">FallbackResource</directive>, or
|
|
any other internal redirect mechanism — the environment
|
|
variables from the original request are made available to the
|
|
redirect target with a <code>REDIRECT_</code> prefix.</p>
|
|
|
|
<p>Two additional variables are always set:</p>
|
|
|
|
<dl>
|
|
<dt><code>REDIRECT_URL</code></dt>
|
|
<dd>The URL-path of the original request before the internal
|
|
redirect. This is set by the core server, not by any specific
|
|
module.</dd>
|
|
|
|
<dt><code>REDIRECT_STATUS</code></dt>
|
|
<dd>The HTTP status code that triggered the redirect. For
|
|
error documents this is the error status (e.g., 404). For
|
|
internal redirects from <module>mod_rewrite</module> or
|
|
<directive module="mod_dir">FallbackResource</directive>,
|
|
this is typically 200.</dd>
|
|
</dl>
|
|
|
|
<p>For example, if <code>REQUEST_URI</code> was
|
|
<code>/original/path</code> and an internal redirect sends the
|
|
request to <code>/handler.php</code>, then the redirect target
|
|
will see <code>REDIRECT_URL=/original/path</code> and
|
|
<code>REQUEST_URI=/handler.php</code>.</p>
|
|
|
|
<p>These variables are available to CGI scripts, SSI pages, and
|
|
in <a href="expr.html">expressions</a>. For more information
|
|
about REDIRECT_ variables in the context of error documents,
|
|
see <a href="custom-error.html">Custom Error Responses</a>.</p>
|
|
|
|
</section>
|
|
|
|
<section id="examples">
|
|
<title>Examples</title>
|
|
|
|
<section id="fixheader">
|
|
<title>Passing broken headers to CGI scripts</title>
|
|
|
|
<p>Starting with version 2.4, Apache is more strict about how HTTP
|
|
headers are converted to environment variables in <module>mod_cgi
|
|
</module> and other modules: Previously any invalid characters
|
|
in header names were simply translated to underscores. This allowed
|
|
for some potential cross-site-scripting attacks via header injection.</p>
|
|
|
|
<p>If you have to support a client which sends broken headers and
|
|
which can't be fixed, a simple workaround involving <module>mod_setenvif
|
|
</module> and <module>mod_headers</module> allows you to still accept
|
|
these headers:</p>
|
|
|
|
<highlight language="config">
|
|
#
|
|
# The following works around a client sending a broken Accept_Encoding
|
|
# header.
|
|
#
|
|
SetEnvIfNoCase ^Accept.Encoding$ ^(.*)$ fix_accept_encoding=$1
|
|
RequestHeader set Accept-Encoding %{fix_accept_encoding}e env=fix_accept_encoding
|
|
</highlight>
|
|
|
|
</section>
|
|
|
|
<section id="misbehaving">
|
|
<title>Changing protocol behavior with misbehaving clients</title>
|
|
|
|
<p>Earlier versions recommended that the following lines be included in
|
|
httpd.conf to deal with known client problems. Since the affected clients
|
|
are no longer seen in the wild, this configuration is likely no-longer
|
|
necessary.</p>
|
|
<highlight language="config">
|
|
#
|
|
# 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" nokeepalive
|
|
BrowserMatch "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 understand a
|
|
# basic 1.1 response.
|
|
#
|
|
BrowserMatch "RealPlayer 4\.0" force-response-1.0
|
|
BrowserMatch "Java/1\.0" force-response-1.0
|
|
BrowserMatch "JDK/1\.0" force-response-1.0
|
|
</highlight>
|
|
|
|
</section>
|
|
<section id="no-img-log">
|
|
<title>Do not log requests for images in the access log</title>
|
|
|
|
<p>This example keeps requests for images from appearing in the
|
|
access log. It can be easily modified to prevent logging of
|
|
particular directories, or to prevent logging of requests
|
|
coming from particular hosts.</p>
|
|
|
|
<highlight language="config">
|
|
SetEnvIf Request_URI \.gif image-request
|
|
SetEnvIf Request_URI \.jpg image-request
|
|
SetEnvIf Request_URI \.png image-request
|
|
CustomLog "logs/access_log" common env=!image-request
|
|
</highlight>
|
|
|
|
</section>
|
|
<section id="image-theft">
|
|
<title>Prevent "Image Theft"</title>
|
|
|
|
<p>This example shows how to keep people not on your server
|
|
from using images on your server as inline-images on their
|
|
pages. This is not a recommended configuration, but it can work
|
|
in limited circumstances. We assume that all your images are in
|
|
a directory called <code>/web/images</code>.</p>
|
|
|
|
<highlight language="config">
|
|
SetEnvIf Referer "^http://www\.example\.com/" local_referal
|
|
# Allow browsers that do not send Referer info
|
|
SetEnvIf Referer "^$" local_referal
|
|
<Directory "/web/images">
|
|
Require env local_referal
|
|
</Directory>
|
|
</highlight>
|
|
|
|
<p>For more information about this technique, see the
|
|
"<a href="https://www.serverwatch.com/guides/keeping-your-images-from-adorning-other-sites/"
|
|
>Keeping Your Images from Adorning Other Sites</a>"
|
|
tutorial on ServerWatch.</p>
|
|
</section>
|
|
</section>
|
|
</manualpage>
|