• 診断項目 No.4/127
  • 通信の暗号化(HTTPS・TLS・HSTS)
  • 重大度 重要(high)

HTTPからHTTPSへ転送とは?301/308リダイレクトの設定方法と診断基準

HTTPからHTTPSへ転送とは、http:// のアクセスを3xx応答でHTTPSへ自動転送する設定です。301と308の使い分け、Apache・nginx・IIS・Vercelの設定例、リダイレクトループの防ぎ方、診断基準を解説します。

結論(HTTPからHTTPSへ転送)

HTTPからHTTPSへ転送とは、利用者が http:// で始まるURLにアクセスしたとき、サーバーが301や308などの3xx応答とLocationヘッダーで、同じパスのHTTPSのURLへ自動的に案内する設定です。印刷物やブックマークの古いURLから訪れた住民も暗号化された通信に移せます。ただし最初のHTTPリクエストは平文のため、HSTSとの併用が必要です。

この記事のポイント

  • HTTPS化は恒久的な変更なので、301 Moved Permanently または 308 Permanent Redirect を使います。
  • JavaScriptやmeta refreshではなく、サーバー側の3xx応答で転送します。
  • トップページへ一律に飛ばさず、下層ページも同じパス・クエリのHTTPS URLへ転送します。
  • 転送だけではSSL Strip攻撃を防げないため、HSTSとプリロードで補います。
  • セキュリティAIチェッカーは、http:// で入力したときに最終URLが https: なら○、http: のままなら×、https:// で入力した場合は対象外とします。
診断項目名HTTPからHTTPSへ転送
項目IDtransport.redirect
分類通信の暗号化(HTTPS・TLS・HSTS)
重大度・配点の重み重要(high) 重み 4
関連する標準・ガイドラインOWASP ASVS 5.0.0 V12.2.1(L1:外部向けHTTPサービスとの通信にTLSを使い、非暗号化通信へフォールバックしない)、OWASP WSTG-CRYP-01(HTTPからHTTPSへの転送とSSL Strip)、WSTG-CONF-07(HSTSと転送の併用)、RFC 9110 §15.4(3xxリダイレクト)、CWE-319

HTTPからHTTPSへ転送とは

HTTPからHTTPSへ転送とは、利用者が http:// で始まるURLにアクセスしたとき、サーバーがHTTPSのURLへ自動的に転送(リダイレクト)する設定のことです。住民は、検索結果、古い広報紙に印刷されたURL、ブックマーク、他団体サイトのリンクなど、さまざまな経路から http:// でアクセスしてきます。HTTPでもページを表示してしまうと、せっかくHTTPSを用意しても、暗号化されない閲覧経路が残ります。

セキュリティAIチェッカーでは重大度high、重み4の項目です。

転送の仕組みと301・308の使い分け

サーバーはHTTPリクエストに対して3xxステータスと Location ヘッダーを返し、ブラウザはそのURLへ改めてアクセスします。RFC 9110で定義される主な転送ステータスは次のとおりです。

ステータス意味HTTPS化での使い方
301 Moved Permanently恒久的な移動最も一般的。検索エンジンも新URLへ評価を移す
308 Permanent Redirect恒久的な移動(メソッドと本文を保持)POSTも維持したい場合に適する。Vercelなどが採用
302 Found / 307 Temporary Redirect一時的な移動恒久的なHTTPS化には不向き

HTTPS化は恒久的な変更なので、301または308を使います。

HTTPSへの転送だけでは防げないこと

最初のHTTPリクエストは平文で送られる

転送は「最初のHTTPリクエスト」が平文で送られた後に行われます。そのため、経路上の攻撃者はこの最初のHTTP応答を横取りし、HTTPSへ転送させずにHTTPのまま偽ページを表示させることができます(SSL Strip攻撃)。WSTG-CRYP-01もこの弱点を指摘し、HSTSとプリロードの併用を推奨しています。

仕組み役割
転送HTTPでアクセスしてきた利用者をHTTPSへ案内する(初回を含む)
HSTS一度HTTPSで訪れたブラウザに、次回以降は最初からHTTPSで接続させる
HSTSプリロード初回訪問からHTTPSを強制する

3つは補完関係にあり、転送はその土台です。hstspreload.orgのプリロード登録要件にも「ポート80で待ち受けている場合は、同じホストのHTTPSへ転送すること」が含まれています。HSTSについては「HSTSが設定されている」、プリロードについては「HSTS Preload要件」で詳しく解説しています。

