你好,我是一名网页设计师,最近开始维护一台 VPS 服务器,
我正在使用一台运行 ubuntu 18 的 Lamp VPS 服务器,上面有多个 PHP 网站,
已经多次编辑了虚拟主机和 htaccess。
问题 :
1.在所有网站中:所有“www 版本的网站”重定向到 apache 主页
2.非 https 版本不会重定向到 https 版本
我是否应该单独为 www 版本重新颁发 SSL 证书?
虚拟主机代码
<VirtualHost *:80>
ServerName www.temp.com
ServerAlias temp.com
Redirect "/" "https://www.temp.com"
DocumentRoot /var/www/temp.com/
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,END]
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,END]
</VirtualHost>
.htaccess 代码
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule . /index.html [L]
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</IfModule>
我使用 Certbot 来获取 SSL 证书
sudo certbot --apache
答案1
<VirtualHost *:80>
端口 80 上的 VirtualHost 应始终是纯文本 http 主机。您永远不能在同一个端口上同时使用纯文本 http 和 https。
这意味着下面的配置行永远不能应用,并且应该省略:
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,END]
该Redirect
指令:
Redirect "/" "https://www.temp.com"
是简单和推荐版本 下面的 mod-rewrite 代码在功能上是等效的:
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,END]
它们都从纯 http 重定向到 https。你不需要两者。我建议删除 mod_rewrite 代码。
您当然不需要在文件中第三次重复重定向到 https 功能.htaccess
。
HTTPS VirtualHost 应该有一个如下所示的代码块:
<VirtualHost *:443>
ServerName www.temp.com
ServerAlias temp.com
DocumentRoot /var/www/temp.com/
SSLEngine on
SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCertificateFile /etc/letsencrypt/live/.../cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/..../privkey.pem
SSLCACertificateFile /etc/letsencrypt/live/.../chain.pem
</VirtualHost>