цикл перенаправления 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.
4 answers
Отличный вопрос, с решением похожим на другое, на которое я недавно ответил в 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 возвращает данные быстрее, чем перезапись.