tags:

views:

1135

answers:

5

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.).

+1  A: 

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.

Nick Presta
Thanks. The base element would affect all links on the page and there will be both kinds on the same page (http and https). I also prefer relative links because it makes life (testing, etc...) on an slow internet connection a lot easier and I can test sites in folders on the server.
jeroen
+1  A: 

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.

David Zaslavsky
Nice, thanks, I think I will give that a try.
jeroen
+2  A: 

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.

Damien McGivern
+3  A: 

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

Jans Carton
+1  A: 

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

<a href="//some/local/file.php">link text</a>

instead of

<a href="some/local/file.php">link text</a>

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

Matt
Thanks for your answer. I haven´t tried it, but normal, relative links always follow the protocol that the originating page was loaded over, so this would not change anything. Apart from that I want specific - relative - pages and directories to load over https and others over http.
jeroen
Sorry, I misread your question. I've just gone back and read it and it really doesn't apply.
Matt