重写规则nginx

时间:2011-03-23 17:44:17

标签: nginx

有人可以帮我解决我的nginx重写规则吗?我有这样的问题

如果在www.abc.com/name_dir/*中找不到文件,它将重定向到www.abc.com/name_dir/index.php。

例如: 在www.abc.com/xxx/*中找不到重定向到www.abc.com/xxx/index.php 未在www.abc.com/yyy/*中找到重定向到www.abc.com/yyy/index.php 在www.abc.com/zzz/*中找不到重定向到www.abc.com/zzz/index.php 在www.abc.com/kk/*中找不到重定向到www.abc.com/kkk/index.php ... 问题我有千名name_dir。我有像这样的nginx.conf

    if (-f $request_filename) {
      break;
    }
    if (-d $request_filename) {
      rewrite (^.+$) $1/
      break;
    }
    if (!-e $request_filename) {
      rewrite ^/xxx/(.*)$ /xxx/index.php?$1 last;
      rewrite ^.+?(/.*\.php)$ $1 last;
    }

在上面的配置中,只重定向name_dir xxx。重写规则如何重定向所有目录? 谢谢你的帮助

1 个答案:

答案 0 :(得分:2)

你想在这里使用try_files到check for the existence of files而不是if语句(因为在Nginx中If是邪恶的)。

要到一个目录,它就像:

location /xxx/{
   try_files $uri $uri/ /xxx/index.php;
   index index.php
}

这样做首先尝试将uri作为文件。如果这不起作用,它将尝试作为目录。如果两者都不起作用,它将默认为/ xxx /的index.php。额外的索引行是为了防止它显示空白页面,如果你直接转到whatever.com/xxx

使用正则表达式,我们可以扩展此规则以使用多个目录:

location ~* ^(/.*)/{
   try_files $uri $uri/ $1/index.php?$uri&$args;
   index index.php
}

这应该获取完整的目录结构并将其路由到适当的索引。

  • abc.com/yyy/nonexistant.php ==> abc.com/yyy/index.php
  • abc.com/yyy/zzz/nonexistant.php ==> abc.com/yyy/zzz/index.php

如果您只想要第二个示例转到yyy / index.php,请在该位置使用此正则表达式:

^(/.*?)/