我的磁盘上的文件扩展名有: index.html
, a.html
。 我想要的请求http://example.com/a
加载/var/www/a.html
和http://example.com/
加载/var/www/index.html
。 我想任何其他的URL重定向到规范的网址,所以http://example.com/a.html
应该重定向到http://example.com/a
。
我的配置是这样的:
rewrite ^(/.+)\.html$ $scheme://$host$1 permanent;
location / {
root /var/www;
try_files $uri.html $uri $uri/ =404;
}
这并不重定向/a.html
到/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
到/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
扩展,没有index
在同一时间在URL)?
我觉得你的重写规则可能会倒退。 也许只是这个(没有重写规则):
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;
}
代码示例(REVISION 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
。 也请记住restart nginx
您修改后vhost
文件。