nginx:重写规则从$ request_uri中删除/index.html

tjm*_*jmc 6 pcre nginx

我已经看到了一些方法来重写$request_uriindex.html在文件系统中存在特定文件时添加它,如下所示:

if (-f $request_filename/index.html) {
    rewrite (.*) $1/index.html break;
}
Run Code Online (Sandbox Code Playgroud)

但我想知道相反是否可以实现:

即当有人要求时http://example.com/index.html,他们会被重定向到http://example.com

因为nginx regexp是perl兼容的,所以我试过这样的事情:

if ( $request_uri ~* "index\.html$" ) {
    set $new_uri $request_uri ~* s/index\.html//
    rewrite $1 permanent;
}
Run Code Online (Sandbox Code Playgroud)

但这主要是猜测,是否有任何好的文档描述nginx的modrewrite?

Nic*_* Wu 8

我在顶级服务器子句中使用以下重写:

rewrite ^(.*)/index.html$ $1 permanent;
Run Code Online (Sandbox Code Playgroud)

单独使用此功能适用于大多数URL http://foo.com/bar/index.html,但它会中断http://foo.com/index.html.要解决此问题,我有以下附加规则:

location = /index.html {
  rewrite  ^ / permanent;
  try_files /index.html =404;
}
Run Code Online (Sandbox Code Playgroud)

=404找不到文件时,该部件返回404错误.

我不知道为什么单独的第一次重写是不够的.


Jac*_*son 7

下面的配置让我重定向/index.html//subdir/index.html/subdir/

# Strip "index.html" (for canonicalization)
if ( $request_uri ~ "/index.html" ) {
    rewrite ^(.*)/ $1/ permanent;
}
Run Code Online (Sandbox Code Playgroud)