質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Q&A

解決済

3回答

2393閲覧

nginxでhttpへのアクセスをhttpsへと自動リダイレクトしたい

Nikkoh_ban

総合スコア26

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

0グッド

0クリップ

投稿2019/05/22 12:59

現在nginxにてWebサーバーを構築しているところです。

httpでのアクセスおよびLet's EncryptのSSL証明書によるhttpsアクセスができるところまで構築できました。
そこでhttpへのアクセスも全てhttps側へリダイレクトしようとしているのですが、設定ファイルに

server { listen 80; listen [::]:80; return 301 https://$host$request_uri; 〜以下略〜
listen 80; listen [::]:80; if ($http_x_forwarded_proto != https) { rewrite ^(.*)$ https://hoge.hogehoge.hoge$1 permanent; } 〜以下略〜

のリダイレクト設定どちらとも無限ループに入ってしまい、Firefoxでは

ページの自動転送設定が正しくありません

となってしまい、http、httpsともにアクセスできなくなってしまいます。
コメントアウトした上でnginxを再起動すると元通りアクセスできるため、この追記部分が問題だと判断しています。

どなたか解決策をご教授いただけないでしょうか?
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

1

ベストアンサー

443で受けてる側の設定が間違ってるんだと思いますよ。以下略とされているどこかがおかしいんでしょうね。

投稿2019/05/22 13:09

hentaiman

総合スコア6428

scsi👍を押しています

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Nikkoh_ban

2019/05/22 13:53

回答いただきありがとうございます。 "/etc/nginx/sites-available/default"はこのように記述しています。 どこかおかしなところはあるのでしょうか。 server { listen 80; listen [::]:80; listen 443 ssl; listen [::]:443 ssl; ssl_prefer_server_ciphers on; ssl_ciphers 'ECDH !aNULL !eNULL !SSLv2 !SSLv3'; ssl_certificate /etc/letsencrypt/live/hoge.hogehoge.hoge/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/hoge.hogehoge.hoge/privkey.pem; server_name hoge.hogehoge.hoge; root /var/www/html; index index.html index.htm index.php; location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. # try_files $uri $uri/ =404; try_files $uri $uri/ /index.php?$args; } location ~ .php$ { try_files $uri =404; fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location /phpmyadmin { root /usr/share; index index.php; location ~ ^/phpmyadmin.+.php$ { fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } }
hentaiman

2019/05/22 14:02

ssl onディレクティブ(っていうのか?)がどこにも書いてないのでhttpとして扱われてるんじゃないですか?onにしたら80も443も多分httpsとして扱われると思うけど しかしhttpとhttpsを同じserverディレクティブ(?)に書いてるの?そんな書き方考えたことも無かったな。nginxインストールした時にdefaultとsslでconf分かれてたと思うので、その辺の作法は真似してserver分けた方が良いんじゃないですか?
Nikkoh_ban

2019/05/24 13:29

ご指摘ありがとうございます。 今一度調べながら定義を見直してみますので、次の回答までしばしお時間をください。 よろしくお願いします。
Nikkoh_ban

2019/05/24 15:24

ご指摘いただいたとおり、httpとhttpsを同じディレクティブで書いていたのが悪かったようです。 別のディレクティブで書き直したところ、質問させていただいた2つの書き換え方法ともに期待したとおりリダイレクトできました。 どうもありがとうございました。
guest

0

解決できたので記述します。

ひとつのserverディレクティブにhttpとhttps2つの指定を行っていたためリダイレクトができなかったようです。
serverディレクティブを2つに分けたところ、2つの場合ともにリダイレクトできました。
回答いただいた方々には本当に感謝しております。
ありがとうございました。

server { listen 80; listen [::]:80; return 301 https://$host$request_uri; server_name hoge.hogehoge.hoge; root /var/www/html; index index.html index.htm index.php; location / { try_files $uri $uri/ /index.php?$args; } location ~ .php$ { try_files $uri =404; fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location /phpmyadmin { root /usr/share; index index.php; location ~ ^/phpmyadmin.+.php$ { fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } } server { listen 443 ssl; server_name hoge.hogehoge.hoge; ssl on; ssl_certificate /etc/letsencrypt/live/hoge.hogehoge.hoge/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/hoge.hogehoge.hoge/privkey.pem; 〜以下略〜
server { listen 80; listen [::]:80; if ($http_x_forwarded_proto != https) { rewrite ^(.*)$ https://hoge.hogehoge.hoge$1 permanent; } server_name hoge.hogehoge.hoge; root /var/www/html; index index.html index.htm index.php; location / { try_files $uri $uri/ /index.php?$args; } location ~ .php$ { try_files $uri =404; fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location /phpmyadmin { root /usr/share; index index.php; location ~ ^/phpmyadmin.+.php$ { fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } } server { listen 443 ssl; server_name hoge.hogehoge.hoge; ssl on; ssl_certificate /etc/letsencrypt/live/hoge.hogehoge.hoge/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/hoge.hogehoge.hoge/privkey.pem; 〜以下略〜

投稿2019/05/24 15:35

Nikkoh_ban

総合スコア26

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

$http_x_forwarded_proto != https で判定されておりますが
rewrite後も、$http_x_forwarded_proto が http のままになっており
ループしてしまっていると予想します。
(同じ理由でループさせた経験があります。当方の環境ではLBで値を入れ忘れたことが原因でした)

投稿2019/05/23 03:54

yukky1201

総合スコア2751

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Nikkoh_ban

2019/05/24 13:31

ご指摘ありがとうございます。 編集後、nginx再起動およびブラウザの履歴等削除して確認を行ったのですが、今度はBad requestとなってしまいました。 調べながら定義を見直してみますので、次の回答までしばしお時間をください。 よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問