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

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

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

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

2回答

5641閲覧

nginxでwww.example.jp/index.html ⇒ www.example.jp/にリダイレクトさせたい。

funchoic

総合スコア11

nginx

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

1クリップ

投稿2017/03/03 06:39

編集2017/03/03 08:50

###nginxでwww.example.jp/index.htmlをwww.example.jp/にリダイレクトしたい。

初めて質問させて頂きます。現在、centos7でnginx1.10.3を利用しています。

具体的には以下のようなファイル郡が有り、それらにアクセスされた場合、【リダイレクト後】に記載されているように、index.htmlが無い状態にリダイレクトしたいと思っています。(SEO的に統一した方が良いと聞いたので。)

https://www.example.jp/index.html
https://www.example.jp/res/index.html
https://www.example.jp/anc/index.html
・・・・・・・・・・・・・・・・(10個程)

https://www.example.jp/
https://www.example.jp/res/
https://www.example.jp/anc/
・・・・・・・・・・・・・・・・(10個程)

そこで、自分なりに調べて、/etc/nginx/conf.d/example.confを作成し、リダイレクトするように記述してみました。

###発生している問題・エラーメッセージ

①chromeで確認すると、https://www.example.jpにリダイレクトされた上で(urlの所がhttps://www.example.jp/index.htmlからhttps://www.example.jpに変更)、画面には、「www.example.jpページは機能していません。www.example.jpでリダイレクトが繰り返し行われました。」と表示されます。 ②chromeで確認すると、https://www.example.jp/resにリダイレクトされた上で(urlの所がhttps://www.example.jp/res/index.htmlからhttps://www.example.jp/resに変更)、画面には、「www.example.jpページは機能していません。www.example.jpでリダイレクトが繰り返し行われました。」と表示されます。 ※その他のディレクトリも同じ様にエラーとなります。

###該当のソースコード

server { listen 443 ssl default_server; server_name www.example.jp; ssl_certificate /etc/letsencrypt/live/example.jp/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.jp/privkey.pem; root /usr/share/nginx/html; index index.html index.php; ssi on; error_page 404 /404.html; location ~ (.*)/index.html { return 301 https://www.example.jp$1; } location / { #try_files $uri $uri/ /index.php?$query_string; try_files $uri/ $uri /404.html; } #ssi用ファイル location ~ include/(.*\.html) { alias /usr/share/nginx/html/include/$1; } #.phpファイル location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; include fastcgi_params; } } server { listen 443 ssl; server_name example.jp; return 301 https://www.example.jp$request_uri; } server { listen 80; server_name www.example.jp; return 301 https://www.example.jp$request_uri; } server { listen 80; server_name example.jp; return 301 https://www.example.jp$request_uri; }

###試したこと
リダイレクトする為に追加したのは下記の部分です。
location ~ (.*)/index.html {
return 301 https://www.example.jp$1;
}
ここが間違ってるんだろうなあ。。とは思うのですが。。ちなみに、この3行を外すと、表示自体は正常になされます。

1度リダイレクトされたら、2度目は該当しないはず。。と思っているのですが、ループするという事は、ここが何度も引っ掛かっている?

すみません。nginxの知識以上に正規表現の知識も乏しくて。

ご面倒をおかけしますが、よろしくお願いいたします。

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

kunai

2017/03/03 08:55

何故コレが必要なのか聞かせていただけますか?リダイレクトでの実現以外に、要求を満たす方法は別にある気がします。
guest

回答2

0

ベストアンサー

rewrite して break フラグを付けるとどうでしょうか。

location / { try_files $uri/ $uri /404.html; rewrite ^(.*)/$ $1/index.html break; }

投稿2017/03/03 09:44

TaichiYanagiya

総合スコア12146

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

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

funchoic

2017/03/03 13:19

おおお。。。ありがとうございます。意図したとおりに動きました。本当にありがとうございます。 
guest

0

indexディレクティブによる内部リダイレクトと、index.htmlが無い状態へのリダイレクトがループになっているのだと思われます。

1)
http://www.example.jp/index.html
が、
http://www.example.jp/
にリダイレクトされる

2)
「index index.html index.php;」というindexリダイレクトによって
http://www.example.jp/
が、
http://www.example.jp/index.html
に内部リダイレクトされる。
1)に戻る。

無限ループになるので「リダイレクトが繰り返し行われました」というエラーが表示されているのだと思います。

== 解決案 ==

index index.html index.php;

index index.php;

に変えれば、ループが切れます。

http://www.example.jp/index.htmlhttp://www.example.jp/ にリダイレクトされて、実際に表示されるのは、http://www.example.jp/index.php の結果になります。

このような動作が、質問者が望んでいるものかどうかは判りませんけれども。

投稿2017/03/03 07:18

coco_bauer

総合スコア6915

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

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

funchoic

2017/03/03 07:46

わざわざ回答ありがとうございます。 問題の原因は理解できました。とても分りやすい説明ありがとうございます。 実際に表示させたいのはあくまでもindex.htmlなので、 index index.html index.php ⇒ index index.html に変更しました。 ただ、この場合もご指摘頂いた、indexディレクティブによる内部リダイレクトと、index.htmlが無い状態へのリダイレクトがループ状態になってしまいます。 大変恐縮ですが、 https://www.example.jp/index.htmlhttps://www.example.jp/(表示されているのはindex.html) https://www.example.jp/res/index.htmlhttps://www.example.jp/res/(表示されているのindex.html) といった動きをさせるにはどのように記述したらよいか、ご存知でしたら、ご教授願えないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問