2010-05-13 40 views
1

我們有一個網站,我會打電話給example.com。大多數情況下,您會看到http://www.example.com,有時我們會將您重定向到https://www.example.com將* .example.com和example.com重定向到www.example.com的HTTPS問題

我們希望重定向到http://example.com或http://*.example.com的任何人到http://www.example.com,並且https也是如此。 (這主要是爲了避免你得到的警報,如果你去https://example.com而不是https://www.example.com

我們的虛擬主機文件是在帖子的末尾。它可以很好地除了一個奇怪的現象:

正是這種最後的結果我無法捉摸。我已經嘗試了很多來自Google &堆棧溢出的試用和錯誤解決方案,但似乎沒有任何改變。即使我們交換配置的順序(使443在80之前),它仍然重定向https://foo.example.comhttp://www.example.com

我們在Ubuntu上運行Apache/2.2.12。

這裏的配置文件:

<VirtualHost *:80> 
    ServerName www.example.com 
    ServerAlias example.com *.example.com 
    ServerSignature On 
    DocumentRoot /var/www/example.com/public 
    RailsEnv 'production' 
    PassengerHighPerformance on 
    <Directory /var/www/example.com/public> 
     AllowOverride all 
     Options -MultiViews 
    </Directory> 
    SSLEngine Off 
    CustomLog /var/log/apache2/example.log combined 
    ErrorLog /var/log/apache2/example-error.log 
    # Possible values include: debug, info, notice, warn, error, crit, alert, emerg. 
    LogLevel warn 
    RewriteEngine On 
    RewriteCond %{HTTPS} off 
    RewriteCond %{HTTP_HOST} ^[^\./]+\.[^\./]+$ 
    RewriteRule ^/(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L] 
</VirtualHost> 

<VirtualHost *:443> 
    ServerName www.example.com 
    ServerAlias example.com *.acome.com 
    DocumentRoot /var/www/example.com/public 
    RailsEnv 'production' 
    PassengerHighPerformance on 
    <Directory /var/www/example.com/public> 
     AllowOverride all 
     Options -MultiViews 
    </Directory> 
    SSLCertificateFile /etc/ssl/certs/www.example.com.crt 
    SSLCertificateKeyFile /etc/ssl/private/example.com.private.key 
    SSLCACertificateFile /etc/ssl/certs/EV_intermediate.crt 
    SSLEngine On 
    CustomLog /var/log/apache2/ssl-example.log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" 
    ErrorLog /var/log/apache2/ssl-example-error.log 
    # Possible values include: debug, info, notice, warn, error, crit, alert, emerg. 
    LogLevel warn 
    RewriteEngine On 
    RewriteCond %{HTTPS} on 
    RewriteCond %{HTTP_HOST} ^[^\./]+\.[^\./]+$ 
    RewriteRule ^/(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L] 
</VirtualHost> 

回答

0

感謝大家花時間閱讀這個問題,或者(甚至更好)嘗試和幫助。這就是Stack Overflow這樣一個有用的資源。

我們重新閱讀TFM,瞭解了一些關於Apache重寫的知識,這裏是答案。

問題1:重寫規則(取自Google)旨在將acme.com重定向到www.acme.com,而不是任何其他子域。

問題2:由於某些原因,Chrome自行重定向到http://www.acme.com。當我們完全刪除重寫規則時,所描述的行爲仍然發生。

解決方案:更改重寫規則以實際捕獲除www以外的任何子域。

請參閱下面的工作解決方案。

還有一個問題。如果您轉到https://acme.com(或任何子域),某些瀏覽器會在重定向您之前發出SSL認證不匹配的警告。解決這個問題的唯一方法是獲得通配證書。由於我們使用的擴展驗證證書已經非常昂貴,因此我們現在只能忍受這種警告。很想聽聽任何避免在重定向之前顯示無效的證書警告的解決方法。

<VirtualHost *:80> 
    ServerName www.acme.com 
    ServerAlias acme.com *.acme.com 
    ServerSignature On 
    DocumentRoot /var/www/acme.com/public 
    RailsEnv 'production' 
    PassengerHighPerformance on 
    <Directory /var/www/acme.com/public> 
     AllowOverride all 
     Options -MultiViews 
    </Directory> 
    SSLEngine Off 
    CustomLog /var/log/apache2/acme.log combined 
    ErrorLog /var/log/apache2/acme-error.log 
    # Possible values include: debug, info, notice, warn, error, crit, alert, emerg. 
    LogLevel warn 
    RewriteEngine On 
    RewriteCond %{HTTPS} off 
    RewriteCond %{REQUEST_URI} ^/(stats/|missing\.html|failed_auth\.html|error/).* [NC] 
    RewriteRule .* - [L] 
    RewriteCond %{ENV:REDIRECT_STATUS} 200 
    RewriteRule .* - [L] 
    RewriteCond %{HTTP_HOST} !^www\.[a-z-]+\.[a-z]{2,6} [NC] 
    RewriteCond %{HTTP_HOST} ([a-z-]+\.[a-z]{2,6})$  [NC] 
    RewriteRule ^/(.*)$ http://www.%1/$1 [R=301,L] 
</VirtualHost> 

<VirtualHost *:443> 
    ServerName www.acme.com 
    ServerAlias acme.com *.acme.com 
    DocumentRoot /var/www/acme.com/public 
    RailsEnv 'production' 
    PassengerHighPerformance on 
    <Directory /var/www/acme.com/public> 
     AllowOverride all 
     Options -MultiViews 
    </Directory> 
    SSLCertificateFile /etc/ssl/certs/www.acme.com.crt 
    SSLCertificateKeyFile /etc/ssl/private/acme.com.private.key 
    SSLCACertificateFile /etc/ssl/certs/EV_intermediate.crt 
    SSLEngine On 
    CustomLog /var/log/apache2/ssl-acme.log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" 
    ErrorLog /var/log/apache2/ssl-acme-error.log 
    # Possible values include: debug, info, notice, warn, error, crit, alert, emerg. 
    LogLevel warn 
    RewriteEngine On 
    RewriteCond %{HTTPS} on 
    RewriteCond %{REQUEST_URI} ^/(stats/|missing\.html|failed_auth\.html|error/).* [NC] 
    RewriteRule .* - [L] 
    RewriteCond %{ENV:REDIRECT_STATUS} 200 
    RewriteRule .* - [L] 
    RewriteCond %{HTTP_HOST} !^www\.[a-z-]+\.[a-z]{2,6} [NC] 
    RewriteCond %{HTTP_HOST} ([a-z-]+\.[a-z]{2,6})$  [NC] 
    RewriteRule ^/(.*)$ https://www.%1/$1 [R=301,L] 
</VirtualHost> 
0
ServerAlias acme.com *.acome.com 

是,這個問題在那裏?你拼錯了你的域名。

+0

不太可能是問題 - 我不認爲acme.com是他的ACTUAL域名。 :) – EMP 2010-05-13 22:59:39

+1

是的,但這很好地說明了使用假數據尋求幫助的問題。 OP沒有向我們展示*真實*問題。 – 2010-05-13 23:06:41

相關問題