結論(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へ転送 |
|---|---|
| 項目ID | transport.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プリロードを組み合わせます。
この項目を含む127項目を、URLを入れるだけで無料診断します。
参考資料
- RFC 9110 HTTP Semantics(§15.4 Redirection 3xx)
- OWASP ASVS 5.0.0 V12 Secure Communication
- OWASP WSTG-CRYP-01 Testing for Weak Transport Layer Security
- OWASP WSTG-CONF-07 Test HTTP Strict Transport Security
- HSTS Preload List Submission(hstspreload.org)
- Google「HTTPS by default」
- Chromium Dash リリース日程
- Microsoft Learn「HSTS Settings for a Web Site <hsts>」
- Vercel Docs「Encryption and TLS」