Apache如何防止在沒有匹配域的情況下訪問https和http
以下是我的要求:
- 在同一台伺服器上託管多個站點。有些網站使用 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 Admin@admin.com 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 Admin@admin.com 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 admin@admin.com 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,如果我為站點4添加導入,那麼每個請求都會發送到site4。如果我將 default-403 更改為具有 * 而不是埠 80,那麼一切都會轉到 site4。
任何幫助將不勝感激。
請注意,我只接觸 Apache 大約 2 個月,所以如果有更好的方法來處理這個問題,請告訴我。
您需要為 *:80 定義一個“預設”虛擬主機,為 *:443 和密鑰+證書對定義另一個,否則您的 SSL 請求將到達第一個定義的 SSL 虛擬主機,因此在您的預設 SSL 虛擬主機中添加類似這樣的內容(這包括拒絕訪問而不是重定向的典型方法)所有的花里胡哨:
<VirtualHost *:443> ServerAdmin Admin@admin.com 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>
我很確定 Ubuntu apache2 軟體包已經在安裝時創建了預設站點文件。
如果您的伺服器上缺少它們,您可以嘗試使用虛擬機(例如 VirtualBox 或 Docker)來設置全新安裝以在您的桌面上使用。
查看 /etc/apache2/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 有時最好在一個乾淨的系統上從頭開始,然後在它們糾結後嘗試修復它們。