nginx redirect loop, удалите index.php из url

Мне нужны любые запросы, например http://example.com/whatever/index.php , чтобы сделать 301 переадресацию на http://example.com/whatever/ .

Я попытался добавить:

 rewrite ^(.*/)index.php$ $1 permanent; location / { index index.php; } 

Проблема здесь, этот переписать запускается на корневом URL-адресе, что вызывает бесконечный цикл переадресации.

Редактировать:

Мне нужно общее решение

http://example.com/ должен служить файлу webroot/index.php

http://example.com/index.php , должен 301 перенаправить на http://example.com/

http://example.com/a/index.php должен 301 перенаправить на http://example.com/a/

http://example.com/a/ должен служить скрипту index.php в webroot/a/index.php

В принципе, я никогда не хочу показывать «index.php» в адресной строке. У меня есть старые обратные ссылки, которые мне нужно перенаправить на канонический URL.

Отличный вопрос: с решением, аналогичным другому, я недавно ответил на ServerFault , хотя здесь он намного проще, и вы точно знаете, что вам нужно.

Здесь вы хотите только выполнить перенаправление, когда пользователь явно запрашивает /index.php , но никогда не перенаправляет ни один из внутренних запросов, которые в конечном итоге обслуживаются фактическим скриптом index.php , как определено в директиве index .

Это должно сделать именно это, избегая циклов:

 server { index index.php; if ($request_uri ~* "^(.*/)index\.php$") { return 301 $1; } location / { # ... } } 

Попробуй это

 location ~ /*/index.php { rewrite ^/(.*)/(.*) http://www.votre_domaine.com/$1 permanent; } location /index.php { return 301 http://www.example.com/; } 

Сохраните первую косую черту:

 rewrite ^/(. +)/index.php$ $scheme://$1/ permanent; 

Пытаться

 location = /whatever/index.php { return 301 $scheme://www.example.com/whatever/; } 

Другим преимуществом этого является то, что nginx выполняет возврат быстрее, чем переписывает.