A: 

That is not the correct way to detect what the server port is, it should follow the same rules as http_host using ^443$ and !^443 respectively. You really should capitalize server_port as well, it's good practice. Here is a good little tutorial that might help you out.

animuson
When I started the ^443$ method wasn't working on my server while the =443 method above was - I'll give it another go and confirm.
Stuart McAlpine
`=443` and `^443$` are semantically identical. The former is just a lexicographical (equality) comparison while the latter is a regular expression comparison.
Gumbo
A: 

You need to put those rule, that cause an external redirect, before those rules, that just cause an internal redirect. So:

# in https: force all other pages to http
RewriteCond %{SERVER_PORT} =443
RewriteCond $1 !^secure$ [NC]
RewriteRule ^(.+)\.html$ http://%{HTTP_HOST}%{REQUEST_URI} [QSA,L]

# in http: force secure.html to https
RewriteCond %{SERVER_PORT} !=443
RewriteCond $1 ^secure$ [NC]
RewriteRule ^(.+)\.html$ https://%{HTTP_HOST}%{REQUEST_URI} [QSA,L]

# in https: process secure.html in https
RewriteCond %{SERVER_PORT} =443
RewriteCond $1 ^secure$ [NC]
RewriteRule ^(.+)\.html$ index.php?page=$1 [QSA,L]

# in http: process other pages as http
RewriteCond %{SERVER_PORT} !=443
RewriteCond $1 !^secure$ [NC]
RewriteRule ^(.+)\.html$ index.php?page=$1 [QSA,L]
Gumbo
Gumbo this works a treat - thanks a load!
Stuart McAlpine