关于 Apache 虚拟主机的配置,请参考:Apache 之一 - 虚拟主机

为了演示效果,我这里又重新租用了一台非大陆的服务器,将之前所有的安装配置又重新做了一次

注意:以下操作都在 root 用户下执行

域名证书申请

由于我们之前已经解析好了域名 apache.xxxxu.com ,所以我们只需要借助 腾讯云 去申请免费 1 年的 SSL 证书即可!具体申请过程这里不做演示。

证书申请好后,找到 apache 版本的下载到服务器的指定目录,然后解压到 /usr/local/ssl/ 目录下

Apache 主配置文件

1.编辑 apache 主配置文件 /usr/local/apache2/conf/httpd.conf,找到 #LoadModule ssl_module modules/mod_ssl.so#Include conf/extra/httpd-ssl.conf,将前面的 # 号去掉,启用 SSL 支持:

1
2
3
4
5
6
7
8
# 加载 SSL 模块
sed -i 's@#LoadModule ssl_module modules/mod_ssl.so@LoadModule ssl_module modules/mod_ssl.so@' /usr/local/apache2/conf/httpd.conf


sed -i 's@#LoadModule socache_shmcb_module modules/mod_socache_shmcb.so@LoadModule socache_shmcb_module modules/mod_socache_shmcb.so@‘ /usr/local/apache2/conf/httpd.conf

# 启用 SSL 配置
sed -i 's@#Include conf/extra/httpd-ssl.conf@Include conf/extra/httpd-ssl.conf@' /usr/local/apache2/conf/httpd.conf

2.编辑 /usr/local/apache2/conf/extra/httpd-ssl.conf 文件,将默认的 HTTPS 虚拟主机配置注释掉,只保留如下内容:

1
2
3
4
5
6
7
8
9
Listen 443
SSLCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES
SSLProxyCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES
SSLHonorCipherOrder on
SSLProtocol all -SSLv3
SSLProxyProtocol all -SSLv3
SSLPassPhraseDialog builtin
SSLSessionCache "shmcb:/usr/local/apache2/logs/ssl_scache(512000)"
SSLSessionCacheTimeout 300

SSL 配置

1.编辑 apache 虚拟主机配置文件 /usr/local/apache2/conf/extra/httpd-vhosts.conf, 在 基于单域名的虚拟主机配置 的虚拟主机配置下面添加如下虚拟主机配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
## 基于单域名的虚拟主机配置
<VirtualHost *:80>
# 指定了该虚拟主机的根目录为 /data/websites/apache/site01 ,即网站文件的存放路径。
DocumentRoot "/data/websites/apache/site03"
# 设置了虚拟主机的域名为 `apache.xxxxu.com` ,表示通过该域名可以访问该虚拟主机配置的网站。
ServerName apache.xxxxu.com
# 这个指令 AddDefaultCharset utf-8 用于向Apache的配置中添加默认字符集为UTF-8。
# 当浏览器没有指定字符集时,服务器会使用UTF-8作为默认字符集来发送内容给客户端。
# 这有助于确保网站内容能够正确地显示在各种浏览器中,并且支持Unicode字符。
AddDefaultCharset utf-8
# 指定了错误日志文件的路径为 logs/site01_error_log ,用于记录该虚拟主机的错误日志信息。
ErrorLog "logs/site03_error_log"
# 指定了访问日志文件的路径为 logs/site01_access_log ,使用 common 格式记录访问日志信息。
CustomLog "logs/site03_access_log" common
# 针对 /data/websites/apache 目录的访问权限设置。 不配置会出现 403
<Directory "/data/websites/apache">

Options Indexes FollowSymLinks
AllowOverride all
#AllowOverride Authconfig
# 设置了对 /data/websites/apache 目录下的所有请求都允许访问。
# Require all granted 表示允许所有请求访问该目录,是Apache 2.4版本中的访问控制设置方式。
Require all granted
</Directory>
</VirtualHost>

