What is HTTP?

プロトコル、HTTPSとの違い、リダイレクト、HTTPヘッダについてまとめました。

## HTTPとは
サーバーとクライアント間で通信するためのプロトコルのことです。
動作がとてもシンプルなのが特徴です。
1つのリクエストに対して1つのレスポンスを返します。
TCPと組み合わせて使われることが多いです。
ポート番号は通常、80番ポートです。
[ポート番号とは？](https://www.cman.jp/network/term/port/)

## HTTPSで暗号化通信
HTTPSは情報を暗号化するセキュアな通信です。
HTTPSのポート番号は通常、443番ポートです。
SSL/TLSプロトコルが作り出す安全な接続を使い、その上でHTTPによる通信を行います。
SSLサーバ証明書をサーバにインストールする必要があります。
[SSL/TLSとは？](https://qiita.com/sasao3/items/dfe402ffe88f697e6928)
[SSLサーバ証明書とは？](https://qiita.com/beckyJPN/items/9c47d13de8ea5b834a3c)

## HTTPリダイレクト
HTTPリダイレクト時は300番代のステータスコードが使われます。
[ステータスコードとは？](https://e-words.jp/w/%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89.html)
4種類のリダイレクトがあります。
### 1. 301(Moved Permanently)  
URLが新しいURLへ永久的にリダイレクトさせる際に使用されます。

```
http://~　→　https://
https://~.com　→　https://~.com/
```
### 2. 302(Found)  
一時的に別のURLへ遷移させたい時に使用されます。

```
システム障害発生！　→　エラーページ遷移
```
### 3. 303(See Other)	  
新しいURLにGETメソッドでアクセスすることが決められたリダイレクトです。

```
お問合せフォーム送信成功！　→　TOPページ遷移
```
### 4. 307(Temporary Redirect)	
一時的に別のURLへ遷移させたい時に使用されます。
302と違い、リダイレクト前と同一メソッドでリダイレクト先へもアクセスを行います。

```
// 302
お問合せフォーム送信成功！　→　POST　→　リダイレクト　→　GET　→　TOPページ遷移
// 307
お問合せフォーム送信成功！　→　POST　→　リダイレクト　→　POST　→　TOPページ遷移
```
### リダイレクト設定は.htaccessで行います。
apacheサーバーですと、mod_rewriteを使います。

```
RewriteEngine On
RewriteCond 条件　// trueなら以下のrewriteを行う
RewriteRule ABC DEF [R=302]  // ABCにアクセスが来たらDEFに302リダイレクト
```

## HTTP ヘッダ
ヘッダーを理解するには、HTTP通信でやり取りされる情報の全体を把握すると分かりやすいです。 
HTTP通信はテキスト形式でやり取りされており、機械語では無いため人でも読めます。HTTPSだと暗号化されるので読めませんが。。。
まず1行目がスタートライン、続く前半部分が制御情報を記したHTTPヘッダ、後半部分が伝送するデータ本体であるHTTPボディ（body）となっています。
ちなみにHTMLファイルなどWeb上のコンテンツはレスポンスのボディに格納されて伝送されます。

### スタートライン
最初の1行で要求や応答の内容を簡潔に伝えます。  

・HTTPリクエストするときのスタートラインの例

|メソッド名| 要求URLまたはパス |プロトコルバージョン|
|---|---|---|
|GET| https://www.example.jp/index.html| HTTP/1.1|


・HTTPレスポンスするときのスタートラインの例

|プロトコルバージョン| ステータスコード |テキストフレーズ|
|---|---|---|
|HTTP/1.1 |200| OK
|HTTP/1.0| 404 |Not Found

### ヘッダフィールド
HTTPヘッダは「ヘッダフィールド」と呼ばれる項目を改行で区切って列挙した形式で記述されます。
個々のフィールドは「フィールド名: 値」という簡潔な書式になっています。
ヘッダには4つの種類があります。
#### 1.リクエストヘッダ
```
リクエストのみで用いるフィールド
  Referer:            参照元ページのURL
  User-Agent:         クライアントソフトの識別名
  Cookie:             ブラウザ側に保存されたサイトデータ
  Authorization:      認証データ
  Accept:             受信可能なデータのMIMEタイプ
  if-Modified-Since:  指定した日付以降に更新されていたらデータの送信を要求
```
[リファラ  (referer)](https://e-words.jp/w/%E3%83%AA%E3%83%95%E3%82%A1%E3%83%A9.html)
[User-Agent  (HTTP_USER_AGENT)](https://e-words.jp/w/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88.html#Section_HTTP%E3%81%AEUser-Agent%E3%83%98%E3%83%83%E3%83%80)
[Cookie](https://e-words.jp/w/Cookie.html)
[MIMEタイプ  (メディアタイプ)](https://e-words.jp/w/MIME%E3%82%BF%E3%82%A4%E3%83%97.html)
  
#### 2.レスポンスヘッダ
```
レスポンスのみで用いるフィールド
  Location:     リダイレクト先URL
  Server:       Webサーバソフトの識別名
  Age:          プロキシのキャッシュに存在する時間
  Set-Cookie:   ブラウザ側にサイトデータを保存
```
[プロキシ  (アプリケーションゲートウェイ)](https://e-words.jp/w/%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7.html)
[キャッシュ](https://e-words.jp/w/%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5.html)

#### 3.一般ヘッダ
```
両方で用いるフィールド
  Cache-Control:      キャッシュ制御情報
  Date:               現在の日付
  Pragma:             システム固有の拡張制御情報
  Upgrade:            上位バージョンのHTTPへ切り替え
  Via:                経由したプロキシの情報
  Transfer-Encoding:  ボディ部のエンコード形式
```
[エンコード](https://e-words.jp/w/%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89.html)

#### 4.エンティティヘッダ
```
ボディ部に格納されているデータについて記述するフィールド
  Expires:            ローカルキャッシュの有効期限
  Last-Modified:      最終更新日時
  Content-Length:     コンテンツの長さ
  Content-Type:       コンテンツのMIMEタイプ
  Content-Language:   コンテンツの言語
  Content-Encoding:   コンテンツのエンコード形式
  Allow:              そのリソースに許可されたHTTPメソッド
```
[リソース](https://e-words.jp/w/%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9.html)
[HTTPメソッド](https://e-words.jp/w/HTTP.html#Section_HTTP%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89)

## 合わせて読みたい
[バーチャルホスト  (仮想ホスト)](https://e-words.jp/w/%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%83%9B%E3%82%B9%E3%83%88.html)
[HTTP/2  (Hypertext Transfer Protocol version 2)](https://e-words.jp/w/HTTP-2.html)