Reputation: 41
I have recently redirect all traffic to https but I want to keep my subdomains on http only. Please help me to sort out this.
this is my rewriterules
Options +FollowSymlinks
RewriteEngine On
RewriteBase /
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
this is my virtual host code
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName staging.example.com
ServerAlias staging.example.com
SetEnv ENVIRONMENT staging
DocumentRoot /var/www/staging/
ErrorLog /var/log/apache2/example_staging_error.log
CustomLog /var/log/apache2/example_staging_access.log combined
<Directory /var/www/staging>
AllowOverride All
Include /etc/apache2/sites-available/example_dir_rules.conf
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName example.com
ServerAlias example.com
SetEnv ENVIRONMENT production
DocumentRoot /var/www/production/
ErrorLog /var/log/apache2/example_production_error.log
CustomLog /var/log/apache2/example_production_access.log combined
<Directory /var/www/production>
Include /etc/apache2/sites-available/example_dir_rules.conf
</Directory>
</VirtualHost>
LoadModule ssl_module /usr/lib/apache2/modules/mod_ssl.so
#Listen 443
<VirtualHost *:443>
SSLEngine on
SSLHonorCipherOrder On
-------------ssl code----------
ServerName example.com
-------------ssl code----------
ServerAdmin [email protected]
ServerName example.com
ServerAlias example.com
SetEnv ENVIRONMENT production
DocumentRoot /var/www/production/
ErrorLog /var/log/apache2/example_ssl_error.log
CustomLog /var/log/apache2/example_ssl_access.log combined
<Directory /var/www/production>
Include /etc/apache2/sites-available/example_dir_rules.conf
</Directory>
</VirtualHost>
Please help me to sort out this. Thanks in advance.
Upvotes: 3
Views: 514
Reputation: 19026
You have two choices.
1. Either you add a condition in your file to only match main domain
Options +FollowSymlinks
RewriteEngine On
RewriteBase /
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^example\.com$
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Note that the rule to match www
main domain can be removed since your main domain is example.com
(no trace of www
in your vhosts).
Warning: useless in some cases, you should not include the same file in all vhosts (see next point).
2. Or you can directly put a rule in example.com
(http) vhost block. Indeed, others two (example.com
for https and stagging
subdomain) do not require rules to do what you want.
So, your config should look like this
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName staging.example.com
ServerAlias staging.example.com
SetEnv ENVIRONMENT staging
DocumentRoot /var/www/staging/
ErrorLog /var/log/apache2/example_staging_error.log
CustomLog /var/log/apache2/example_staging_access.log combined
<Directory /var/www/staging>
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName example.com
ServerAlias example.com
SetEnv ENVIRONMENT production
DocumentRoot /var/www/production/
ErrorLog /var/log/apache2/example_production_error.log
CustomLog /var/log/apache2/example_production_access.log combined
<Directory /var/www/production>
Options +FollowSymlinks
RewriteEngine On
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</Directory>
</VirtualHost>
LoadModule ssl_module /usr/lib/apache2/modules/mod_ssl.so
#Listen 443
<VirtualHost *:443>
SSLEngine on
SSLHonorCipherOrder On
-------------ssl code----------
ServerName example.com
-------------ssl code----------
ServerAdmin [email protected]
ServerName example.com
ServerAlias example.com
SetEnv ENVIRONMENT production
DocumentRoot /var/www/production/
ErrorLog /var/log/apache2/example_ssl_error.log
CustomLog /var/log/apache2/example_ssl_access.log combined
<Directory /var/www/production>
</Directory>
</VirtualHost>
Upvotes: 2