Редирект .htaccess: переадресація на інший домен і перенаправлення на іншу сторінку

  1. Редирект .htaccess: постійне перенаправлення, 301
  2. Як налаштувати редирект на www (або без www)
  3. Як створити .htaccess
  4. Файл .htaccess не працює
  5. Чи є який-небудь аналог .htaccess в nginx?
  6. Автор публікації
  7. x64 (aka andi)

Доброго недільного дня!

Дуже часто на форумах можна зустріти питання, присвячені .htaccess - файлу конфігурації веб-сервера Apache. Основний камінь спотикання в тому, що при розробці не стояло завдання зручною конфігурації для кінцевого користувача (в дистрибутив не включена оболонка для візуальних установок за допомогою галочок, випадющіх списків тощо), зате адміністратори серверів справляються з цим завданням чудово, задовольняючись «Маном» (від команди Linux - man - інструкція від розробників, або в даному випадку - від професіоналів для професіоналів).

У більшості випадків потрібні зовсім нескладні маніпуляції: безумовний редирект на інший сайт, або перенаправлення з одного місця в інше (припустимо, коли змінився URL розділу). І кожна людина починає вважати, що вже його проблеми точно ніде немає, і навіть марно шукати рішення в інтернеті і пошуку по форуму. Давайте ж подивимося, що ці проблеми такими насправді не є.

Давайте ж подивимося, що ці проблеми такими насправді не є

Редирект .htaccess: постійне перенаправлення, 301

Подібна штука має різні назви. Непонятки може викликати хіба що число - чому ж 301? Суть криється в самому протоколі HTTP, який на запити клієнта відповідає певним кодом стану. Код 404 Not Found (Сторінку не знайдено) відомий майже всім. Код 200 OK майже ніхто не знає, але саме він означає, що все в порядку і документ буде показаний в браузері. А ось код 301 Moved Permanently означає, що документ остаточно перебрався на нову адресу. Саме його і називають найчастіше перенаправленням, хоча загальний пул відповідей позначений як - 3xx: Redirection.

У Apache є кілька можливостей для здійснення редиректів. Модуль mod_rewrite надає відмінний механізм роботи з перенаправлення, і в подальшому я буду використовувати в прикладах саме його. У модулі mod_alias теж є директиви для редиректів з певного адреси або з адреси, який відповідає регулярному виразу:
Redirect permanent / http://newsite.ru/
RedirectMatch permanent. * Http://newsite.ru/
Але в mod_rewrite є додаткові можливості для переадресації, тому краще застосовувати (IMHO) його.

У загальному випадку, для безумовного зовнішнього (назвемо його призначеним для користувача) редиректу, при якому браузер автоматично переадресовується на іншу сторінку, зазвичай непомітно для користувача (змінюється адресний рядок), можна в .htaccess помістити такий код:
RewriteEngine On
RewriteRule. * Http://newsite.ru/ [L, R = permanent]
Тут, перший рядок включає механізм модуля mod_rewrite, який дозволяється витворяти з адресами все, що завгодно. Назвемо це перетворенням URL за умовами на льоту. Другий рядок визначає безпосередньо правило для перетворення, в прикладі вище все запити редирект на http://newsite.ru/. У квадратних дужках розміщуються прапори: L - останнє (Last) правило, R - тип перенаправлення (Redirect), вказується у вигляді R = code, де code - буквене або цифрове позначення (permanent або 302).

Насправді, mod_rewrite - штука дуже корисна, адже саме завдяки цьому багато движки активно використовують так звані ЧПУ (Людині Зрозумілий URL). Якщо вам не знайомий цей термін, поясню на прикладі. Стаття про безкоштовні движки для сайту має адресу: https://a-panov.ru/2014/11/free-cms/

Поглянувши на цей URL, відразу видно, що стаття опублікована в листопаді 2014. Прибравши назву з містило слешем - https://a-panov.ru/2014/11/ - отримаємо список всіх публікація за листопад. Звичайні адреси, виду:

https://a-panov.ru/?p=389

особливої ​​доброзичливістю не відрізняються. Побачивши таку адресу, не можна сказати про сторінку, на яку він веде, анічогісінько.

Цей спосіб хороший, коли вам неважливо, на яку сторінку нового сайту посилатися. Але якщо ви переїхали на інший домен, то бажано робити редіректи всіх запитів зі збереженням адрес. Для цього використовуйте такий код:
RewriteRule ^. * $ Http://newsite.ru/$0 [QSA, L, R = permanent]
Новий прапор QSA збереже так само і параметри, які можна зустріти в адресах після знака питання. У вже знайомому прикладі:

