2016-04-22 67 views
0

我正在嘗試使用Apache和mod_rewrite讓我們的drupal站點在完整的https後面運行AWS負載平衡器。 ELB充當SSL證書提供者。所有到ELB的流量都應該被加密,然後到EC2實例的流量是正常的HTTP(非常標準)。在AWS彈性負載平衡器後面的Drupal中啓用https

我嘗試了各種各樣的.htaccess和Apache conf.d/*。conf mod_rewrite的條件和規則。當我能夠將流量重定向到https時,它會打破ELB的健康檢查,將我的「不健康」EC2實例從池中移出。如果我試圖修復它,所以ELB健康檢查會通過,我會得到一個無限的重定向問題。

經過一週左右的工作,我終於找到了解決方案。如果你有同樣的問題,請看這裏!它可能無法爲你工作100%,但至少我可以闡明如何去解決它。

+0

這似乎不是一個問題。此外,你發佈的問題已被問及在這裏多次回答,就像這裏:http://stackoverflow.com/questions/17174626/elb-and-apache-configuration-for-https-website –

+0

我' m投票結束這個問題作爲題外話,因爲這不是一個問題。 –

+0

對不起 - 正在寫答案。我嘗試過的其他方法都無法正常工作,或者至少沒有詳細解釋以幫助我。由於使用了RewriteRule,您發佈的內容被嘗試並導致無限重定向。我可以通過手動輸入域名來實現它的唯一方法。 – tbox

回答

1

那麼這裏是我對一個網站的回答,我希望所有的交通指向https://example.com。 (如果你想https://www.example.com,你可以做出一些調整)

首先,在/sites/default/settings.php Drupal的settings.php配置文件:

在這個文件我有以下幾點:

$base_url = '//example.com'; 
$conf['reverse_proxy'] = TRUE; 
$conf['reverse_proxy_addresses'] = array('name-of-my-loadbalancer.us-west-2.elb.amazonaws.com'); 
$conf['reverse_proxy_header'] = 'HTTP_X_CLUSTER_CLIENT_IP'; 

說實話,我不知道上述「reverse_proxy」設置是否真的有必要。事實上,我禁用了它們,它似乎沒有影響任何東西,所以它可能不會。重要的部分是確保你的settings.php文件中有$base_url = '//example.com';

下一部分是配置您的.htaccess文件。這是很重要的位:

RewriteCond %{HTTP:X-Forwarded-Proto} !https 
RewriteCond %{HTTPS} off 
RewriteCond %{REQUEST_URI} !=/healthy.html 
RewriteRule^https://example\.com%{REQUEST_URI} [L,R=301] 

對於像我這樣的小白,這是艱難的,首先要弄清楚,但這裏的崩潰:

  1. RewriteCond %{HTTP:X-Forwarded-Proto} !https這看起來在 協議發送由負載均衡器。如果該協議不是https https,請啓動RewriteRule。

  2. RewriteCond %{HTTPS} off如果流量爲首不是HTTPS網站,開始重寫規則

  3. RewriteCond %{REQUEST_URI} !=/healthy.html這是一個重要的一點。我有一個簡單的healthy.html文件,其中包含單詞「Success!」。在我的Apache主drupal webroot目錄中。當ELB訪問healthy.html文件時,它將繞過我們的重寫規則。如果沒有ELB健康檢查失敗,請將我們的服務器脫機。

  4. RewriteRule^https://example\.com%{REQUEST_URI} [L,R=301]這是實際的重寫規則。如果上述所有條件都通過,則會將傳入的URL重寫爲https://example.com/whatever。順便說一下,L代表「最後」,如「這是該組的最後一條規則」,「R = 301」代表「301重定向」。

唯一的一次,這並不做一個適當的重定向是,如果我手動輸入https://www.example.com(與在開始HTTPS)。我想我可以用另一個簡單的RewriteCond來解決這個問題。