<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<TITLE>Apache HTTP Server Project</TITLE>
</HEAD>

<!-- Background white, links blue (unvisited), navy (visited), red (active) -->
<BODY
 BGCOLOR="#FFFFFF"
 TEXT="#000000"
 LINK="#0000FF"
 VLINK="#000080"
 ALINK="#FF0000"
>
<DIV ALIGN="CENTER">
 <IMG SRC="../images/sub.gif" ALT="[APACHE DOCUMENTATION]">
 <H3>
  Apache HTTP Server Version 1.3
 </H3>
</DIV>

<H1 ALIGN="CENTER">Known Problems in Clients</H1>

<P>Over time the Apache Group has discovered or been notified of problems
with various clients which we have had to work around, or explain.
This document describes these problems and the workarounds available.
It's not arranged in any particular order.  Some familiarity with the
standards is assumed, but not necessary.

<P>For brevity, <EM>Navigator</EM> will refer to Netscape's Navigator
product (which in later versions was renamed "Communicator" and
various other names), and <EM>MSIE</EM> will refer to Microsoft's
Internet Explorer product.  All trademarks and copyrights belong to
their respective companies.  We welcome input from the various client
authors to correct inconsistencies in this paper, or to provide us with
exact version numbers where things are broken/fixed.

<P>For reference,
<A HREF="ftp://ds.internic.net/rfc/rfc1945.txt">RFC1945</A>
defines HTTP/1.0, and
<A HREF="ftp://ds.internic.net/rfc/rfc2068.txt">RFC2068</A>
defines HTTP/1.1.  Apache as of version 1.2 is an HTTP/1.1 server (with an 
optional HTTP/1.0 proxy).

<P>Various of these workarounds are triggered by environment variables.
The admin typically controls which are set, and for which clients, by using 
<A HREF="../mod/mod_browser.html">mod_browser</A>.  Unless otherwise
noted all of these workarounds exist in versions 1.2 and later.

<H3><A NAME="trailing-crlf">Trailing CRLF on POSTs</A></H3>

<P>This is a legacy issue.  The CERN webserver required <CODE>POST</CODE>
data to have an extra <CODE>CRLF</CODE> following it.  Thus many
clients send an extra <CODE>CRLF</CODE> that
is not included in the <CODE>Content-Length</CODE> of the request.
Apache works around this problem by eating any empty lines which
appear before a request.

<H3><A NAME="broken-keepalive">Broken keepalive</A></H3>

<P>Various clients have had broken implementations of <EM>keepalive</EM>
(persistent connections).  In particular the Windows versions of
Navigator 2.0 get very confused when the server times out an
idle connection.  The workaround is present in the default config files:
<BLOCKQUOTE><CODE>
BrowserMatch Mozilla/2 nokeepalive
</CODE></BLOCKQUOTE>
Note that this matches some earlier versions of MSIE, which began the
practice of calling themselves <EM>Mozilla</EM> in their user-agent
strings just like Navigator.

<P>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 <CODE>nokeepalive</CODE> code
prior to 1.2.2 would not work with HTTP/1.1 clients.  You must apply
<A
HREF="http://www.apache.org/dist/patches/apply_to_1.2.1/msie_4_0b2_fixes.patch"
>this patch</A> to version 1.2.1.  Then add this to your config:
<BLOCKQUOTE><CODE>
BrowserMatch "MSIE 4\.0b2;" nokeepalive
</CODE></BLOCKQUOTE>

<H3><A NAME="force-response-1.0">Incorrect interpretation of
<CODE>HTTP/1.1</CODE> in response</A></H3>

<P>To quote from section 3.1 of RFC1945:
<BLOCKQUOTE>
HTTP uses a "&lt;MAJOR&gt;.&lt;MINOR&gt;" numbering scheme to indicate versions
of the protocol. The protocol versioning policy is intended to allow
the sender to indicate the format of a message and its capacity for
understanding further HTTP communication, rather than the features
obtained via that communication.
</BLOCKQUOTE>
Since Apache is an HTTP/1.1 server, it indicates so as part of its
response.  Many client authors mistakenly treat this part of the response
as an indication of the protocol that the response is in, and then refuse
to accept the response.

<P>The first major indication of this problem was with AOL's proxy servers.
When Apache 1.2 went into beta it was the first wide-spread HTTP/1.1
server.  After some discussion, AOL fixed their proxies.  In
anticipation of similar problems, the <CODE>force-response-1.0</CODE>
environment variable was added to Apache.  When present Apache will
indicate "HTTP/1.0" in response to an HTTP/1.0 client,
but will not in any other way change the response.

