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

Содержание статьи:

  • 1 Перенаправление на url со слэшем
  • 2 Rewrite для WordPress
  • 3 Rewrite для MODx
  • 4 301-й редирект с index.php, index.html в любой папке
  • 5 Прочие

Перенаправление на 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/.