我有以下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,它會移至下一個文件,如果您不知道它是如何工作的,這會導致有趣的混亂,但一旦您知道它就很整潔。