Beginner's question: redirecting /dir/index.html to /dir/

Igor Sysoev igor at sysoev.ru
Fri Sep 10 08:10:46 MSD 2010


On Fri, Sep 10, 2010 at 07:58:52AM +0400, Igor Sysoev wrote:

> On Thu, Sep 09, 2010 at 06:22:23PM -0400, ez77 wrote:
> 
> > Greetings,
> > 
> > I'm trying to send all .../dir/index.html requests to .../dir/ . I
> > looked this up in forums but I'm only able to do it for the root
> > directory:
> > 
> > [code]
> > location / { 
> >     root   /var/www/mysite;
> >     index  index.html index.htm;
> >     if ($request_uri = /index.html) {
> >     rewrite ^ http://$host? permanent;
> >     }   
> > }
> > [/code]
> > 
> > Some day I'll try to stop this copy-and-paste madness, but "in the
> > meantime"... could someone please give me a hand? I would greatly
> > appreciate it.
> 
> You may do it using:
> 
> -    if ($request_uri = /index.html) {
> +    if ($request_uri ~ /index.html) {
> 
> However, using "if ($request_uri ..." means that you should use "location"
> instead of "if". Nevertheless, the right configuration:
> 
>      location / {
>          root   /var/www/mysite;
>          index   index.html;
>      }
> 
>      location ~ /index.html$ {
>          rewrite ^ http://$host/? permanent;
>      }
> 
> does not work, because "index index.html" redirects internally "/" to
> "/index.html" and you will get endless loop with browsers.
> However, you may avoid the internal redirect via try_files:
> 
>      location / {
>          root       /var/www/mysite;
>          try_files  $uri  ${uri}index.html  =404;
>      }
> 
>      location ~ /index.html$ {
>          rewrite ^ http://$host/? permanent;
>      }

The configurations above rerirect to root only.
Here is the right way:

      location / {
          root   /var/www/mysite;
          index   index.html;
      }
 
      location ~ ^(/.+/)index.html$ {
          internal;
          error_page  404   http://$host$1?;
      }


-- 
Igor Sysoev
http://sysoev.ru/en/



More information about the nginx mailing list