https://a-panov.ru/?p=389

якщо я розміщу в .htaccess код вище, то відбудеться перенаправлення на адресу http://newsite.ru/?p=389 чого без цього прапора не було б.

Тут і далі я буду опускати директиву включення перетворень:
RewriteEngine On
просто пам'ятайте: якщо ви користуєтеся механізмом mod_rewrite, то всі умови / перетворення повинні виконуватися після даної директиви. Для відключення використовується такий рядок:
RewriteEngine Off
відповідно, для кожного правила немає потреби постійно «включати» перетворення - це починає робитися автоматично, відразу після першої директиви.

Як налаштувати редирект на www (або без www)

Подібні перенаправлення потрібні для випадків, коли сайт доступний за варіантами nsite.ru і www.nsite.ru, в цьому випадку пошуковики вважають їх дублями і можуть або самостійно вибрати один з варіантів в якості головного дзеркала , Або в результаті пошуку варіанти з обох доменів. У загальному випадку, це негативний фактор при ранжуванні сайту.

Варіант простіше, для одного домену. Перенаправлення проводиться з поддомена www.site.ru на site.ru:
RewriteCond% {HTTP_HOST} ^ www \ .nsite \ .ru $
RewriteRule. * Http://nsite.ru/$0 [QSA, L, R = permanent]
Тут з'явилася нова директива RewriteCond, яка задає умову, при якому повинні спрацьовувати редіректи - правила RewriteRule. Умова, в даному випадку, ім'я домену, відповідне www.nsite.ru (в регулярних вирази символ точки означає «будь-який символ», тому його бажано екранувати за допомогою зворотного слеша).

Зворотне перенаправлення теж виконати дуже просто:
RewriteCond% {HTTP_HOST} ^ nsite \ .ru $
RewriteRule. * Http://www.nsite.ru/$0 [QSA, L, R = permanent]
Обидва варіанти робочі, але у них є маленький мінус - для кожного нового конфіга необхідно замінювати домен nsite.ru на свій власний. Чи не можна зробити унікальний варіант? Легко!

Редирект з будь-якого поддомена www:
RewriteCond% {HTTP_HOST} ^ www \. (. *) $
RewriteRule. * Http: //% 1 / $ 0 [QSA, L, R = permanent]

Редирект на піддомен з www:
RewriteCond% {HTTP_HOST}! ^ Www \.
RewriteRule. * Http: //www.% {HTTP_HOST} / $ 0 [QSA, L, R = permanent]

% {HTTP_HOST} - поточний домен

Як створити .htaccess

Такі питання теж виникають. Проблема в тому, що стандартний Провідник (додаток в Windows, що відповідає за графічний інтерфейс) не дозволяє створювати файли, що починаються з крапки (створенням файлів або папкок здійснюється клацанням правою кнопкою на робочому столі або у вікні, і вибору потрібної дії зі списку Створити). Але вихід є: відкривайте стандартний рекдатор Notepad (блокнот), в меню вибираєте Файл → Зберегти як ..., і в якості імені файлу вказуєте .htaccess - після цього він буде створений.

Файл .htaccess не працює

Бувають випадки, коли директиви з файлу не працюють. Це може бути викликано тим, що в конфігурації Apache відключена підтримка .htaccess, за що відповідає директива:
AllowOverride none

Зазвичай це робиться, щоб дещо збільшити швидкодію - в цьому випадку веб-сервер не здійснює пошук і розбір .htaccess.

Можливий і такий варіант, що на сервері не використовується Apache, наприклад, IIS - основний «гість» на Windows-хостингу. Для уточнення зв'яжіться з підтримкою свого хостера.

Чи є який-небудь аналог .htaccess в nginx?

Ще один досить частий питання. У цьому веб-сервера такої можливості немає. Однак, подібне зазвичай і не потрібно. Справа в тому, що nginx, як правило, встановлюється в якості фронденда, т. Е. Приймає і обробляє всі запити, які або виконує сам, або перенаправляє на бекенд, роль якого може виконувати Apache, який можна додатково конфігурувати за допомогою .htaccess.

Автор публікації

не в мережі 1 день

x64 (aka andi)

Коментарі: 2834 Публікації: 394 Реєстрація: 02-04-2009

IRC (Internet Relay Chat)