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

Оцените статью
WhatsApp Web
Добавить комментарий

Adblock
detector