nginx: переписать правило для удаления /index.html из $ request_uri - PullRequest
6 голосов
/ 15 апреля 2011

Я видел несколько способов переписать $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;
}

но это было в основном предположение, есть ли хорошая документация, описывающая modrewrite для nginx?

Ответы [ 7 ]

8 голосов
/ 23 апреля 2011

Я использую следующую перезапись в серверном предложении верхнего уровня:

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

Использование этого одного работает для большинства URL-адресов, например http://foo.com/bar/index.html, но прерывает http://foo.com/index.html.Чтобы решить эту проблему, у меня есть следующее дополнительное правило:

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

Часть =404 возвращает ошибку 404, когда файл не найден.

Я понятия не имею, почему первое переписатьодного недостаточно.

2 голосов
/ 17 сентября 2016

Следующая конфигурация позволила мне перенаправить /index.html на / и /subdir/index.html на /subdir/:

# Strip "index.html" (for canonicalization)
if ( $request_uri ~ "/index.html" ) {
    rewrite ^(.*)/ $1/ permanent;
}
1 голос
/ 18 апреля 2017

Это работает для меня:

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

Оно охватывает как корневой экземпляр /index.html, так и нижние экземпляры /bar/index.html

Первая часть регулярного выражения в основном переводится как: [nothing] или /[something] - в первом случае $ 2 является пустой строкой, поэтому вы перенаправляете на /, во втором случае $ 2 равен [something], поэтому вы перенаправляете на /[something]

Я действительно пошелнемного интереснее, чтобы охватить index.html, index.htm и index.php

rewrite ^(|/(.*))/index\.(html?|php)$ /$2 permanent;
1 голос
/ 04 июня 2013

По некоторым причинам большинство решений, упомянутых здесь, не работает. Те, которые работали, дали мне ошибки с отсутствующим / в URL. Это решение работает для меня.

Вставьте в директиву вашего местоположения.

if ( $request_uri ~ "/index.html" ) {
  rewrite ^/(.*)/ /$1 permanent;
}
1 голос
/ 08 августа 2012

Это работает:

# redirect dumb search engines
location /index.html {
    if ($request_uri = /index.html) {
        rewrite ^ $scheme://$host? permanent;
    }
}
1 голос
/ 16 июля 2012

Для корня /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/;
}
0 голосов
/ 25 июня 2013

Решения, цитирующие $scheme://domain.com/, предполагают, что домен жестко запрограммирован. Это не было в моем случае, и поэтому я использовал:

location / {
    ...

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

    ... }
...