Примеры правил rewrite для nginx

Перенаправление на url со слэшем

У некоторых CMS для сайтов страницы могут открываться как со слэшем на конце, так и без, если движок сам не выполняет редирект. Например, страница http://example.net/page и http://example.net/page/ с точки зрения посетителя будет одной. Но для поисковиков это — две разные страницы, и во всём виноват слэш. Получается, дублирование контента, что плохо.

Для перенаправления на страницу со слэшем следует добавить в конфигурационный файл nginx для вашего сайта строку:

rewrite ^([^.]*[^/])$ $1/ permanent;

Теперь страница без слэша будет перенаправляться 301-м редиректом на страницу со слэшем. На страницы с расширениями (.html, .php и т.д.) данное правило не окажет влияние. К тому же, оно универсально и, чтобы движок не обрабатывал редиректы посредством php, это правило следует прописывать для большинства сайтов, где используются человеко-понятные адреса.

Rewrite для WordPress

В документации WordPress есть неплохой пример правил rewrite. Я лишь выделю самое основное, что требуется для работы в связке с php-fpm.

location / {
  try_files $uri $uri/ /index.php$args;
 }
 location ~ \.php$ {
  try_files $uri =404;
  fastcgi_pass unix:/run/php-www.sock;
  fastcgi_index index.php;
  include fastcgi_params;
  fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  fastcgi_param PHP_VALUE "sendmail_path=/usr/sbin/sendmail -t -i -fmail@example.com";
  fastcgi_param PHP_ADMIN_VALUE "open_basedir=/var/www/example.com/:/var/save_path/:/var/tmp_dir/";
 }

Rewrite для MODx

Для сайтов на этой CMS у меня используются следующие правила:

location / {
  try_files $uri $uri/ @rewrite;
}
location @rewrite {
  rewrite ^/(.*)$ /index.php?q=$1;
}
location ~ \.php$ {
 try_files $uri =404;
 fastcgi_pass unix:/run/php-www.sock;
 fastcgi_index index.php;
 include fastcgi_params;
 fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
 fastcgi_param PHP_VALUE "sendmail_path=/usr/sbin/sendmail -t -i -fmail@example.com";
 fastcgi_param PHP_ADMIN_VALUE "open_basedir=/var/www/example.com/:/var/save_path/:/var/tmp_dir/";
}

301-й редирект с index.php, index.html в любой папке

Ещё бывает так, что CMS самостоятельно не перенаправляет с индексных файлов на url без них. Например, сайт становится доступен как по адресу http://example.com/ так и по http://example.com/index.php. Это правило исправляет ошибку.

if ($request_uri ~* index.(php|html)) {
  rewrite ^(.+)index.php $scheme://$host$1 permanent;
}

При этом, не важно, лежит индексный файл в корневой папке или во вложенной, редирект будет работать всегда.

Прочие

У одного своего блога решил изменить структуру ссылок. Если раньше все посты были доступны по ссылкам, типа /postname.html, то теперь они переехали на другой адрес: /fotojournal/postname/. Изначально в качестве решения подумал об использовании плагина redirection для wordpress, но потом захотелось попробовать реализовать на nginx. И задумка получилась. :)

Правда, правило получилось простым, благодаря тому, что все страницы /%postname%.html были перенесены в одну категорию — fotojournal. Это правило выглядит следующим образом:

location ~* \.(html)$ {
  try_files $uri $uri/ @fotojournal;
}

location @fotojournal {
  rewrite ^/(.*)\.html$ /fotojournal/$1/ permanent;
}

Рассматриваем детально. Когда поступает запрос от пользователя, сначала любой файл с расширением .html ищется в папке с сайтом. Это нужно для реально существующих html-страничек на сайте, которые не должны быть перенесены в новую категорию.

Если запрашиваемая страница не была найдена, запрос перенаправляется во второй location — @fotojournal. Здесь производится перенаправление (редирект 301) на новый адрес. Например, страница /page.html откроется по адресу /fotojournal/page/.

Как вы оцените статью?
Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (8 оценок, среднее: 2,63 из 5)
Загрузка...

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *