Ubuntu

Apache如何防止在沒有匹配域的情況下訪問https和http

  • December 4, 2017

以下是我的要求:

  1. 在同一台伺服器上託管多個站點。有些網站使用 SSL,有些則不使用。(埠 443 和 80)
  2. 如果域不匹配,則返回 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 有時最好在一個乾淨的系統上從頭開始,然後在它們糾結後嘗試修復它們。

引用自:https://serverfault.com/questions/886039