цикл перенаправления nginx, удалить 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.

 19
Author: jcampbell1, 2014-02-11

4 answers

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

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

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

server {
    index index.php;

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

    location / {

        # ...
    }
}
 49
Author: cnst, 2017-04-13 12:13:48

Попробуйте это

location ~ /*/index.php {
    rewrite ^/(.*)/(.*) http://www.votre_domaine.com/$1 permanent;
}
location /index.php {
    return 301 http://www.example.com/;
}
 1
Author: dev691, 2014-02-15 00:28:52

Уберите первую косую черту из совпадения:

rewrite ^/(. +)/index.php$ $scheme://$1/ permanent;
 0
Author: Melvyn, 2014-02-11 07:58:20

Попробуйте

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

Еще одно преимущество такого способа заключается в том, что nginx возвращает данные быстрее, чем перезапись.

 -1
Author: abradley, 2014-02-10 20:38:57