Apache 從 http 重定向到 https 不起作用

Apache 從 http 重定向到 https 不起作用

我有以下conf檔:

文件1:

NameVirtualHost  123.45.67.890:80

<VirtualHost 123.45.67.890:80>
    ServerName example.com

    RedirectPermanent / https://example.com/

#   RewriteEngine On
#   RewriteCond %{SERVER_PORT} !^443$
#   RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [L,R]

#   SSLRequireSSL
#   Redirect permanent /secure https://example.com/

#   Redirect / https://example.com/
</VirtualHost>

正如您從註解掉的行中看到的,我嘗試了幾種方法。

文件2:

NameVirtualHost 123.45.67.890:443

<VirtualHost 123.45.67.890:443>
    DocumentRoot "/opt/www/example-docroot"
    ServerName example.com
    DirectoryIndex index.html
    SSLEngine on

    SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
    SSLCertificateFile /etc/httpd/conf.d/ssl/example.com/csr.example.2011.pem.blade
    SSLCertificateKeyFile /etc/httpd/conf.d/ssl/example.com/nokey.example.2011.pem
    SSLCACertificateFile /etc/httpd/conf.d/ssl/example.com/CA.blade.2011.csr

    <Files ~ "\.(cgi|shtml|phtml|php3?)$">
        SSLOptions +StdEnvVars
    </Files>
    <Directory "/etc/httpd/cgi-bin">
        SSLOptions +StdEnvVars
    </Directory>
</VirtualHost>

為了簡單起見,刪除了一些內容,更改了名稱以保護無辜者。

我在伺服器 /etc/httpd/vhosts 上更新這些文件

然後運行

apachectl restart

這確實給了我這些警告:

[warn] NameVirtualHost 123.45.67.890:80 has no VirtualHosts
[warn] NameVirtualHost 123.45.67.890:80 has no VirtualHosts

我們有許多虛擬主機從該伺服器運行。上面的配置似乎是一致的,所以我認為這些警告在這裡不適用。也許是錯的。

更新瀏覽器中的預設 80 (http) 頁面,並始終顯示預設的 http 頁面。

關於如何使重定向正常工作有什麼建議嗎?

答案1

許多範例適用於特定配置。無論您的 Apache 伺服器使用哪種配置,此方法始終有效:

RewriteEngine On
RewriteCond %{SERVER_PORT} !443
RewriteRule ^(/(.*))?$ https://%{HTTP_HOST}/$1 [R=301,L]

答案2

幾天前我遇到了完全相同的問題。我在 apache httpd.conf 檔案中的 VirtualHost 配置(適用於 http 連接埠 80)中嘗試了以下操作。

<Virtualhost *:80>
ServerAdmin [email protected]
ServerName site.com
ServerAlias site.com www.site.com

RedirectMatch permanent ^(.*)$ https://www.site.com$1
</Virtualhost>

這就像魅力一樣,您不需要在其他地方進行任何配置或任何額外的模組。

答案3

更好地利用.htaccess這個(如果可能的話),不需要弄亂 apache 設定檔。將這些行加入您的.htaccess.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

答案4

我們的問題是設定檔優先級。簡而言之,HTTP VirtualHost000-default.conf覆蓋了我們在自己的設定檔中所建立的設定。

這會讓任何知道“默認”一詞含義的人感到困惑,“默認”意味著只有在其他地方沒有定義的情況下才使用它。我們愚蠢地認為000-default.conf只有在另一個設定檔中沒有定義的情況下才會提供配置。

我們錯了。 Apache 僅根據檔案名稱(按字母數字順序)使用它遇到的第一個檔案中的配置。如果它在該文件中找不到匹配的 VirtualHost,它會移至下一個文件,如果您不知道它是如何工作的,這會導致有趣的混亂,但一旦您知道它就很整潔。

相關內容