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

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

ただいまの
回答率

90.23%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,707

funchoic

score 9

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/ツール等のバージョンなど)

より詳細な情報

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kunai

    2017/03/03 17:55

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

    キャンセル

  • funchoic

    2017/03/03 18:02

    すみません。なんかしょーもない質問をしてしまったみたいで。。^^; 単純に、SEOの本を読んでいたら、「https://www.example.jp/と、https://www.example.jp/index.htmlと2つに別れていると、SEO的に評価が分散してしまうので301リダイレクトでどちらかに統一しましょう」と有ったので、チャレンジしてみた次第です。

    キャンセル

回答 2

checkベストアンサー

+2

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/03 22:19

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

    キャンセル

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.html  が http://www.example.jp/ にリダイレクトされて、実際に表示されるのは、http://www.example.jp/index.php の結果になります。

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/03 16: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)
    といった動きをさせるにはどのように記述したらよいか、ご存知でしたら、ご教授願えないでしょうか。

    キャンセル

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

  • ただいまの回答率 90.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる