以下是我的要求:
- 在同一台服务器上托管多个网站。有些网站使用 SSL,有些则不使用。(端口 443 和 80)
- 如果域不匹配,则返回 403 或自定义响应
该服务器是使用 Apache 2.4+ 的 Ubuntu LAMP 堆栈。目前我的配置无法正常工作。我已添加默认 VirtualHost,但如果我使用 HTTPS 浏览服务器上没有的域(https://thisisnotasite.com) 它将使我能够转到我希望转到 403 的站点。如果我在 中添加 * 而不是端口 80 default-403.conf
,它将始终加载实际站点。使用端口 80,所有 HTTP 请求都会重定向到 403。但是,如果我添加非 SSL 的站点,系统将始终转到那里。在我的apache.conf
文件中,我已将虚拟主机的导入行更改为每个文件,因此我可以控制加载顺序。(以下是片段)
#Include the virtual host configurations:
IncludeOptional sites-enabled/default-403.conf
IncludeOptional sites-enabled/Site1.conf
IncludeOptional sites-enabled/SSLSite2.conf
IncludeOptional sites-enabled/SSLSite3.conf
IncludeOptional sites-enabled/Site4.conf
Default-403.conf
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName catchAll
Redirect 403 /
UseCanonicalName Off
ErrorLog ${APACHE_LOG_DIR}/catchAllError.log
CustomLog ${APACHE_LOG_DIR}/catchAll.log combined
</VirtualHost>
Site1.conf
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName site1.com
ServerAlias www.site1.com
Redirect permanent "/" "https://www.site3.com/"
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
SSLSite2(这是一个旧站点,site3 是新站点)
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin [email protected]
ServerName site2.com
ServerAlias www.site2.com
Redirect permanent "www.site2.com" "https://www.site3.com/"
Redirect permanent "site2.com" "https://www.site3.com/"
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/site2.log combined
SSLEngine on
SSLCertificateFile /etc/ssl/certs/site2.cert
SSLCertificateKeyFile /etc/ssl/private/site2.key
SSLCertificateChainFile /etc/ssl/certs/site2.csr
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-6]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
</VirtualHost>
</IfModule>
SSLSite3
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin [email protected]
ServerName site3.com
ServerAlias www.site3.com
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/ssl/certs/site3.crt
SSLCertificateKeyFile /etc/ssl/private/site3.key
SSLCertificateChainFile /etc/ssl/certs/sit3.crt
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-6]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
</VirtualHost>
</IfModule>
Site4.conf
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName site4.com
ServerAlias www.site4.com
DocumentRoot /var/www/site2
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
正确答案是,site1 和 site2 不会重定向到 site3,如果我为 site 4 添加导入,那么每个请求都会发送到 site4。如果我将 default-403 更改为 * 而不是端口 80,那么所有内容都会转到 site4。
任何帮助将不胜感激。
请注意,我接触 Apache 仅约 2 个月,因此如果有更好的方法来处理这个问题,请告诉我。
答案1
您需要为 *:80 定义一个“默认”虚拟主机,为 *:443 定义另一个虚拟主机以及一个密钥+证书对,否则您的 SSL 请求将落在第一个定义的 SSL 虚拟主机中,因此在您的默认 SSL 虚拟主机中添加类似这样的内容(这包括拒绝访问而不是重定向的典型方式)以及所有花哨的功能:
<VirtualHost *:443>
ServerAdmin [email protected]
ServerName catchAll
DocumentRoot /path/to/emptydocroot
UseCanonicalName Off # this is the default not really needed here
# unless server config has it set to on
SSLEngine on
SSLCertificateKeyFile /path/to/bogus.key
SSLCertificateFile /path/to/bogus.crt
ErrorLog ${APACHE_LOG_DIR}/catchAllError-ssl.log
CustomLog ${APACHE_LOG_DIR}/catchAll-ssl.log combined
<Directory /path/to/emptydocroot>
Options none
AllowOverride none
Require all denied
</Directory>
</VirtualHost>
答案2
我很确定 Ubuntu apache2 包在安装时已经创建了默认站点文件。
如果您的服务器上缺少它们,您可以尝试使用虚拟机(例如 VirtualBox 或 Docker)来设置全新安装,以便在您的桌面上使用。
查看 /etc/apache2/site-available(不是 sites-enabled,这只包含指向 site-available 的符号链接。如果站点未激活,则链接将会丢失)。
你应该看到类似这样的内容:
- 000-default.conf(用于 http / 端口 80)
- default-ssl.conf(用于 https / 端口 443)
为了激活它们,请使用 a2ensite:
a2ensite default-ssl
加载您的更改:
service apache2 reload
一旦它们被激活,您应该在 /etc/apache2/sites-enabled 中看到它们。
一旦完成工作,您就可以添加 403 的限制。
PS 有时最好在一个干净的系统上从头开始,而不是在它们纠结在一起后尝试修复它们。
答案3
我使用了 ezra-s 和 wirap 两种方法。
在我的解决方案中,我启动了一个新的虚拟机,并将 000-default.conf 和 defualt-ssl.conf 复制到我正在使用的服务器。然后修改 apache2.conf 文件以拒绝目录权限以获取 403 响应并使用默认虚拟主机文件。
谢谢您的帮助!!!