понедельник, 14 августа 2017 г.

Перенаправление всех ссылок на сайт на корневую папку (php, apache, .htaccess)

Задача

Клиент содержал доменные имена на одном хостинге, а сами сайты - на своем сервере. Поставил задачу: при недоступности сервера сайты долны вести на страницу -заглушку "Ведутся технические работы"

Сделал сайт с одной станицей, на который перенаправлял бы все запросы с други доменных имен.

Но вохник вопрос как перенаправлять любые пути на эту одну страницу (ведь пользователи могут переходить не на главную страницу основного сайта, а на какие-то другие страницы/папки).

Окружение

php, apache server

Решение

Помог файл .htaccess
(файл с таким именем сделал в корне сайта)

Простое решение: перенаправить все запросы на корень сайта

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^(.+)$ / [R=301,L]
</IfModule>

Задача чуть усложнилась, когда на странице "Технические работы" понадобилось отображать картинку. Т.к. перенаправление действовло и на картинку и сбрасывало её адрес.

Поэтому чуть усложнил скрипт. Теперь он перенаправляет все кроме картинок.

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !\.(gif|jpe?g|png)$ [NC]
RewriteRule ^(.+)$ / [R=301,L]
</IfModule>

Пока так решил вопрос. Идеи по улучшению принимаются в комментариях

Материалы по теме


htaccess - 47 наглядных примера серверного редиректа

Excluding images from mod_rewrite rule (тут взял идею по работе с картинками)

.htaccess PHP

25 правил .htaccess, которые должен знать каждый web-разработчик


20+ правил .htaccess, которые должен знать каждый разработчик

Документация по htaccess

Файл .htaccess - общая информация

Директива модуля - RewriteRule

RewriteCond Директива модуля Mod rewrite