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

时间:2011-04-15 11:04:51

标签: nginx pcre

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

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

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

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

因为nginx正则表达式与perl兼容,所以我试过这样的事情:

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

但这主要是猜测,有没有很好的文档描述nginx的modrewrite?

7 个答案:

答案 0 :(得分:7)

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

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错误。

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

对于根/index.html,Nicolas的回答导致了重定向循环,因此我不得不搜索其他答案。

这个问题是在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/;
}

答案 3 :(得分:1)

这个有效:

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

答案 4 :(得分:1)

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

粘贴到您的位置指令。

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

答案 5 :(得分:1)

这对我有用:

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;

答案 6 :(得分:0)

引用$scheme://domain.com/的解决方案假设域是硬编码的。这不是我的情况所以我用过:

location / {
    ...

    rewrite index.html $scheme://$http_host/ redirect;

    ... }