Канонические URL с Nginx - PullRequest
       47

Канонические URL с Nginx

1 голос
/ 19 сентября 2011

Мы работаем над удалением файлов индексов каталогов из наших URL-адресов, чтобы очистить их и обеспечить большую согласованность для улучшения нашего SEO.

Однако я не знаю, как позаботиться об этом вNginx.

Я нашел следующее для Apache (мы просто ищем эквивалент Nginx)

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^/]+/)*index\.php\ HTTP/ 
RewriteRule     ^(([^/]+/)*)index\.php$ http://www.%{HTTP_HOST}/ [R=301,NS,L]  

Я прочитал документы и попробовал несколько разныхпараметры - самый близкий, который я могу получить, все еще возвратит ошибку бесконечного цикла.

1 Ответ

2 голосов
/ 06 июля 2012

Фрагмент, который вы опубликовали для 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 будет обработан следующим образом:

  1. return $uri = /foo/bar, если этот файл существует в документе корень, иначе
  2. возврат $uri.html = /foo/bar.html, если он существует, наконец
  3. выдать ошибку 404.
...