我在磁盘上的文件有扩展名: index.html
, a.html
。 我想请求http://example.com/a
加载/var/www/a.html
和http://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.html
redirect到/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.html
redirect到/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
。