<P>The pre-1.1 Java Development Kit (JDK) that is used in many clients
(including Navigator 3.x and MSIE 3.x) exhibits this 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 any event the workaround:
<BLOCKQUOTE><CODE>
BrowserMatch Java/1.0 force-response-1.0 <BR>
BrowserMatch JDK/1.0 force-response-1.0 
</CODE></BLOCKQUOTE>

<P>RealPlayer 4.0 from Progressive Networks also exhibits this problem.
However they have fixed it in version 4.01 of the player, but version
4.01 uses the same <CODE>User-Agent</CODE> as version 4.0.  The
workaround is still:
<BLOCKQUOTE><CODE>
BrowserMatch "RealPlayer 4.0" force-response-1.0
</CODE></BLOCKQUOTE>

<H3><A NAME="msie4.0b2">Requests use HTTP/1.1 but responses must be
in HTTP/1.0</A></H3>

<P>MSIE 4.0b2 has this problem.  Its Java VM makes requests in HTTP/1.1
format but the responses must be in HTTP/1.0 format (in particular, it
does not understand <EM>chunked</EM> responses).  The workaround
is to fool Apache into believing the request came in HTTP/1.0 format.
<BLOCKQUOTE><CODE>
BrowserMatch "MSIE 4\.0b2;" downgrade-1.0 force-response-1.0
</CODE></BLOCKQUOTE>
This workaround is available in 1.2.2, and in a
<A
HREF="http://www.apache.org/dist/patches/apply_to_1.2.1/msie_4_0b2_fixes.patch"
>patch</A> against 1.2.1.

<H3><A NAME="257th-byte">Boundary problems with header parsing</A></H3>

<P>All versions of Navigator from 2.0 through 4.0b2 (and possibly later)
have a problem if the trailing CRLF of the response header starts at
offset 256, 257 or 258 of the response.  A BrowserMatch for this would
match on nearly every hit, so the workaround is enabled automatically
on all responses.  The workaround implemented detects when this condition would
occur in a response and adds extra padding to the header to push the
trailing CRLF past offset 258 of the response.

<H3><A NAME="boundary-string">Multipart responses and Quoted Boundary
Strings</A></H3>

