28

我想要任何请求,例如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

4 回答 4

71

很好的问题,解决方案类似于我最近在 ServerFault 上回答的另一个问题,尽管这里要简单得多,而且您确切地知道自己需要什么。

您在这里想要的是仅在用户明确请求时执行重定向/index.php,但绝不重定向任何最终由实际index.php脚本服务的内部请求,如通过index指令定义的那样。

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

server {
    index index.php;

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

    location / {

        # ...
    }
}
于 2014-02-16T16:11:37.207 回答
2

Try that

location ~ /*/index.php {
    rewrite ^/(.*)/(.*) http://www.votre_domaine.com/$1 permanent;
}
location /index.php {
    return 301 http://www.example.com/;
}
于 2014-02-14T23:51:36.717 回答
2

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

索引 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

于 2020-08-07T13:25:42.777 回答
-3

尝试

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

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

于 2014-02-10T20:38:57.337 回答