Keep_alive failure although Header set Connection keep-alive

In this test although I have Header set Connection keep-alive in .htaccess the test shows Use persistent connections (keep alive): 6/100

Did I do anything wrong in my .htaccess?

Thank you

Here is my .htaccess


Apache/PHP/Drupal settings:

Protect files and directories from prying eyes.

<FilesMatch “.(engine|inc|info|install|make|module|profile|test|po|sh|.sql|theme|tpl(.php)?|xtmpl)(|~|.sw[op]|.bak|.orig|.save)?$|^(…|Entries.|Repository|Root|Tag|Template)$|^#.#$|.php(~|.sw[op]|.bak|$”>
Order allow,deny

Don’t show directory listings for URLs which map to a directory.

Options -Indexes

Follow symbolic links in this directory.

Options +FollowSymLinks

Make Drupal handle any 404 errors.

ErrorDocument 404 /index.php

Set the default handler.

DirectoryIndex index.php index.html index.htm

Override PHP settings that cannot be changed at runtime. See

sites/default/default.settings.php and drupal_environment_initialize() in

includes/ for settings that can be changed at runtime.

PHP 5, Apache 1 and 2.

php_flag magic_quotes_gpc off php_flag magic_quotes_sybase off php_flag register_globals off php_flag session.auto_start off php_value mbstring.http_input pass php_value mbstring.http_output pass php_flag mbstring.encoding_translation off

Requires mod_expires to be enabled.

# Enable expirations. ExpiresActive On

ExpiresDefault “access plus 1 month”

cache.appcache needs re-requests in FF 3.6 (thanks Remy ~Introducing HTML5)

ExpiresByType text/cache-manifest “access plus 0 seconds”

Your document html

ExpiresByType text/html “access plus 0 seconds”


ExpiresByType text/xml “access plus 0 seconds”
ExpiresByType application/xml “access plus 0 seconds”
ExpiresByType application/json “access plus 0 seconds”

Favicon (cannot be renamed)

ExpiresByType image/x-icon “access plus 1 week”
ExpiresByType image/gif “access plus 1 month”
ExpiresByType image/png “access plus 1 month”
ExpiresByType image/jpeg “access plus 1 month”

HTC files (css3pie)

ExpiresByType text/x-component “access plus 1 month”


ExpiresByType application/x-font-ttf “access plus 1 month”
ExpiresByType font/opentype “access plus 1 month”
ExpiresByType application/x-font-woff “access plus 1 month”
ExpiresByType image/svg+xml “access plus 1 month”
ExpiresByType application/ “access plus 1 month”

CSS and JavaScript

ExpiresByType text/css “access plus 1 year”
ExpiresByType application/javascript “access plus 1 year”

Cache all files for 2 weeks after access (A).

ExpiresDefault A1209600

<FilesMatch .php$>
# Do not allow PHP scripts to be cached unless they explicitly send cache
# headers themselves. Otherwise all scripts would have to overwrite the
# headers set by mod_expires if they want another caching behavior. This may
# fail if an error occurs early in the bootstrap process, and it may cause
# problems if a non-Drupal PHP file is installed in a subdirectory.
ExpiresActive Off

Various rewrite rules.

RewriteEngine on

Set “protossl” to “s” if we were accessed via https://. This is used later

if you enable “www.” stripping or enforcement, in order to ensure that

you don’t bounce between http and https.

RewriteRule ^ - [E=protossl]
RewriteCond %{HTTPS} on
RewriteRule ^ - [E=protossl:s]

Block access to “hidden” directories whose names begin with a period. This

includes directories used by version control systems such as Subversion or

Git to store control files. Files whose names begin with a period, as well

as the control files used by CVS, are protected by the FilesMatch directive


NOTE: This only works when mod_rewrite is loaded. Without mod_rewrite, it is

not possible to block access to entire directories from .htaccess, because

is not allowed here.

If you do not have mod_rewrite installed, you should remove these

directories from your webroot or otherwise protect them from being


RewriteRule “(^|/).” - [F]

If your site can be accessed both with and without the ‘www.’ prefix, you

can use one of the following settings to redirect users to your preferred

URL, either WITH or WITHOUT the ‘www.’ prefix. Choose ONLY one option:

To redirect all users to access the site WITH the ‘www.’ prefix,

(… will be redirected to…)

uncomment the following:

RewriteCond %{HTTP_HOST} .

RewriteCond %{HTTP_HOST} !^www. [NC]

RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

To redirect all users to access the site WITHOUT the ‘www.’ prefix,

(… will be redirected to…)

uncomment the following:

RewriteCond %{HTTP_HOST} ^www.(.+)$ [NC]

RewriteRule ^ http%{ENV:protossl}://%1%{REQUEST_URI} [L,R=301]

Modify the RewriteBase if you are using Drupal in a subdirectory or in a

VirtualDocumentRoot and the rewrite rules are not working properly.

For example if your site is at uncomment and

modify the following line:

RewriteBase /drupal

If your site is running in a VirtualDocumentRoot at,

uncomment the following line:

RewriteBase /

Pass all requests not referring directly to files in the filesystem to

index.php. Clean URLs are handled in drupal_environment_initialize().

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^ index.php [L]

Rules to correctly serve gzip compressed CSS and JS files.

Requires both mod_rewrite and mod_headers to be enabled.

# Serve gzip compressed CSS files if they exist and the client accepts gzip. RewriteCond %{HTTP:Accept-encoding} gzip RewriteCond %{REQUEST_FILENAME}\.gz -s RewriteRule ^(.*)\.css $1\.css\.gz [QSA]
Header unset ETag
Header set Connection keep-alive

# Serve gzip compressed JS files if they exist and the client accepts gzip.
RewriteCond %{HTTP:Accept-encoding} gzip
RewriteCond %{REQUEST_FILENAME}\.gz -s
RewriteRule ^(.*)\.js $1\.js\.gz [QSA]

# Serve correct content types, and prevent mod_deflate double gzip.
RewriteRule \.css\.gz$ - [T=text/css,E=no-gzip:1]
RewriteRule \.js\.gz$ - [T=text/javascript,E=no-gzip:1]

<FilesMatch "(\.js\.gz|\.css\.gz)$">
  # Serve correct encoding type.
  Header set Content-Encoding gzip
  # Force proxies to cache gzipped & non-gzipped css/js files separately.
  Header append Vary Accept-Encoding
FileETag None [/code]

What do these mean in firebug? Why does it say Connection keep-alive, close?

Response Headers
Cache-Control max-age=1209600
Connection keep-alive, close

Request Headers
Accept /
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Cache-Control max-age=0
Connection keep-alive

That means keep–alives are not really enabled. I’m partially convinced that hosting providers were doing that just so you thought it might be while still allowing them to disable it but when the browser sees that “close” it will close the connection.

The keep-alives are generally controlled at the server level and not controllable in .htaccess. You’ll need to reach out to your hosting provider.

The test above was with Chrome. With Firefox I get 100% for keep alive. So I gues I have to resad this topic:
I am on a shared server, do you think I could tell the admin to do something for this? What exactly?
Thank you

The admins should know what they need to fix and if they are intentionally disallowing keep-alives.

As pmeenan said, KeepAlive has to first be set at server level.

The entire sequence is this, for Debian/Ubuntu derivatives.

  1. Enable keepalive at server level - one of my server’s settings…

net4-dev# grep -i keepalive /etc/apache2/apache2.conf | egrep -v ^#
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5

  1. Enable keepalive header - one of my server’s settings…

net4-dev# cat /etc/apache2/mods-available/headers.conf

Header set Connection keep-alive