在 apache 的配置文件中,如下配置可以正常访问:
<VirtualHost *:80>
ServerName app.mydomain.com
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8080/app
ProxyPassReverse / http://127.0.0.1:8080/app
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
为了叙述方便,我们给这个配置命名为:“配置一”
这时,通过 http://app.mydomain.com 可以正常访问项目,且地址栏中的 url 地址也没有发生任何跳转,仍然是 http://app.mydomain.com ,这是符合预期的。
但是通过使用 certbot 申请并配置了 ssl 证书以后,certbot 会自动配置一个 443 的 VirtualHost ,如下:
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName app.mydaomain.com
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8080/app
ProxyPassReverse / http://127.0.0.1:8080/app
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLCertificateFile /etc/letsencrypt/live/app.mydaomain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/app.mydaomain.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
同理,我们给这个配置命名为:“配置二”。
很显然,配置二是根据已有的配置一,由 certbot 自动产生的。但是,却无法正常工作,如果我们访问 https://app.mydomain.com , 浏览器的地址栏却跳转到了 https://app.mydomain.com/app ,这显然不符合我们的预期。
经过摸索发现,如果启用了 ssl 证书以后,代理与反向代理地址后面需要强制加上 / ,否则无法工作。也就是说,上述配置一配置二中的内容改为:
ProxyPass / http://127.0.0.1:8080/app/
ProxyPassReverse / http://127.0.0.1:8080/app/
就可以正常工作了。
如果使用 ssl 证书,可以不加 / 。这真是一个奇葩的bug,至少是一个瑕疵。