2017-09-01 168 views
1

我目前正在構建與通配符子域一起使用的應用程序。Apache重定向通配符子子域到子域

例如:

  • customer1.domain.com

  • customer2.domain.com

所以我們買了一個通配符SSL證書* .domain.com和將所有子域從http重定向到https。

到目前爲止,這麼簡單,但現在我們有客戶在瀏覽器中手動鍵入www.customer1.domain.com,因爲這個不存在虛擬主機。

什麼,我想現在要做的是,重定向從http://www.wildcard.domain.com所有請求https://wildcard.domain.com

我們的虛擬主機看起來像:

<VirtualHost {{IP-ADRR}}:443> 
    Servername %1.domain.com 
    VirtualDocumentRoot /path/to/webroot/%0 
    Include /etc/httpd/conf/options-ssl-standard.conf 
</VirtualHost> 

我們重定向所有的HTTP請求到同一個目標上HTTPS的樣子:

<Virtualhost {{IP-ADRR}}:80> 
    ServerName %1.domain.com 
    RewriteEngine On 
    RewriteCond %{HTTPS} !=on 
    RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L] 
</VirtualHost> 
+0

如果用戶訪問http ** s **://www.wildcard.domain.com,該怎麼辦?下面的解決方案是否工作? –

回答

1

用於重定向的解決方案是:

<Virtualhost {{IP-ADRR}}:80> 
    ServerName %1.domain.com 
    RewriteEngine On 
    RewriteCond %{HTTPS} off [OR] 
    RewriteCond %{HTTP_HOST} ^www\. [NC] 
    RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC] 
    RewriteRule^https://%1%{REQUEST_URI} [L,NE,R=301] 
</VirtualHost> 

說明:

RewriteCond %{HTTPS} off [OR] 
RewriteCond %{HTTP_HOST} !^www\. [NC] 

這兩條線是是重定向的條件下,它們被用於確定所述請求是否應被重定向。由於條件與[OR]結合,如果這兩個條件中的任何一個返回true,Apache將執行重寫規則(重定向)。

第一個條件確定請求是否使用非HTTPS URL。第二個條件確定請求是否使用www URL。注意我使用了www \。而不是www。,因爲這個模式是一個正則表達式和。點在這裏有特殊的含義,因此它必須逃脫。

RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC] 

第四行是我用來避免直接在URL中引用主機名的便利行。它匹配傳入請求的HOST,並將其分解爲www部分(如果有)和主機名的其餘部分。我們稍後會在RewriteRule中用%1來引用它。

RewriteRule^https://www.%1%{REQUEST_URI} [L,NE,R=301] 

RewriteRule是重定向的核心。通過這一行,我們告訴Apache將任何請求重定向到一個新的URL,組成如下:

  • https://www
  • %1:參照主機
  • %{REQUEST_URI}的非www部分:請求的URI,沒有主機名

所有這些令牌被接合在一起,並代表最終重定向URI。最後,我們追加3個標誌:

  • NE不轉義特殊字符
  • R = 301使用HTTP 301重定向狀態
  • L到停止處理其他規則,並立即重定向