How do I enable https only on certain pages with htaccess?

16,361

Try this in your .htaccess file:

Options +FollowSymLinks
RewriteEngine on

# redirect for http /buy page
RewriteCond %{SERVER_PORT} =80
RewriteRule ^buy/?$ https://mysite.com/buy [R=301,QSA,L,NE]

# redirect for https non /buy pages
RewriteCond %{SERVER_PORT} =443
RewriteCond %{REQUEST_URI} !^/buy [NC]
RewriteRule ^/?(.*)$ http://mysite.com/$1 [R=301,QSA,L,NE]

R=301 will redirect with https status 301
L will make last rule
NE is for no escaping query string
QSA will append your existing query parameters
NC is for ignore case comparison

$1 is your REQUEST_URI

Share:
16,361
Jarred
Author by

Jarred

Updated on June 17, 2022

Comments

  • Jarred
    Jarred almost 2 years

    I have an ecommerce site, and I want to enable https only on the ecommerce section of the site located at https://mysite.com/buy

    Since all of the links on my pages are relative, when someone visits http://mysite.com and clicks on Buy, they are taken to http://mysite.com/buy

    Also, if they visit https://mysite.com/buy and click on a link to another page, they are taken to https://mysite.com.

    The reason I want https only on that one section is because I have external elements (i.e. Google Maps, Youtube, Twitter, etc) that cannot be sent over https.

    Is there a way with htaccess that I can make the /buy directory force https, but every other page force http?

    Edit: In case anyone is interested, I was able to solve this using PHP. I would still prefer an htaccess solution, but this will work for now:

    if($_SERVER['HTTPS'] == "on") {
        if(strpos($_SERVER['REQUEST_URI'],"buy") === false) {
            Header("Location: http://$_SERVER['HTTP_HOST']."".$_SERVER['REQUEST_URI']");
        }
    }
    
  • Jarred
    Jarred about 13 years
    Thanks for the answer. The problem is that /buy is a rewritten URL, so the /buy folder doesn't actually exist.
  • elimisteve
    elimisteve over 10 years
    You can simplify RewriteRule ^/?(.*)$ http://mysite.com/$1 [R=301,QSA,L,NE] to RewriteRule (.*) http://mysite.com$1 [R=301,QSA,L,NE]