Ubuntu Server12.04でApache2.2.22を使用してHTTPリクエストをHTTPSに強制的にリダイレクトするためにmod_rewriteを使用する際に問題が発生しました。
私の/ etc/Apache2/sites-available/defaultファイルは次のとおりです。
<VirtualHost *:80>
RewriteEngine On
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^/(.*) https://%{HTTP_Host}/$1 [NC,R,L]
</VirtualHost>
HTTPSホストは、同じディレクトリのdefault-sslで定義されています。
サーバーのローカルIPアドレスにアクセスすると、リダイレクトは正常に機能しているように見えます。ただし、FQDNを介してアクセスする場合は、アクセスしません。 FQDNを使用すると、サイトはポート5443で利用できます。ポート5443は、ファイアウォールでサーバー上の443にマップされているため、おそらく問題と関係があります。別のサーバーによってこのIPアドレスで使用されているため、ポート443を直接使用することはできません。
さらに明確にするために、以下は有効なリンクです。
https://website:5443
https://192.168.200.80:443
リダイレクトはここで機能します:
http://192.168.200.80
しかし、以下は400 Bad Requestを示し、ここでリダイレクトが必要になります。
http://website:5443/
「ブラウザがこのサーバーが理解できないリクエストを送信しました。理由:SSL対応のサーバーポートにプレーンHTTPを送信しています。代わりにHTTPSスキームを使用してこのURLにアクセスしてください。」
これは完全に可能です。以下は、すべてのhttpをhttpsURLにリダイレクトします。
<VirtualHost *:80>
ServerName mydomainname.com
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI}
</VirtualHost>
必ずリライトモジュールmod_rewriteをロードして有効にしてください。
ここでの問題は、最初のHTTPリクエストです。サーバーがポート443でリクエストを受信したことを理解できないため、これは機能しません(応答コードが示すように)。
ポートが指定されていない場合、プロトコルhttp
はデフォルトでポート80に、https
はポート443にデフォルト設定されます。
これは、ローカルリダイレクトが機能する理由でもあります。 http://website/
(ポート80の適切なポート転送を使用)を介してページにアクセスすると、それも機能するはずです。また、VirtualHost
はポート80に対してのみ定義されているため、website:5443
(またはwebsite:443
)に送信されたリクエストには無効であることに注意してください。
一般に、単一のポートでHTTPリクエストとHTTPSリクエストの両方を受け入れるサーバーが必要です。 (私が思うに)それは本質的に仕様に違反しているので、人気のあるサーバーが実際にそのようなものをサポートしているかどうかはわかりません。
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R,L]
サイトをhttp://anything.example.comからhttps://anything.example.comにリダイレクトする場合...専用のホスティング.confファイルを/etc/httpd/conf.d/dedicatedとして作成するだけです。 virtual.confとしてのconfおよびその他のconfファイル... dedicated.confのエントリは次のとおりです..。
これは、httpsにリダイレクトするためのconfファイルをホストする専用サーバーです...
<virtualhost *:80>
servername Host.example.com
documentroot /var/www/html
rewriteengine on
RewriteRule ^/(.*) https://%{HTTP_Host}/$1 [NC,R,L]
sslcertificatefile /etc/pki/tls/certs/name.crt
sslcertificatekeyfile /etc/pki/tls/private/name.key
</virtualhost>
<directory /var/www/html>
allowoverride all
require all granted
</directory>
または、以下のコメントで説明されているように、リダイレクトも使用できます:
<virtualhost *:80>
servername Host.example.com
documentroot /var/www/html
RedirectMatch / https://Host.example.com:ANY_PORT/ #if there is specific port
sslcertificatefile /etc/pki/tls/certs/name.crt
sslcertificatekeyfile /etc/pki/tls/private/name.key
</virtualhost>
<directory /var/www/html>
allowoverride all
require all granted
</directory>