jeroen
jeroen

Reputation: 91792

Short way to link to http from https (and vice versa) using relative links

When I´m in a secure part of a web-site I´m developing (entering a specific page or folder using https), the relative links to the normal pages are automatically converted to https as well.

Is there a way to tell an <a> tag to always use the http protocol instead of the https protocol (or the other way around)?

I know it´s easy using the complete link (http://www.mysite.com/index.html or https://www.mysite.com/index.html), but I would like it to work with relative links (index.html, ../index.html, etc.).

Upvotes: 21

Views: 60322

Answers (6)

Daniel De Le&#243;n
Daniel De Le&#243;n

Reputation: 13679

I use this code to create a link of the current index page to direct to the https server, because we provide different content according the protocol and we do not know where is hosting.

  <a>Secure server
    <script>
      let url = new URL(window.location);
      url.protocol = 'https:';
      url.port = '443';
      document.currentScript.parentElement.href = url.toString();
    </script>
  </a>

Upvotes: 0

Matt
Matt

Reputation: 9433

You can make all your internal links be protocol independent by using the following syntax:

<a href="//some/file/on/your/domain.php">link text</a>

instead of

<a href="some/file/on/your/domain.php">link text</a>

the // will make the link respect whatever protocol the page was loaded over.

Upvotes: 30

Damien McGivern
Damien McGivern

Reputation: 4004

There is no way to do this with relative hyperlinks as your are using a different protocol, it would be no different than linking to a ftp location.

Upvotes: 2

Jans Carton
Jans Carton

Reputation: 196

We use Apache mod_rewrite to control whether a page is served via http or https. Here's an example snippet from a site's root directory .htaccess file:

# Redirect most reqests for https to http
RewriteRule ^https://www.example.com(.*) http://www.example.com$1 [R=301,NC]

# Allow some URIs to be https if requested
RewriteCond   %{SERVER_PORT}  ^443$
RewriteCond   %{REQUEST_URI}  !^/images/(.*)$
RewriteCond   %{REQUEST_URI}  !^/scripts/(.*)$
RewriteCond   %{REQUEST_URI}  !^/styles/(.*)$
RewriteCond   %{REQUEST_URI}  !^/store(.*)$
RewriteCond   %{REQUEST_URI}  !^/login.htm$
RewriteRule ^(.*) http://www.example.com/$1 [L,R]

# Force some URIs to be https only
RewriteCond   %{SERVER_PORT}  ^80$
RewriteRule ^store(.*) https://www.example.com/store$1 [L,R]

RewriteCond   %{SERVER_PORT}  ^80$
RewriteRule ^FormSanityKey.htm https://www.example.com/login$1 [L,R]

Read all about it at:

http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html

Upvotes: 10

David Z
David Z

Reputation: 131750

Not sure if this is exactly what you were looking for, but if you're using Apache, there's a trick you can use to do this: http://httpd.apache.org/docs/2.2/ssl/ssl_faq.html#relative

Basically you put the following in your Apache configuration file:

RewriteEngine on
RewriteRule ^/(.*):SSL$ https://%{SERVER_NAME}/$1 [R,L]
RewriteRule ^/(.*):NOSSL$ http://%{SERVER_NAME}/$1 [R,L]

then append :SSL to any link (in the webpage) for which you want to force HTTPS, and :NOSSL to any link for which you want to force regular HTTP.

Upvotes: 4

Nick Presta
Nick Presta

Reputation: 28705

It sounds like you want to use the BASE element.

There is no way to 'tell' an Anchor to use a specific protocol or not, at least without using the BASE element in the HEAD of that page.

Is there a reason why you want to use relative links over absolute links? This article talks about the pitfall of using relative links with HTTPS - the potential to have your site double indexed and such.

Upvotes: 3

Related Questions