Єдина точка входу на сайт за допомогою .htaccess

Єдина точка входу на сайт за допомогою .htaccess Ідея єдиної точки входу полягає у тому, щоб перенаправляти всі запити користувача на один файл, який вже буде координувати подальші дії. apache, mod_rewrite, .htaccess, єдина точка входу

Більшість якщо не всі популярні сайти використовують концепцію єдиної точки входу. Працює це доволі просто: запити користувача перенаправляються на один файл, наприклад index.php, який у свою чергу займається їх обробкою та повертає потрібний результат. Навіщо так складності? Перш за все мінімізується кількість коду. Набагато простіше оброблювати всі запити в одному місці, ніж плодити купу файликів та в кожному окремо щось перевіряти. Також збільшується динамічність сайтів, можливість управління URL-адресами. Можна спокійно приймати й оброблювати такі запити як site.com/article/5864 або site.com/category/subcategory/page/2. Загалом переваг багато, але давайте вже подивимося як це робиться на практиці.

Перенаправляти запити в нас буде .htaccess. Це файл який дає нам можливість налаштовувати роботу веб-сервера: переадресовувати користувача з однієї сторінки на іншу, встановлювати права на окрему директорію(наприклад, щоб в теку з приватною інформацією можна було зайти тільки ввівши пароль)або самостійно оброблювати помилки(наприклад, перенаправити користувача на свою сторінку 404). Правила прописані у .htaccess діють на увесь каталог в якому він розташований і на всі підкаталоги(тільки якщо ці правила не перевизначені правилами інших .htaccess, що пролягають нижче).

Пропишімо, щоб всі запити з будь-якої директорії сайту перенаправлялися в один скрипт. Пишеться це все так:

RewriteEngine On
RewriteRule ^(.*)$ index.php?%{REQUEST_URI} [L]

У першому рядку ми включаємо модуль відповідальний за перенаправлення(ModRewrite).

У другому ми вказуємо правило, що при будь-якому запиті(^(.*)$) йде переадресація на index.php. %{REQUEST_URI} означає, що ми оброблюємо рядок запиту без доменного ім\'я та GET-параметрів(тобто просто /about/, а не site.com/index.php?page=about). Далі йде прапорець. L вказує веб-серверу зупинитися і після цього правила не застосовувати ніяких інших.

Але тут є невеличка проблема. Так все буде працювати. Спробуйте створити index.php(або обізвіть його по-іншому, але найголовніше не забудьте поміняти назву у правилі) та прописати у ньому щось. Тепер щоб ви тільки не писали в адресному рядку, вам буде висвітлюватися index.php. Ми цього і хотіли, але на реальному сайті браузер буде запрошувати у сервера й інші файли крім скриптів(каскадні таблиці стилів, зображення тощо), і не зможе їх отримати: його завжди буде перенаправляти на нашу головну сторінку. Спробуйте кинути до каталогу сайту якийсь наприклад test.txt та звернутися до нього за посиланням site.com/test.txt(або як у вас там може бути адреса) - ви знову побачите вміст index.php. Щоб цього позбутися ми маємо задати ще декілька правил.

Якщо RewriteRule задає серверу, що робити, то існує ще одне правило RewriteCond, яке і задає умови коли саме спрацює наш RewriteRule(який треба обов\'язково розміщувати після умови, але це я думаю зрозуміло). Якщо цього RewriteCond немає як у нашому першому прикладі то правило спрацьовує завжди.

Давайте відразу глянемо на наш оновлений .htaccess:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]

Ми додали лише два рядки, у яких ми прописуємо, що якщо користувач запитує не файл і не директорію то виконуємо RewriteRule. Тобто запит виду site.com/contact спрацює і site.com/css/style.css - теж спрацює. Все доволі просто, але цього вже достатньо, щоб реалізувати на вашому сайті єдину точку входу.

У майбутньому я планую написати ще декілька статей на тему .htaccess: редирект, встановлення прав на директорію, оброблення різноманітних помилок тощо.

Якщо вам сподобався пост, то ви можете поділитися ним з друзями натиснувши одну з кнопок соціальних мереж трохи нижче. Або написати у коментарях свої думки щодо мною написаного, раптом я міг щось пропусти. Дякую за увагу!

Оновлено: Загалом останнє правило можна і покращити. Навіть не покращити - а скоротити. Зараз дослівно частина ^(.*)$ порівнює адресу, і якщо вона починається з початку та має все рівно яку кількість символів - зберігаємо їх у $1 і після цього всього має бути кінець. Зрозуміло, що це буде збігатися з будь-яким рядком. Так навіщо тоді це прописувати? Це все можна скоротити до такого:

RewriteRule ^ index.php?/$1 [L]

Тобто якщо у рядка є початок. Вийшов повний аналог попереднього варіанту, а дій комп'ютеру виконувати менше!