将/ foo.htmlredirect到/ foo,而不是/ to / index在nginx中

我在磁盘上的文件有扩展名: index.htmla.html 。 我想请求http://example.com/a加载/var/www/a.htmlhttp://example.com/以加载/var/www/index.html 。 我想要其他urlredirect到一个规范的url,所以http://example.com/a.html应该redirect到http://example.com/a

我的configuration如下所示:

 rewrite ^(/.+)\.html$ $scheme://$host$1 permanent; location / { root /var/www; try_files $uri.html $uri $uri/ =404; } 

这会将/a.htmlredirect到/a并成功从磁盘加载a.html

 $ curl -D- -s http://www.jefftk.com/food.html | grep ^Location Location: http://www.jefftk.com/food $ curl -s http://www.jefftk.com/food | grep ^Location 

但它发送//index

 $ curl -s -D- http://www.jefftk.com/pictures/ | grep ^Location Location: http://www.jefftk.com/pictures/index $ curl -s -D- http://www.jefftk.com | grep ^Location Location: http://www.jefftk.com/index 

如果我删除了重写规则,它会停止从/a.htmlredirect到/a但也会停止发送//index

 $ curl -D- -s http://www.jefftk.com/food.html | grep ^Location $ curl -D- -s http://www.jefftk.com/food | grep ^Location $ curl -D- -s http://www.jefftk.com/ | grep ^Location $ curl -D- -s http://www.jefftk.com/pictures/ | grep ^Location 

为什么会这样呢? 我可以同时做nginx这两个我想要的东西(没有.html扩展名,在URL中没有index )?

我认为你的重写规则可能会倒退。 也许只是这个(没有重写规则):

 location / { try_files $uri.html $uri $uri/ =404; } location = / { index index.html; } 

编辑版本:

对不起,我完全不了解你的描述。 我重读了几遍,并测试了它,它可能正在接近你正在做的事情:

 location = / { try_files /index.html =404; } location = /index { return 301 $scheme://$host; } location ~* \.html$ { rewrite ^(.+)\.html$ $scheme://$host$1 permanent; } location / { try_files $uri.html $uri/ @backend; } location @backend { # rewrite or do whatever is default for your setup rewrite ^ /index.html last; // or return 404; } 

代码示例(修订3):

我希望第三次是魅力。 也许这会解决你的问题?

 # example.com/index gets redirected to example.com/ location ~* ^(.*)/index$ { return 301 $scheme://$host$1/; } # example.com/foo/ loads example.com/foo/index.html location ~* ^(.*)/$ { try_files $1/index.html @backend; } # example.com/a.html gets redirected to example.com/a location ~* \.html$ { rewrite ^(.+)\.html$ $scheme://$host$1 permanent; } # anything else not processed by the above rules: # * example.com/a will load example.com/a.html # * or if that fails, example.com/a/index.html location / { try_files $uri.html $uri/index.html @backend; } # default handler # * return error or redirect to base index.html page, etc. location @backend { return 404; } 

你在找什么样的东西:

 location / { try_files $uri.html $uri/index.html =404; } 

基本上这将首先尝试a.html文件,如果失败,然后将尝试index.html和最后显示一个404 。 另外,请记住在编辑vhost文件后restart nginx