nginx重定向循环,从url中删除index.php

时间:2014-02-10 20:31:03

标签: nginx php

我希望http://example.com/whatever/index.php等任何请求执行301重定向到http://example.com/whatever/

我尝试添加:

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

location / {
    index  index.php;
}

这里的问题是,这个重写会在根网址上运行,这会导致无限重定向循环。

编辑:

我需要一个通用的解决方案

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/应该在webroot/a/index.php

处提供index.php脚本

基本上,我从不想在地址栏中显示“index.php”。我有旧的反向链接,我需要重定向到规范的网址。

5 个答案:

答案 0 :(得分:55)

很好的问题,使用解决方案similar to another one I've answered on ServerFault recently,虽然这里更简单,但您确切知道自己需要什么。

您希望此处仅在用户明确请求/index.php时执行重定向,但绝不会重定向任何最终由实际index.php脚本提供服务的内部请求,如通过index指令。

这应该做到这一点,避免循环:

server {
    index index.php;

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

    location / {

        # ...
    }
}

答案 1 :(得分:2)

如果您的Nginx配置文件中已经具有下面提到的第一行,则无需再次重写。

index index.php index.html index.htm;

重写^(/。)。html(?。)?$ $ 1 $ 2永久;

永久重写^ /(。*)/ $ / $ 1;

try_files $ uri / index.html $ uri.html $ uri / $ uri = 404;

这将从URL中删除.html,此外还将从主页或索引页中删除“索引”。例如 - https://www.example.com/index将更改为https://www.example.com

答案 2 :(得分:1)

试试

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

答案 3 :(得分:-1)

尝试

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

这样做的另一个好处是nginx的返回速度比重写快。

答案 4 :(得分:-1)

保持第一个斜线不在比赛中:

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