I want any requests like http://example.com/whatever/index.php
, to do a 301 redirect to http://example.com/whatever/
.
I tried adding:
rewrite ^(.*/)index.php$ $1 permanent;
location / {
index index.php;
}
The problem here, this rewrite gets run on the root url, which causes a infinite redirect loop.
Edit:
I need a general solution
http://example.com/
should serve the file webroot/index.php
http://example.com/index.php
, should 301 redirect to http://example.com/
http://example.com/a/index.php
should 301 redirect to http://example.com/a/
http://example.com/a/
should serve the index.php script at webroot/a/index.php
Basically, I never want to show "index.php" in the address bar. I have old backlinks that I need to redirect to the canonical url.
Try that
Great question, with the solution similar to another one I've answered on ServerFault recently, although it's much simpler here, and you know exactly what you need.
What you want here is to only perform the redirect when the user explicitly requests
/index.php
, but never redirect any of the internal requests that end up being served by the actualindex.php
script, as defined through theindex
directive.This should do just that, avoiding the loops:
Keep the first slash out of the match :
Try
Another benefit from doing it this way is that nginx does a return faster than a rewrite.