Фрагмент, который вы опубликовали для Apache, использует неизменную глобальную переменную %{THE_REQUEST}
для определения исходного URI, запрошенного клиентом. Однако эта переменная содержит весь запрос, включая метод HTTP, версию и строку запроса. Поэтому анализ этой переменной немного запутан, как видно из приведенного вами примера.
Однако nginx
имеет специальную переменную, которая содержит исходный URI запроса, полученный от клиента: $request_uri
. Это позволяет вам делать следующее:
## REDIRECT foo/index(.html) to foo/
if ($request_uri ~ ^(.*/)index(?:\.html)?$) {
return 301 $1;
}
Если вы хотите также удалить суффикс файла, например, .html
, вы можете использовать следующий фрагмент:
## REDIRECT foo/bar.html to foo/bar
if ($request_uri ~ ^(.+)\.html$) {
return 301 $1;
}
Теперь, чтобы nginx
по-прежнему мог обслуживать правильный файл, используется директива try_files
, которая проверяет все заданные URI по порядку, пока один не совпадет:
## Rewrite internal requests for foo/bar to foo/bar.html
try_files $uri $uri.html =404;
Таким образом, запрос на /foo/bar
будет обработан следующим образом:
- return
$uri
= /foo/bar
, если этот файл существует в документе
корень, иначе
- возврат
$uri.html
= /foo/bar.html
, если он существует, наконец
- выдать ошибку 404.