Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

nginx redirect loop, remove index.php from url

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.

like image 997
jcampbell1 Avatar asked Feb 10 '14 20:02

jcampbell1


3 Answers

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 actual index.php script, as defined through the index directive.

This should do just that, avoiding the loops:

server {
    index index.php;

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

    location / {

        # ...
    }
}
like image 72
cnst Avatar answered Oct 27 '22 14:10

cnst


Try that

location ~ /*/index.php {
    rewrite ^/(.*)/(.*) http://www.votre_domaine.com/$1 permanent;
}
location /index.php {
    return 301 http://www.example.com/;
}
like image 2
dev691 Avatar answered Oct 27 '22 13:10

dev691


If you already have first line mentioned below in your Nginx configuration file you don't have rewrite it again.

index index.php index.html index.htm;

rewrite ^(/.).html(?.)?$ $1$2 permanent;

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

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

This will remove .html from the URL and additionally will also remove "index" from home page or index page. For example - https://www.example.com/index will be changed to https://www.example.com

like image 2
jyotisankar Avatar answered Oct 27 '22 14:10

jyotisankar