<P>On multipart responses some clients will not accept quotes (")
around the boundary string.  The MIME standard recommends 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.

<H3><A NAME="byterange-requests">Byterange requests</A></H3>

<P>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 MSIE 3.0 for the MAC
exhibit this behaviour, and
it will appear in the servers' access logs as (failed) attempts to
retrieve a URL with a trailing ";xxx-yyy".  Apache does not attempt
to implement this at all.

<P>A subsequent draft of this standard defines a header
<CODE>Request-Range</CODE>, and a response type
<CODE>multipart/x-byteranges</CODE>.  The HTTP/1.1 standard includes
this draft with a few fixes, and it defines the header
<CODE>Range</CODE> and type <CODE>multipart/byteranges</CODE>.

<P>Navigator (versions 2 and 3) sends both <CODE>Range</CODE> and
<CODE>Request-Range</CODE> headers (with the same value), but does not
accept a <CODE>multipart/byteranges</CODE> response.  The response must
be <CODE>multipart/x-byteranges</CODE>.  As a workaround, if Apache
receives a <CODE>Request-Range</CODE> header it considers it "higher
priority" than a <CODE>Range</CODE> header and in response uses
<CODE>multipart/x-byteranges</CODE>.

<P>The Adobe Acrobat Reader plugin makes extensive use of byteranges and
prior to version 3.01 supports only the <CODE>multipart/x-byterange</CODE>
response.  Unfortunately there is no clue that it is the plugin
making the request.  If the plugin is used with Navigator, the above
workaround works fine.  But if the plugin is used with MSIE 3 (on
Windows) the workaround won't work because MSIE 3 doesn't give the
<CODE>Range-Request</CODE> clue that Navigator does.  To workaround this,
Apache special cases "MSIE 3" in the <CODE>User-Agent</CODE> and serves
<CODE>multipart/x-byteranges</CODE>.  Note that the necessity for this
with MSIE 3 is actually due to the Acrobat plugin, not due to the browser.

<P>Netscape Communicator appears to not issue the non-standard
<CODE>Request-Range</CODE> header.  When an Acrobat plugin prior to
version 3.01 is used with it, it will not properly understand byteranges.
The user must upgrade their Acrobat reader to 3.01.

<H3><A NAME="cookie-merge"><CODE>Set-Cookie</CODE> header is
unmergeable</A></H3>

<P>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
<CODE>Set-Cookie</CODE> header is sent separately.  When parsing the
headers returned by a CGI, Apache will explicitly avoid merging any
<CODE>Set-Cookie</CODE> headers.

<H3><A NAME="gif89-expires"><CODE>Expires</CODE> headers and GIF89A
animations</A></H3>

<P>Navigator versions 2 through 4 will erroneously re-request
GIF89A animations on each loop of the animation if the first
response included an <CODE>Expires</CODE> 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 <A
HREF="http://www.arctic.org/~dgaudet/patches/apache-1.2-gif89-expires-hack.patch">1.2</A>
and for <A
HREF="http://www.arctic.org/~dgaudet/patches/apache-1.3-gif89-expires-hack.patch">1.3</A>.

<H3><A NAME="no-content-length"><CODE>POST</CODE> without
<CODE>Content-Length</CODE></A></H3>

<P>In certain situations Navigator 3.01 through 3.03 appear to incorrectly
issue a POST without the request body.  There is no
known workaround.  It has been fixed in Navigator 3.04, Netscapes
provides some
<A HREF="http://help.netscape.com/kb/client/971014-42.html">information</A>.
There's also
<A HREF="http://www.arctic.org/~dgaudet/apache/no-content-length/">
some information</A> about the actual problem.

<H3><A NAME="jdk-12-bugs">JDK 1.2 betas lose parts of responses.</A></H3>

<P>The http client in the JDK1.2beta2 and beta3 will throw away the first part of
the response body when both the headers and the first part of the body are sent
in the same network packet AND keep-alive's are being used. If either condition
is not met then it works fine.

<P>See also Bug-ID's 4124329 and 4125538 at the java developer connection.

<P>If you are seeing this bug yourself, you can add the following BrowserMatch
directive to work around it:

<BLOCKQUOTE><CODE>
BrowserMatch "Java1\.2beta[23]" nokeepalive
</CODE></BLOCKQUOTE>

<P>We don't advocate this though since bending over backwards for beta software
is usually not a good idea; ideally it gets fixed, new betas or a final release
comes out, and no one uses the broken old software anymore.  In theory.

<H3><A NAME="content-type-persistence"><CODE>Content-Type</CODE> change
is not noticed after reload</A></H3>

<P>Navigator (all versions?) will cache the <CODE>content-type</CODE>
for an object "forever".  Using reload or shift-reload will not cause
Navigator to notice a <CODE>content-type</CODE> 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 <CODE>mime.types</CODE>
file which does not map <CODE>.htm</CODE> to <CODE>text/html</CODE>,
in this case Apache will default to sending <CODE>text/plain</CODE>.
If the user requests the page and it is served as <CODE>text/plain</CODE>.
After the admin fixes the server, the user will have to flush their caches
before the object will be shown with the correct <CODE>text/html</CODE>
type.

<h3><a name="msie-cookie-y2k">MSIE Cookie problem with expiry date in
the year 2000</a></h3>

<p>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.

<h3><a name="lynx-negotiate-trans">Lynx incorrectly asking for transparent
content negotiation</a></h3>

<p>The Lynx browser versions 2.7 and 2.8 send a "negotiate: trans" header
in their requests, which is an indication the browser supports transparent
content negotiation (TCN).  However the browser does not support TCN.
As of version 1.3.4, Apache supports TCN, and this causes problems with
these versions of Lynx.  As a workaround future versions of Apache will
ignore this header when sent by the Lynx client.

<h3><a name="ie40-vary">MSIE 4.0 mishandles Vary response header</a></h3>

<p>MSIE 4.0 does not handle a Vary header properly.  The Vary header is
generated by mod_rewrite in apache 1.3.  The result is an error from MSIE
saying it cannot download the requested file.  There are more details
in <a href="http://bugs.apache.org/index/full/4118">PR#4118</a>.
</P>
<P>
A workaround is to add the following to your server's configuration
files:
</P>
<PRE>
    BrowserMatch "MSIE 4\.0" force-no-vary
</PRE>
<P>
(This workaround is only available with releases <STRONG>after</STRONG>
1.3.6 of the Apache Web server.)
</P>


<HR>

<H3 ALIGN="CENTER">
 Apache HTTP Server Version 1.3
</H3>

<A HREF="./"><IMG SRC="../images/index.gif" ALT="Index"></A>
<A HREF="../"><IMG SRC="../images/home.gif" ALT="Home"></A>

</BODY>
</HTML>

