虚拟主机强制HTTPS和重定向WWW到非WWW,但没有其他子域



这本质上与htaccess强制https并将www重定向到非www相同,但没有其他子域(即,我想配置Apache将所有非https 和/或 "www" url重定向到https非www url),但我想通过虚拟主机而不是.htaccess文件配置Apache(因为我读到避免.htaccess有一些好处)。

当使用.htaccess文件时,我能够得到以下答案:https://stackoverflow.com/a/34333450/1468130但当我试图将答案的配置转移到我的虚拟主机配置时,它不起作用;"https://www.domain.com"从未重定向到"https://domain.com"。

我仔细研究了.htaccess和虚拟主机.conf文件之间的差异,发现了这个http://tltech.com/info/rewriterule-in-htaccess-vs-httpd-conf/和这个:https://www.digitalocean.com/community/questions/can-you-use-virtual-host-config-conf-to-redirect-www-domain-to-non-www?answer=15129,这似乎暗示我可以把配置包装在<Directory>块中,它会起作用。不幸的是,它没有("https://www.domain.com"仍然从未重定向到"https://domain.com"),所以我想知道互联网是否知道我做错了什么:

<VirtualHost *:80>
        ServerName domain.com
        ServerAlias www.domain.com
        ServerAdmin admin@domain.com
        DocumentRoot /var/www/domain.com/
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
        <Directory /var/www/domain.com/>
                RewriteEngine On
                # match any URL with www and rewrite it to https without the www
                RewriteCond %{HTTP_HOST} ^(www.)(.*) [NC]
                RewriteRule (.*) https://%2%{REQUEST_URI} [L,R=301]
                # match urls that are non https (without the www)
                RewriteCond %{HTTPS} off
                RewriteCond %{HTTP_HOST} !^(www.)(.*) [NC]
                RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
        </Directory>
</VirtualHost>

我也试过配置<VirtualHost *:443> Dusan Bajic在评论中建议,但这也没有效果;https://www.domain.com仍然不能重定向到https://domain.com:

<VirtualHost *:443>
        ServerName domain.com
        ServerAlias www.domain.com
        ServerAdmin admin@domain.com
        DocumentRoot /var/www/domain.com/
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
        SSLCertificateFile /etc/letsencrypt/live/domain.com/cert.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/domain.com/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf
        SSLCertificateChainFile /etc/letsencrypt/live/domain.com/chain.pem
        <Directory /var/www/domain.com/>
                RewriteEngine On
                # match any URL with www and rewrite it to https without the www
                RewriteCond %{HTTP_HOST} ^(www.)(.*) [NC]
                RewriteRule (.*) https://%2%{REQUEST_URI} [L,R=301]
        </Directory>
</VirtualHost>

同样根据评论,我已经尝试了上述*:443配置与*:80配置配对,<Directory>块更改为仅将HTTP重定向到HTTPS。但是当我这样做的时候,"www"永远不会被删除。

<Directory /var/www/paradoxmayhem.com/>
        RewriteEngine On
        RewriteCond %{SERVER_NAME} =www.paradoxmayhem.com [OR]
        RewriteCond %{SERVER_NAME} =paradoxmayhem.com
        RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
</Directory>

明白了!显然,当我使用letsencrypt (certbot)配置SSL时,它会自动创建另一个虚拟主机文件(在/etc/apache2/sites-enabled/domain.com-le-ssl.conf处),该文件对domain.com *:443虚拟主机有自己的定义,并且似乎优先于我之前尝试设置的任何*:443配置。我将以下代码添加到-le-ssl.conf文件中,现在我的重定向最终在所有我想要的情况下工作,使用100% Apache虚拟主机配置:

<Directory /var/www/domain.com/>
        RewriteEngine On
        # match any URL with www and rewrite it to https without the www
        RewriteCond %{HTTP_HOST} ^(www.)(.*) [NC]
        RewriteRule (.*) https://%2%{REQUEST_URI} [L,R=301]
</Directory>

相关内容

最新更新