There are various server setups and variations so there will not be one solution that fits all cases... However, this worked for me.
Put this in the .htaccess file just before RewriteCond %{REQUEST_FILENAME} !-f about line 117...
RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Then in the settings.php add at the bottom...
$_SERVER['HTTPS'] = 'On';
Flush the cache and test!
For more information try https://www.drupal.org/https-information.
Update
The above worked really well on a dedicated server I had with Heart Internet. However, when I tried the same on a site that was on shared hosting with Heart Internet (via the Reseller package), I'd just get a nasty server error page. After a little digging within the Heart Internet customer support database I found a slight variation to the above code....
RewriteCond %{ENV:HTTPS} !=on RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
The only variation is the condition... RewriteCond %{HTTPS} off works in one environment, but bombs out in the other, and RewriteCond %{ENV:HTTPS} !=on works in the other.
Not being much of a server expert I can't explain the fine differences, but it looks like it's to do with the way it's checking if the site is running with SSL.
If you try both and still don't have any joy, but find another solution, drop me a line.