我希望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”。我有旧的反向链接,我需要重定向到规范的网址。
答案 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;