Amardeep
Amardeep

Reputation: 378

Apache Mod Rewrite all incoming urls to https://www

I want to redirect all incoming urls to my website to a single url for canonicalization purposes.

Following redirect conditions should meet

  1. http://example.com-> https://www.example.com
  2. http://www.example.com -> https://www.example.com
  3. https://example.com -> https://www.example.com
  4. www.example.com -> https://www.example.com

My current Rewrite rules written in httpd.conf look as follows

RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.example.com%{REQUEST_URI} [R=301,L,NE]

With the above rules I am able to achieve 1st,2nd and 4th rule but 3rd doesn't work for me. Any suggestions are welcome.

Upvotes: 1

Views: 1187

Answers (2)

spacepickle
spacepickle

Reputation: 2788

The definition for HTTPS and HTTP version of your site must (?) appear under different virtualhost entries (unless you are using some proxy in front of httpd).

This makes it easy to end up with differences between the configs in the two virtualhosts. Make sure the config for the redirect is the same in both virtualhosts for port 80 and port 443

The easiest way to do this is to make use of an Include statement and reference a common file in the two virtualhost definitions

For instance put these rewrites in a file base-rewrite.inc in the root config dorectory (/etc/apache2/base-rewrite.inc in debian/ubuntu; /etc/httpd/base-rewrite.inc in Redhat):

RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.example.com%{REQUEST_URI} [R=301,L,NE]

Then in your virtual hosts definition, Include this file:

<VirtualHost *:80>
    # HTTP default virtualhost
    ServerName www.example.com
    DocumentRoot /var/www/html/

    Include base-rewrite.inc
</VirtualHost>

<VirtualHost *:443>
    # HTTPS default virtualhost
    ServerName www.example.com
    DocumentRoot /var/www/html/

    # An example SSL config, but use your certificate files
    SSLEngine on
    SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
    SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

    Include base-rewrite.inc
</VirtualHost>

This will keep the rewrites consistent and make it easy to maintain and change them all at once

Upvotes: 1

Alan Horrocks
Alan Horrocks

Reputation: 324

If you're talking about canonicalization for SEO purposes then you should also add this meta tag to the head section of your web pages:

<link rel="canonical" href="https://www.example.com/" />

What this does is tell search engines that whatever url was used to reach this page, this is the preferred url and the one that should be indexed.

Upvotes: 0

Related Questions