Мне нужны любые запросы, например 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 выполняет возврат быстрее, чем переписывает.