Содержание статьи:
- 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/.