質問: ### nginxでwww.example.jp/index.htmlをwww.example.jp/にリダイレクトしたい。 初めて質問させて頂きます。現在、centos7でnginx1.10.3を利用しています。 具体的には以下のようなファイル郡が有り、それらにアクセスされた場合、【リダイレクト後】に記載されているように、index.htmlが無い状態にリダイレクトしたいと思っています。(SEO的に統一した方が良いと聞いたので。) 1https://www.example.jp/index.html 2https://www.example.jp/res/index.html 3https://www.example.jp/anc/index.html ・・・・・・・・・・・・・・・・(10個程) ↓ 1https://www.example.jp/ 2https://www.example.jp/res/ 3https://www.example.jp/anc/ ・・・・・・・・・・・・・・・・(10個程) そこで、自分なりに調べて、/etc/nginx/conf.d/example.confを作成し、リダイレクトするように記述してみました。 ### 発生している問題・エラーメッセージ ``` 1chromeで確認すると、https://www.example.jpにリダイレクトされた上で(urlの所がhttps://www.example.jp/index.htmlからhttps://www.example.jpに変更)、画面には、「www.example.jpページは機能していません。www.example.jpでリダイレクトが繰り返し行われました。」と表示されます。 2chromeで確認すると、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/ツール等のバージョンなど) より詳細な情報
回答: 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 の結果になります。 このような動作が、質問者が望んでいるものかどうかは判りませんけれども。