HTTPSへの転送についてよくある誤解

  • 「HTTPSのページを用意したので、HTTPは放置してよい」:HTTPでも同じ内容が表示されるなら、利用者は暗号化されないまま閲覧・入力を続けます。
  • 「JavaScriptや meta refresh で転送すればよい」:HTTPのページ本体が一度平文で読み込まれ、改ざんの余地が残ります。サーバー側の3xx応答で転送してください。
  • 「トップページだけ転送すればよい」:http://…/kurashi/ など下層ページへの直接アクセスも、同じパスのHTTPS URLへ転送する必要があります。トップページへ一律に飛ばすと、利用者が目的のページを見失います。

HTTPからHTTPSへ転送の診断基準(セキュリティAIチェッカー)

取得方法

  • 入力されたURLへGETリクエストを送り、3xx(301/302/303/307/308)の Location を最大4回までたどります。
  • 入力URLのスキームが http: の場合に限り、最終的に到達したURLのスキームを確認します。
  • 転送はHTTPステータスによるものだけを追跡します。HTMLのmeta refreshやJavaScriptによる転送は追跡しません。

判定条件

判定条件得点への影響
○ 問題なし(pass)入力URLが http: で、転送の結果、最終URLが https: になった重み4を加算。根拠欄に「HTTPSまでN回で転送されました。」と転送回数を表示
× 要改善(fail)入力URLが http: で、最終URLも http:(転送なし、またはHTTP内での転送のみ)重み4の分母に入り0点
対象外(na)入力URLが https:(HTTPでのアクセスを試していないため判定不能)採点から除外
  • 転送が4回を超えると、リダイレクトのループや過剰な多段転送とみなして診断エラーになります。
  • 別ホストへの転送(例:http://city.example.lg.jp/ → https://www.city.example.lg.jp/)も○です。ただしHSTSプリロードを目指す場合は、まず同じホストのHTTPSへ転送する必要があります。
  • この項目を評価するには、URL欄に http:// で始まるURLを入力して診断してください。https:// で入力した場合は対象外となり、HTTP側の挙動は評価されません。
  • HTTPSからHTTPへ戻る転送は、「HTTPSからHTTPへ降格しない」(transport.redirect-downgrade、重み5、critical)で×になります。いったんHTTPSへ転送された後にHTTPへ戻り、最終URLが http: になった場合は、この項目も×です。

自治体サイトでの判定例

入力URL応答判定
http://www.city.example.lg.jp/301 → https://www.city.example.lg.jp/ → 200○(1回で転送)
http://city.example.lg.jp/301 → https://city.example.lg.jp/ → 301 → https://www.city.example.lg.jp/○(2回)
http://www.town.example.lg.jp/200(HTTPのまま表示)×
http://www.town.example.lg.jp/200 で meta refresh によりHTTPSへ移動×(サーバー側の転送ではない)
https://www.village.example.lg.jp/200対象外

HTTPSへ転送しないとどんなリスクがあるか

  • 平文閲覧の継続:印刷物やブックマークのHTTP URLから訪れた住民が、暗号化されないままページを閲覧し、フォームに入力する状態が続きます。
  • SSL Strip攻撃:転送がない、または転送があってもHSTSがないと、公衆無線LANなどで攻撃者がHTTP通信を中継し、HTTPS版へ移らせずに偽のフォームを表示できます。
  • 改ざん・なりすまし:HTTPのページは経路上で書き換え可能なため、偽の問い合わせ先や不正なダウンロードリンクを挿入されるおそれがあります。
  • ブラウザ警告:GoogleはChrome 154(安定版は2026年9月22日公開)から「常に安全な接続を使用する」を既定で有効にすると発表しており、HTTPSのない公開サイトへの初回アクセス前に警告が表示されます。転送が正しく設定されていれば、ブラウザがHTTPSを試みた時点で正常に表示されます。

HTTPからHTTPSへ転送する設定方法(Apache・nginx・IIS・Next.js)

Apache(.htaccess)

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTPS} !=on
  # ロードバランサーやCDNでTLS終端している場合は次の行も条件に加える
  # RewriteCond %{HTTP:X-Forwarded-Proto} !https
  RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>

VirtualHostを編集できる場合は、.htaccess よりもポート80側の設定で行うほうが確実で高速です。

<VirtualHost *:80>
    ServerName www.city.example.lg.jp
    Redirect permanent / https://www.city.example.lg.jp/
</VirtualHost>

