202号室の手記

数学やコンピュータの小ネタを中心に書きます.

Nginxでリダイレクトに失敗していると思い込んでいた件

nginxでWebサーバを立てた際, 

80番ポートへのアクセスを443番へリダイレクトする設定をした.

が, ブラウザからアクセスしても, curlでリクエストしても, 

目的のページにはたどり着けなかった.

原因がわからなかったが, 問題は設定ではなくリクエストの仕方にあった.

1. 環境

2. nginxの設定

/etc/nginx/nginx.conf

server {
       listen 80;
       server_name www.hoge.com/;
       return 301 https://$host$request_uri;
       }

www.hoge.comの80番ポートへアクセスがあると,

同じくwww.hoge.comの443番ポートへリダイレクトされる.

サブディレクトリについても同様に, 

http://www.hoge.com/huga?a=1&b=2 は, 

https://www.hoge.com/huga?a=1&b=2 へリダイレクトされる.

このとき, $hostはホスト名 www.hoge.comに,

$request_uriはパス名 /huga?a=1&b=2に対応している.

 

一方, 443番ポートでは, 次の設定で, アクセスを待ち構えている.

/etc/nginx/conf.d/ssl.conf

server {
        listen 443 ssl;
        server_name www.hoge.com;
        root  /var/www/html/;
        ssl_certificate        /path/to/your/cert.pem;
        ssl_certificate_key    /path/to/your/privkey.pem;
        }

これにより, ホストOSの/var/www/htmlディレクトリ以下のコンテンツが読まれることになる.

 

3. 原因1 <Firefoxのリダイレクト拒否設定>

 ...はずであったが, Firefox(53.0.2)でhttp://www.hoge.com/にアクセスしても, 

"正常に接続できませんでした"と表示され, たどり着けない.

原因はブラウザのキャッシュで, 以前接続に失敗したときのキャッシュが残っていたせいであった.

履歴を消去して再度アクセスしたら, リダイレクトに成功した.

 

4. 原因2<curlのオプション>

コマンドラインから

$ curl -I http://www.hoge.com/ --insecure

としても, "HTTP/1.1 301 Moved Permanently"と表示され,

到達できなかった.

これも大変初歩的なのだが, curlはデフォルトでリダイレクトを許容していないのであった.

$ curl -I -L http://www.hoge.com/ --insecure

とすることで解決した.