Skip to main content

Приклади правил 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 (10 оцінок, середнє: 2,70 з 5)
Завантаження ...

Додати коментар

Ваш e-mail не буде опублікований.