web-dev-qa-db-ja.com

Apacheを使用してHTTPをHTTPSにリダイレクトする

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にアクセスしてください。」

6
dutchgold92

これは完全に可能です。以下は、すべてのhttpをhttpsURLにリダイレクトします。

<VirtualHost *:80>
    ServerName   mydomainname.com
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI}
</VirtualHost>

必ずリライトモジュールmod_rewriteをロードして有効にしてください。

10
Steven Soroka

ここでの問題は、最初のHTTPリクエストです。サーバーがポート443でリクエストを受信したことを理解できないため、これは機能しません(応答コードが示すように)。

ポートが指定されていない場合、プロトコルhttpはデフォルトでポート80に、httpsはポート443にデフォルト設定されます。

これは、ローカルリダイレクトが機能する理由でもあります。 http://website/(ポート80の適切なポート転送を使用)を介してページにアクセスすると、それも機能するはずです。また、VirtualHostはポート80に対してのみ定義されているため、website:5443(またはwebsite:443)に送信されたリクエストには無効であることに注意してください。

一般に、単一のポートでHTTPリクエストとHTTPSリクエストの両方を受け入れるサーバーが必要です。 (私が思うに)それは本質的に仕様に違反しているので、人気のあるサーバーが実際にそのようなものをサポートしているかどうかはわかりません。

3
Mario
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R,L]
0
Leela Krishna

サイトをhttp://anything.example.comからhttps://anything.example.comにリダイレクトする場合...専用のホスティング.confファイルを/etc/httpd/conf.d/dedicatedとして作成するだけです。 virtual.confとしてのconfおよびその他のconfファイル... dedicated.confのエントリは次のとおりです..。

これは、httpsにリダイレクトするためのconfファイルをホストする専用サーバーです... th[][1]

<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>