我曾尝试在 Ubuntu 18.04 上使用 Apache 2.4 配置一个非 www 网站,并且我成功地让事情正常运作,我的https://example.me效果很好。但是,www.example.me子域也处于活动状态(因为我添加了 ServerAlias)。https://www.example.me也打开了,但没有显示证书,这让我很困惑——它不应该重定向到https://example.com?这里的最佳做法是什么 - 我应该同时拥有 www 和非 www 子域名,并为每个子域名创建一个单独的 conf 文件吗?我应该只使用其中一个子域名进行永久重定向吗?为什么重定向在这里不起作用,我需要其他指令吗?
亲切的问候。
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/mysite.me.crt
SSLCertificateKeyFile /etc/apache2/ssl/mysite.me.key
SSLCertificateChainFile /etc/apache2/ssl/mysite.me.crt
DocumentRoot /var/www/html
ServerName https://example.me
ServerAlias www.example.me
UseCanonicalName Off
ProxyPreserveHost On
ProxyRequests On
ProxyVia On
#ErrorLog /var/log/httpd/tomcat.error.log
#CustomLog /var/log/httpd/tomcat.log combined
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
Include /etc/apache2/sites-available/redirect.conf
ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/
</VirtualHost>
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName example.me
DocumentRoot /var/www/html
UseCanonicalName Off
Redirect permanent "/" "https://example.me/"
ProxyPreserveHost On
ProxyRequests On
ProxyVia On
#ErrorLog /var/log/httpd/tomcat.error.log
#CustomLog /var/log/httpd/tomcat.log combined
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
Include /etc/apache2/sites-available/redirect.conf
ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/
#ProxyPass / http://localhost:8080/
#ProxyPassReverse / http://localhost:8080/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
答案1
首先,请注意永久重定向被缓存通过您的网络浏览器,因此如果您进行了更改并正在测试修改后的配置,请采取预防措施和/或调整您的测试方法。有关更多信息这里。
恕我直言,您的配置也充满了错误和不正确的假设。
请勿启用/允许代理请求!!!
ProxyPreserveHost On
ProxyRequests On
ProxyVia On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
上述指令旨在创建一个转发代理更糟糕的是打开代理,可以被任何想使用您的网络服务器隐藏其 IP 地址的人滥用。
你不需要ProxyRequests On
为一个撤销代理人以及ProxyPass
工作指令。
请将其删除。
在您的 HTTP VirtualHost 中
当你只有一个 VirtualHost 时,它将成为默认 VirtualHost(针对该端口和地址)。 详细描述这里。因此,除非您定义了额外的 VirtualHost 块,否则此单个条目:
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName example.me
将用于所有普通的 http 请求,即http://example.me/some-page.htm?foo=bar
,等。即使没有显式指定,也将使用该http://www.example.me
VirtualHosthttp://your.ip-address/
ServerAlias www.example.com
指定www.example.com
该特定 VirtualHost 的备用主机名。
Redirect permanent "/" "https://example.me/"
指示所有请求都将导致重定向响应,https://example.me/
换句话说:
http://example.me/some-page.htm?foo=bar ==> https://example.me/some-page.htm?foo=bar
http://www.example.me ==> https://example.me/
http://your.ip-address/bob/is.awe-some ==> https://example.me/bob/is.awe-some
当您将所有内容重定向出去时,那么通常用于显示该 VirtualHost 中内容的任何其他指令也是没有意义的,因此您可以省略 等,DocumentRoot
并ProxyPass
保留一个非常简单的普通 http VirtualHost:
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName example.me
UseCanonicalName Off
Redirect permanent "/" "https://example.me/"
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
在您的 HTTPS VirtualHost 中,情况也是如此:如果没有其他 VirtualHosts,它将成为任何请求的默认主机。
唯一的当然是服务器 TLS 证书;它仅对其中包含的主机名有效,其他主机名将导致无效证书错误/警告。
您可能需要检查此处包含的文件的内容:
Include /etc/apache2/sites-available/redirect.conf