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

このサーバーから多数の vhost が実行されています。上記の構成は一致しているように見えるため、これらの警告はここでは適用されないと思います。間違っているかもしれません。

ブラウザでデフォルトの 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 VirtualHost が、000-default.conf独自の設定ファイルで作成した設定を上書きしていたのです。

これは、「デフォルト」という言葉の意味を知っている人にとっては混乱を招くものです。「デフォルト」とは、他の場所で定義されていない場合にのみ使用されるものを意味します。私たちは愚かにも、000-default.conf別の構成ファイルで定義されていない場合にのみ構成が提供されるものと想定していました。

私たちは間違っていました。Apache は、ファイル名の英数字順に基づいて、最初に遭遇したファイルの設定を使用するだけです。そのファイルで一致する VirtualHost が見つからない場合は、次のファイルに移動します。仕組みがわからない場合は、面白い混乱を引き起こしますが、一度理解すると、かなり便利です。

関連情報