Зміст статті:
- Перенаправление на url со слэшем 1 Перенаправлення на url зі слешем
- Rewrite для WordPress 2 Rewrite для WordPress
- Rewrite для MODx 3 Rewrite для MODx
- 301-й редирект с index.php, index.html в любой папке 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 /.