## 配置 HTTPS(启用 SSL)
<VirtualHost *:443>
# 指定了该虚拟主机的根目录为 /data/websites/apache/site01 ,即网站文件的存放路径。
DocumentRoot "/data/websites/apache/site03"
# 设置了虚拟主机的域名为 `apache.xxxxu.com` ,表示通过该域名可以访问该虚拟主机配置的网站。
ServerName apache.xxxxu.com:443
# 这个指令 AddDefaultCharset utf-8 用于向Apache的配置中添加默认字符集为UTF-8。
# 当浏览器没有指定字符集时,服务器会使用UTF-8作为默认字符集来发送内容给客户端。
# 这有助于确保网站内容能够正确地显示在各种浏览器中,并且支持Unicode字符。
AddDefaultCharset utf-8
# 开启 SSL 引擎
SSLEngine on
# 指定域名 `apache.xxxxu.com` crt 文件所在路径
SSLCertificateFile "/usr/local/ssl/apache.xxxxu.com_apache/apache.xxxxu.com.crt"
# 指定域名 `apache.xxxxu.com` key 文件所在路径
SSLCertificateKeyFile "/usr/local/ssl/apache.xxxxu.com_apache/apache.xxxxu.com.key"
# 指定了错误日志文件的路径为 logs/site01_error_log ,用于记录该虚拟主机的错误日志信息。
ErrorLog "logs/site03_error_log"
# 指定了访问日志文件的路径为 logs/site01_access_log ,使用 common 格式记录访问日志信息。
CustomLog "logs/site03_access_log" common
# 针对 /data/websites/apache 目录的访问权限设置。 不配置会出现 403
<Directory "/data/websites/apache">

Options Indexes FollowSymLinks
AllowOverride all
#AllowOverride Authconfig
# 设置了对 /data/websites/apache 目录下的所有请求都允许访问。
# Require all granted 表示允许所有请求访问该目录,是Apache 2.4版本中的访问控制设置方式。
Require all granted
</Directory>
</VirtualHost>

注意: 在配置强制跳转时, AllowOverride 参数的值不能为 autoconfig ,否则服务器日志会报 RewriteEngine not allowed here 的错。同时,前端页面也会出现无法访问,报 500 Internal Server Error 的错误。所以,在这里我们需要将 AllowOverride 参数的值修改为 all

2.配置完成后。保存退出!执行 apache 配置检查命令,并重启 apache 服务:

1
apachectl -t && apachectl restart

3.打开浏览器,输入: https://apache.xxxxu.com,如图:

强制 HTTP 跳转到 HTTPS

1.编辑 apache 主配置文件 /usr/local/apache2/conf/httpd.conf,找到 #LoadModule rewrite_module modules/mod_rewrite.so 并将前面的 # 号去掉,表示启用重写模块:

1
sed -i 's@#LoadModule rewrite_module modules/mod_rewrite.so@LoadModule rewrite_module modules/mod_rewrite.so@' /usr/local/apache2/conf/httpd.conf

2.在虚拟主机定义的 DocumentRoot 目录 /data/websites/apache/site03 下新建 .htaccess 文件,内容为:

1
2
3
4
5
6
7
8
cat << 'EOF' > /data/websites/apache/site03/.htaccess
# 启用重写引擎
RewriteEngine On
# 如果请求不是通过HTTPS协议访问
RewriteCond %{HTTPS} off
# 将请求重定向到HTTPS协议的完整URL
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
EOF

或者:

1
2
3
4
5
6
7
8
9
10
cat << 'EOF' > /data/websites/apache/site03/.htaccess
# 启用重写引擎
RewriteEngine on
# 设置重写规则基准路径为根目录
RewriteBase /
# 如果请求的端口不是443
RewriteCond %{SERVER_PORT} !^443$
# 重定向到HTTPS协议的完整URL并结束重写过程
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
EOF

3.打开浏览器,输入域名 http://apache.xxxxu.com 看能否自动跳转到 https://apahe.xxxxu.com (这里无法截图演示)

注意:配置 HTTP 强制跳转 HTTPS, 必须配置 2 个虚拟主机,一个为 80 端口,一个为 443 端口,二者缺一不可!