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

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

 if (-f $request_filename/index.html) { rewrite (.*) $1/index.html break; } 

但我想知道如果相反是可以实现的:

即当有人请求http://example.com/index.html ,他们被redirect到http://example.com

因为Nginx的正则expression式是perl兼容的,我尝试了这样的事情:

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

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

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

 rewrite ^(.*)/index.html$ $1 permanent; 

单独使用它可以用于大多数网址,例如http://foo.com/bar/index.html ,但会破坏http://foo.com/index.html 。 要解决这个问题,我有以下附加规则:

 location = /index.html { rewrite ^ / permanent; try_files /index.html =404; } 

找不到文件时, =404部分返回404错误。

我不知道为什么第一次重写是不够的。

以下配置允许我将/index.html重定向到//subdir/index.html/subdir/

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

对于root /index.html的回答导致了一个重定向循环,所以我不得不搜索其他答案。

这个问题在nginx论坛上被问到,那里的答案效果更好。 http://forum.nginx.org/read.php?2,217899,217915

使用任一

 location = / { try_files /index.html =404; } location = /index.html { internal; error_page 404 =301 $scheme://domain.com/; } 

要么

 location = / { index index.html; } location = /index.html { internal; error_page 404 =301 $scheme://domain.com/; } 

出于某种原因,这里提到的大多数解决方案都不起作用。 那些工作给了我缺少/在网址中的错误。 这个解决方案适用于我。

粘贴您的位置指令。

 if ( $request_uri ~ "/index.html" ) { rewrite ^/(.*)/ /$1 permanent; } 

这对我有用:

 rewrite ^(|/(.*))/index\.html$ /$2 permanent; 

它包含根实例/index.html和较低实例/bar/index.html

正则表达式的第一部分基本上翻译为: [nothing]/[something] – 在第一种情况下$ 2是一个空字符串,所以你重定向到/ ,在第二种情况下$ 2是[something]所以你重定向到/[something]

我其实有点奇怪,包括index.htmlindex.htmindex.php

 rewrite ^(|/(.*))/index\.(html?|php)$ /$2 permanent; 

这个工作:

 # redirect dumb search engines location /index.html { if ($request_uri = /index.html) { rewrite ^ http://$host? permanent; } } 

引用$scheme://domain.com/的解决$scheme://domain.com/假定该域是硬编码的。 这不是我的情况,所以我用:

 location / { ... rewrite index.html $scheme://$http_host/ redirect; ... }