nginx

server {
    listen 80;
    server_name city.example.lg.jp www.city.example.lg.jp;
    return 301 https://$host$request_uri;
}

IIS

IIS 10.0 version 1709以降は、サイトの <hsts> 要素で転送を設定できます(applicationHost.config に記述するか、appcmd で設定)。

<site name="CityWeb">
  <hsts enabled="true" max-age="300" redirectHttpToHttps="true" />
</site>

それ以前のバージョンでは、URL Rewriteモジュールを使います。

<rewrite>
  <rules>
    <rule name="HTTP to HTTPS" stopProcessing="true">
      <match url="(.*)" />
      <conditions><add input="{HTTPS}" pattern="off" /></conditions>
      <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
    </rule>
  </rules>
</rewrite>

Next.js(Vercel)

VercelはHTTPへのアクセスを自動的にHTTPSへ転送します(308)。独自ドメインを追加すれば追加設定は不要です。セルフホストのNext.jsでは、前段のnginxやロードバランサーで転送します。

CMS・クラウドWAF

CMSの管理画面に「常時SSL」「HTTPSへリダイレクト」の設定がある場合はそれを使い、.htaccess の手書き設定と二重にならないようにします。二重設定はリダイレクトループの原因になります。

転送設定の確認方法

# トップページ
curl -sI http://www.city.example.lg.jp/ | grep -iE '^(HTTP/|location:)'
# 下層ページ(同じパスへ転送されるか)
curl -sI "http://www.city.example.lg.jp/kurashi/index.html?x=1" | grep -i '^location:'
# 転送をたどって最終ステータスを確認
curl -sIL -o /dev/null -w '%{url_effective} %{http_code}\n' http://www.city.example.lg.jp/

location: https://… が同じパス・クエリを保っていれば、正しく設定されています。

サイトを壊さないための注意点

  • リダイレクトループ:CDNやロードバランサーでTLSを終端し、Webサーバーへは常にHTTPで届く構成では、%{HTTPS} が常にoffになり無限に転送されます。X-Forwarded-Proto を条件にするか、CDN側で転送してください。
  • POSTの扱い:301でPOSTを転送すると、ブラウザによってはGETに変わります。フォームの送信先は最初から https:// にし、必要なら308を使います。
  • 外部連携:HTTPでデータを送ってくる古い連携システムがないか、転送を有効にする前に確認します。
  • 共有ホスティングの .htaccess に php_value などを同時に追記すると、LiteSpeed/CGI環境では500エラーになることがあります。転送の設定だけを追加し、変更前のファイルを保存してから反映してください。

よくある質問(FAQ)

HTTPからHTTPSへの転送は301と302のどちらを使うべきですか?

HTTPS化は恒久的な変更なので、301または308を使います。302や307は一時的な移動を表すため、恒久的なHTTPS化には向きません。

301と308の違いは何ですか?

どちらも恒久的な移動ですが、308はリクエストのメソッドと本文を保持します。301でPOSTを転送すると、ブラウザによってはGETに変わるため、POSTを維持したい場合は308が適しています。Vercelは308を使います。

meta refreshやJavaScriptでHTTPSへ移動させてもよいですか?

おすすめしません。HTTPのページ本体が一度平文で読み込まれるため、改ざんの余地が残ります。セキュリティAIチェッカーもHTTPステータスによる転送だけを追跡し、meta refreshによる移動は×と判定します。

転送を設定したらリダイレクトループになりました。原因は何ですか?

CDNやロードバランサーでTLSを終端し、Webサーバーへは常にHTTPで届く構成では、%{HTTPS} が常にoffになり無限に転送されます。X-Forwarded-Protoを条件にするか、CDN側で転送してください。CMSの常時SSL設定と.htaccessの二重設定もループの原因になります。

診断で「HTTPからHTTPSへ転送」が対象外になるのはなぜですか?

https:// で始まるURLを入力して診断した場合、HTTPでのアクセスを試していないため対象外になります。この項目を評価するには、http:// で始まるURLを入力して診断してください。

HTTPSへ転送していればHSTSは不要ですか?

必要です。転送は最初のHTTPリクエストが平文で送られた後に行われるため、経路上の攻撃者はその応答を横取りできます(SSL Strip攻撃)。2回目以降を守るHSTSと、初回を守るHSTSプリロードを組み合わせます。

セキュリティAIチェッカーを利用する

この項目を含む127項目を、URLを入れるだけで無料診断します。

参考資料