Как сделать ошибка 404 для своего сайта


  • Демонстрация работы:

    По умолчанию:

    Без профиля:

    Мини:

     

    <!-- По умолчанию -->
    <iframe src='/inwidget/index.php' data-inwidget scrolling='no' frameborder='no' style='border:none;width:260px;height:330px;overflow:hidden;'></iframe>

    <!-- Без профиля -->
    <iframe src='/inwidget/index.php?toolbar=false' data-inwidget scrolling='no' frameborder='no' style='border:none;width:260px;height:320px;overflow:hidden;'></iframe>

    <!-- Мини 1 -->
    <iframe src='/inwidget/index.php?width=100&inline=2&view=12&toolbar=false' data-inwidget scrolling='no' frameborder='no' style='border:none;width:100px;height:320px;overflow:hidden;'></iframe>

    <!-- Мини 2 -->
    <iframe src='/inwidget/index.php?width=100&inline=1&view=3&toolbar=false' data-inwidget scrolling='no' frameborder='no' style='border:none;width:100px;height:320px;overflow:hidden;'></iframe>

    Горизонтальная ориентация:

     

    <!-- Горизонтальная ориентация -->
    <iframe src='/inwidget/index.php?width=800&inline=7&view=14&toolbar=false' data-inwidget scrolling='no' frameborder='no' style='border:none;width:800px;height:295px;overflow:hidden;'></iframe>

    Крупные preview:

     

    <!-- Крупные preview -->
    <iframe src='/inwidget/index.php?width=800&inline=3&view=9&toolbar=false&preview=large' data-inwidget scrolling='no' frameborder='no' style='border:none;width:800px;height:850px;overflow:hidden;'></iframe>

    Разные цветовые схемы:

     

    <!-- Синий -->
    <iframe src='/inwidget/index.php?skin=modern-blue' data-inwidget scrolling='no' frameborder='no' style='border:none;width:260px;height:315px;overflow:hidden;'></iframe>

    <!-- Зелёный -->
    <iframe src='/inwidget/index.php?skin=modern-green' data-inwidget scrolling='no' frameborder='no' style='border:none;width:260px;height:315px;overflow:hidden;'></iframe>

    <!-- Красный -->
    <iframe src='/inwidget/index.php?skin=modern-red' data-inwidget scrolling='no' frameborder='no' style='border:none;width:260px;height:315px;overflow:hidden;'></iframe>

    <!-- Оранжевый -->
    <iframe src='/inwidget/index.php?skin=modern-orange' data-inwidget scrolling='no' frameborder='no' style='border:none;width:260px;height:315px;;overflow:hidden;'></iframe>

    <!-- Фиолетовый -->
    <iframe src='/inwidget/index.php?skin=modern-violet' data-inwidget scrolling='no' frameborder='no' style='border:none;width:260px;height:315px;overflow:hidden;'></iframe>

    <!-- Чёрный -->
    <iframe src='/inwidget/index.php?skin=modern-black' data-inwidget scrolling='no' frameborder='no' style='border:none;width:260px;height:315px;overflow:hidden;'></iframe>

    <!-- Жёлтый -->
    <iframe src='/inwidget/index.php?skin=modern-yellow' data-inwidget scrolling='no' frameborder='no' style='border:none;width:260px;height:315px;overflow:hidden;'></iframe>

    <!-- Серый -->
    <iframe src='/inwidget/index.php?skin=modern-grey' data-inwidget scrolling='no' frameborder='no' style='border:none;width:260px;height:315px;overflow:hidden;'></iframe>

    Адаптивный режим ( Открыть демонстрацию в новом окне ):

     

    Виджет будет автоматически подстраиваться под размеры блока или окна браузера. Подробнее >

    <!-- Адаптивный режим -->
    <iframe src='/inwidget/index.php?adaptive=true' data-inwidget scrolling='no' frameborder='no' style='border:none;width:100%;height:315px;overflow:hidden;'></iframe>

    Установка виджета на сайт:

    1. Загрузите исходный код виджета в корень вашего сайта:

    Для этого скачайте архив с исходным кодом виджета. Извлеките папку /inwidget из архива. Загрузите папку /inwidget в корень вашего сайта со всеми файлами внутри.

    СКАЧАТЬ ВИДЖЕТ >

    INWIDGET-1.2.0.zip - 132 KB


    Примечание. Виджет использует относительные пути, поэтому вы можете загрузить его в любую папку, если у вас нет доступа к корню сайта. Не забудьте при этом изменить путь в IFRAME.

    2. Установите права на запись для папки /inwidget/cache:

    В папке /inwidget/cache виджет будет хранить кэшированные данные.
    Если своего для директории будут отсутствовать права на запись, вы увидите ошибку ERROR #101.

    3. Настройте виджет:

    Отредактируйте файл /inwidget/config.php
    Вам потребуется указать логин в Instgram и другие параметры.

    Список параметров:

    • LOGIN – логин аккаунта в инстаграм из которого будут транслироваться фотографии.
    • HASHTAG – хэш-теги через запятую (например: girl, man). Если вы хотите транслировать фотографии других пользователей, либо вывести фотографии с очень специфичным тегом, используйте эту опцию. Выборка фотографий будет производиться со всего мира в порядке того, как фотографии были отмечены искомым тегом. Обратите внимание, что тулбар с аватаркой и статистикой будет автоматически скрыт.
    • ACCESS_TOKEN - хэш-ключ выданный приложением, которому вы разрешили доступ к своему профилю.
      Поле НЕ является обязательным. Если вы заполните его, то запросы начнут отправляться через endpoints API (https://www.instagram.com/developer/). При этом, виджет будет обладать только теми правами и лимитами на выборку данных, которыми обладает само приложение. О том, как самостоятельно получить токен смотрите здесь.
    • tagsBannedLogins - логины заблокированных пользователей через запятую (например: mark18, kitty45). Фотографии перечисленных пользователей не будут выводиться в виджете при использовании поиска по хештегам.
    • tagsFromAccountOnly - искать фотографии с тегами только в аккаунте пользователя [ true / false ]. Виджету придётся сначала получить фотографии из вашего профиля, а затем перебором искать снимки с тегами, перечисленными в опции HASHTAG. Чтобы поиск был более результативным рекомендуется увеличить значение опции imgCount.
    • imgRandom - выводить фотографии в случайном порядке [ true / false ]
    • imgCount – сколько фотографий запрашивать из Instagram. Влияет на размер кэша.
    • cacheExpiration – через сколько часов обновлять кэш.
    • cacheSkip – не использовать кэш [ true / false ]. Если присвоить true, то кэш будет проигнорирован и запросы к API будут отправляться при каждой загрузке виджета. Используйте эту опцию только для отладки.
    • cachePath - путь к директории с кэш файлами
    • skinDefault - скин виджета по умолчанию [default / modern-blue / modern-green / modern-red / modern-orange / modern-grey / modern-black / modern-violet / modern-yellow]
    • skinPath - путь к деректории со скинами
    • langDefault - язык виджета по умолчанию [ ru / en ]
    • langAuto - автоматически определять язык пользователя [ true / false ]
    • langPath - путь к деректории с локализациями

    Внимание! Если после первичной настройки вы решите изменить LOGIN, HASHTAG или tagsBannedLogins,
    изменения вступят в силу только после удаления файла с кэшем или после того, как кэш устареет.

    4. Вставьте виджет в сайт с помощью следующего кода:

    <!-- По умолчанию -->
    <iframe src='/inwidget/index.php' scrolling='no' frameborder='no' style='border:none;width:260px;height:330px;overflow:hidden;'></iframe> Ещё примеры вставки с различным отображением виджета: <!-- Без профиля -->
    <iframe src='/inwidget/index.php?toolbar=false' data-inwidget scrolling='no' frameborder='no' style='border:none;width:260px;height:320px;overflow:hidden;'></iframe>

    <!-- Мини 1 -->
    <iframe src='/inwidget/index.php?width=100&inline=2&view=12&toolbar=false' data-inwidget scrolling='no' frameborder='no' style='border:none;width:100px;height:320px;overflow:hidden;'></iframe>

    <!-- Мини 2 -->
    <iframe src='/inwidget/index.php?width=100&inline=1&view=3&toolbar=false' data-inwidget scrolling='no' frameborder='no' style='border:none;width:100px;height:320px;overflow:hidden;'></iframe>

    <!-- Горизонтальная ориентация -->
    <iframe src='/inwidget/index.php?width=800&inline=7&view=14&toolbar=false' data-inwidget scrolling='no' frameborder='no' style='border:none;width:800px;height:295px;overflow:hidden;'></iframe>

    <!-- Крупные preview -->
    <iframe src='/inwidget/index.php?width=800&inline=3&view=9&toolbar=false&preview=large' data-inwidget scrolling='no' frameborder='no' style='border:none;width:800px;height:850px;overflow:hidden;'></iframe>

    Точная настройка отображения виджета:

    Параметры передаются как GET переменные при обращении к скрипту виджета.
    К примеру, чтобы уставить ширину виджета 600px и вывести в строку пять фотографий, нужно добавить соотвествующие параметры в URL к скрипту. Т.е.: /inwidget/index.php?width=600&inline=5 Список параметров:
    • width – ширина виджета (по умолчанию 260px).
    • inline – количество фотографий в строке (по умолчанию 4 шт.).
    • view – сколько фотографий отображать в виджете (по умолчанию 12 шт., максимально 30 шт., можно исправить в config.php).
    • toolbar – отобразить тулбар с аватаркой и статистикой (значения true/false, по умолчанию true).
    • preview – размер и качество изображений (small – маленькие до 320px, large – большие до 640px, fullsize – полноразмерые, по умолчанию стоит large)
    • lang – язык виджета (значения ru / en, по умолчанию берутся настройки из config.php). Приоритет этого параметра выше чем для настроек в config.php.
    • skin – скин виджета (значения default / modern-blue / modern-green / modern-red / modern-orange / modern-grey / modern-black / modern-violet / modern-yellow). По умолчанию default. Приоритет этого параметра выше чем для настроек в config.php.
    • adaptive - адаптивный режим (значения true / false, по умолчанию false). Виджет будет автоматически подстраиваться под размеры блока или окна браузера.

    Как сделать виджет адаптивным?:

    Добавьте GET переменную "adaptive" при обращении к скрипту виджета. Пример: /inwidget/index.php?adaptive=true Переменной необходимо присвоить значение true. После этого виджет будет автоматически подстраиваться под размеры блока или окна браузера. При этом GET параметр width будет проигнорирован. Параметр inline будет иметь эффект при ширине виджета более 400px. Ширина iframe увеличится до 100%, а высота подстроится под содержимое блока независимо от того, что вы изначально прописали в стилях iframe.

    Открыть демонстрацию в новом окне >

    Важно! Если вы используете старый код вставки iframe ( < 1.1.4 ), то вам необходимо прописать тегу атрибут data-inwidget или использовать новый код из инструкции, иначе размеры iframe не будут меняться автоматически. И вам придётся самостоятельно указать длину блока и заботиться о его высоте.

    Возможность актуальна для версии >= 1.1.4

    Видеоинструкция по получению ACCESS TOKEN:

    Виджет может работать с двумя видами API (недокументированное и endpoints). По умолчанию используется недокументированное. Для его работы токен не требуется. Указание ACCESS TOKEN в настройках виджета переводит его на режим работы с Endpoints API (https://www.instagram.com/developer/). Если вы хотите создать собственное приложение в Instagram, то воспользуйтесь видеоинструкцией ниже. Имейте ввиду, что ваше приложение сначала попадёт в «песочницу» со следующими лимитами: 20 – максимальное количество фотографий, которое можно получить в запросе. 500 – максимальное количество запросов в час. И самое главное - фотографии можно получить только из своего аккаунта. Тоже самое касается выборки по тегам.

    Зарегистрировать собственное приложение можно здесь:

    https://www.instagram.com/developer/

    URL для генерации ACCESS TOKEN:

    https://www.instagram.com/oauth/authorize/?client_id=ВАШ_CLIENT_ID&redirect_uri=ВАШ_URL_АВТОРИЗАЦИИ&response_type=token&scope=public_content

    Разработчикам плагинов и приложений:

    Вы можете подключить код виджета и задать параметры через конструктор класса.
    При использовании примера ниже будьте внимательны с путями к файлам. Классы поддерживают автозагрузку.

    По умолчанию используется недокументированное API с помощью библиотеки instagram-php-scraper.
    Для переключения на endpoint API нужно указать ACCESS_TOKEN в config.php или аргументах конструктора.

    #require_once 'inwidget/classes/Autoload.php'; require_once 'inwidget/classes/InstagramScraper.php'; require_once 'inwidget/classes/Unirest.php'; require_once 'inwidget/classes/InWidget.php'; try { // Options may change through class constructor. For example: $config = array( 'LOGIN' => 'fotokto_ru', 'HASHTAG' => '', 'ACCESS_TOKEN' => '', 'tagsBannedLogins' => '', 'tagsFromAccountOnly' => false, 'imgRandom' => true, 'imgCount' => 30, 'cacheExpiration' => 6, 'cacheSkip' => false, 'cachePath' => $_SERVER['DOCUMENT_ROOT'].'/inwidget/cache/', 'skinDefault' => 'default', 'skinPath'=> '/inwidget/skins/', 'langDefault' => 'ru', 'langAuto' => false, 'langPath' => $_SERVER['DOCUMENT_ROOT'].'/inwidget/langs/', ); $inWidget = new \inWidget\Core($config); // Also, you may change default values of properties / $inWidget->width = 800; // widget width in pixels $inWidget->inline = 6; // number of images in single line $inWidget->view = 18; // number of images in widget $inWidget->toolbar = false; // show profile avatar, statistic and action button $inWidget->preview = 'large'; // quality of images: small, large, fullsize $inWidget->adaptive = false; // enable adaptive mode $inWidget->skipGET = true; // skip GET variables to avoid name conflicts $inWidget->setOptions(); // apply new values / $inWidget->getData(); include 'inwidget/template.php'; } catch (\Exception $e) { echo $e->getMessage(); }

    Кроме того, вы можете переопределить в коде значение большинства свойств, которые по умолчанию передаются через GET переменные.

    Возможность актуальна для версии >= 1.1.9

    Коды ошибок:

    ERROR #101 - не удаётся получить доступ к файлу с кэшем. Нужно изменить права на директорию /inwidget/cache Если файл не существует, виджет пытается создать его. Если файл существует, виджет пытается открыть его на чтение и запись. Отсутствие прав на чтение или запись файлов в директорию /inwidget/cache вызовет ошибку. Если до изменения прав на директорию в ней уже был файл с кэшем, просто удалите его, т.к. на него также установлены некорректные права.

    ERROR #102 - не удаётся получить время последнего изменения файла. Возможно, данная функция ограниченна или не поддерживается файловой системой вашего сервера. Для того, чтобы определить, актуален ли ещё кэш, виджет использует время последнего изменения файла в папке /inwidget/cache. Если не удаётся определить время, кэш всегда будет неактуальным, что приведёт к постоянным запросам к API Instagram.

    ERROR #500 - неизвестная ошибка.

    Для выяснения деталей смотрите, что было записано в кэш. Данная ошибка сгенерированна официальным API, либо библиотекой instagram-php-scraper. В как сделать ошибка 404 для своего сайта большинстве случаев означает проблемы при отправке или получении данных запроса от сервера Instagram. Чтобы виджет попытался отправить запрос ещё раз, удалите файл с кэшем и обновите страницу на которой выводится виджет.

    История версий:

    inWidget-1.2.0 (актуальная версия)

    Дата: 25 января 2018 г.

    • Добавлена поддержка официального API Instagram. Чтобы использовать его укажите ACCESS TOKEN в config.php
    • Добавлена возможность выбирать фотографии по тегам только из аккаунта. Для этого используйте опцию tagsFromAccountOnly в config.php
    • Переработана структура классов для поддержки нескольких API одновременно
    inWidget-1.1.9

    Дата: 17 января 2018 г.

    • Переработан механизм ошибок. Теперь виджет бросает исключения вместо остановки работы с помощью die()
    • Убрана необходимость использовать autoloader совместно с instagram-php-scraper
    • Изменился путь к библиотеке Unirest
    • Изменилось название директории с языками
    • Обновлена библиотека instagram-php-scraper до версии 0.8.11.
    inWidget-1.1.8

    Дата: 07 января 2018 г.

    • Внесено множество улучшений для упрощения разработки плагинов и приложений на основе виджета.
    inWidget-1.1.7

    Дата: 06 января 2018 г.

    • Обновлена библиотека instagram-php-scraper до версии 0.8.8.
    • Внесены исправления в функцию getMediasByTag библиотеки instagram-php-scraper.
    • Расположение кэш файла теперь можно изменить через config.php или конструктор класса.
    inWidget-1.1.6

    Дата: 05 декабря 2017 г.

    • Обновлена библиотека instagram-php-scraper до версии 0.8.7.
    • Внесены дополнительные исправления в функцию getMediasByTag библиотеки instagram-php-scraper.
    • Внесены небольшие исправления в скин default
    inWidget-1.1.5

    Дата: 03 декабря 2017 г.

    • Изменились имена кэш-файлов чтобы избежать конфликта имён при запросе данных по тегам, а также в многопользовательских сценариях использования.
    • Добавлена фильтрация GET переменной lang по соображениям безопасности. Теперь, чтобы добавить новый язык, его нужно сначала прописать в классе в переменную $langAvailable.
    • Исправлена небрежность в JavaScript-коде, который используется при активации адаптивного режима.
    • Обновлена библиотека instagram-php-scraper до версии 0.8.6.
    • Исправлена функция getMediasByTag библиотеки instagram-php-scraper, чтобы учитывать сценарий, когда при запросе данных по тегу в выдачу попадали ни все доступные фотографии.
    inWidget-1.1.4

    Дата: 28 ноября 2017 г.

    • Добавлен адаптивный режим. (подробнее)
    • Добавлена GET переменная adaptive ( true / false, по умолчанию false ), которая позволяет включить адаптивный режим при обращении к скрипту.
    • Добавлены скины: modern-blue, modern-green, modern-red, modern-orange, modern-grey, modern-black, modern-violet, modern-yellow.
    • Добавлен параметр skinDefault в файл config.php. Позволяет задать скин по умолчанию.
    • Добавлена GET переменная skin. Позволяет переопределить скин виджета при обращении к скрипту.
    inWidget-1.1.3

    Дата: 11 ноября 2017 г.

    • Исправлен баг при использовании нескольких хештегов.
      Вывод производился только по последнему тегу, а не по всем перечисленным.
    • Исправлен баг с блокировкой нежелательных аккаунтов.
    • В настройки добавлена опция cacheSkip. Если присвоить ей true, то кэш будет проигнорирован и запросы к API будут отправляться при каждой загрузке виджета. Используйте эту опцию только для отладки.
    • Теперь можно передать настройки виджета конструктору класса в качестве аргумента. Приоритет таких настроек выше, чем в файле config.php. Пример: $inWidget = new inWidget($config);
    • Обновлена библиотека instagram-php-scraper до версии v0.8.5.
    inWidget-1.1.2

    Дата: 09 ноября 2017 г.

    • Исправлена ошибка приводящая к повреждению данных в массиве. Воспроизводилась только в PHP 7.1.x
    • Обновлена библиотека instagram-php-scraper до версии v0.8.4
    • Изменены модификаторы доступа
    inWidget-1.1.1

    Дата: 08 ноября 2017 г.

    • Эта версия исправляет ошибку загрузки фотографий (из-за того, что источник /media/ больше недоступен)
    • Вывод фотографий по хэштегам снова работает
    • Обновлена библиотека instagram-php-scraper до v0.8.0. Пришлось внести в неё изменения, чтобы избавиться от ошибки загрузки фото, убрать лишние зависимости, избавиться от необходимости использовать пароль при поиске по тегам. Для этого полностью переписал функции getMedias и getMediasByTag класса Instagram, добавил файл autoload.php в папку plugins для совместимости.
    inWidget-1.1.0

    Дата: 18 февраля 2017 г.

    • Для работы виджета теперь требует PHP >= 5.4.0 с поддержкой библиотеки cURL
    • Добавлена проверка на минимальные системные требования
    • Отправка запросов и прасинг ответов от Instagram теперь осуществляется через библиотеку instagram-php-scraper (https://github.com/postaddictme/instagram-php-scraper)
    • Удалены оригинальные функции класса inWidget отвечающие за отправку запросов и проверку ответов сервера.
    • ACCESS_TOKEN упразднён и больше нигде не используется. Также больше не требуется регистрация своего приложения.
    • Упразднены ошибки с номерами: 103, 401, 404, 405, 406, 407.
    • Появилась ошибка с номером 500 - которая в большинстве случаев отдаёт текст ошибки сгенерированной библиотекой instagram-php-scraper.
    • Виджет теперь может выводить любой открытый профиль, а не только ваш.
    • Вывод фотографий по тегам снова стал глобальным, т.е. в выдачу будут попадать фото и других пользователей, а не только ваши.
    • Теперь можно указать несколько хештегов через запятую.
    • Теперь можно блокировать нежелательные аккаунты других пользователей через опцию bannedLogins в файле confing.php. Логины необходимо перечислить через запятую. Опция будет полезна при работе с хештегами.
    • Имя кэш-файла теперь совпадает с логином пользователя. Благодаря этому виджет можно использовать с несколькими аккаунтами одновременно. Вам лишь необходимо решить, как вы будете менять значение переменной LOGIN в файле confing.php
    • Теперь виджет может получать от сервера любое количество фотографий. Т.е. значение параметра imgCount может быть существенно больше 30 шт. Мне удалось получить 1000 шт. за один раз, но я крайне не рекомендую вводить экстремальные значения.
    inWidget-1.0.7

    Дата: 24 декабря 2015 г.

    • Полностью совместимая версия с изменениями в API Instagram от 17 ноября 2015 г.
    • Запросы на получение данных теперь используют ACCESS TOKEN.
    • CLIENT_ID упразднён и больше нигде не используется.
    • Частично изменилась логика обработки ошибок.
    • Появились ошибки с номерами: 404, 405, 406, 407. Описание см. в документации.
    inWidget-1.0.7-ALFA

    Дата: 26 ноября 2015 г.

    • Минимально совместимая версия с изменениями в API Instagram от 17 ноября 2015 г.
    • Запросы на получение данных теперь используют ACCESS TOKEN.
    • CLIENT_ID упразднён и больше нигде не используется.
    inWidget-1.0.6

    Дата: 28 августа 2014 г.

    • Теперь виджет умеет работать с хэш-тегами на кириллице и других нелатинских языках.
    • Поля LOGIN, CLIENT_ID и langDefault стали обязательными для заполнения.
    • Вывод ошибок PHP снова включён. Рекомендую выключать после настройки виджета в index.php
    inWidget-1.0.5

    Дата: 27 августа 2014 г.

    • Исправлена ошибка деления на ноль в случае если виджету передаются некорректные аргументы.
    • Вывод PHP ошибок отключен из соображений безопасности. Для отладки можно включить в index.php
    inWidget-1.0.4

    Дата: 22 августа 2014 г.

    • Случайный порядок фотографий можно выключить в config.php
    • Отсутствие фотографий в профиле больше не является ошибкой.
    • Виджет переведён на русский и английский язык. Появились файлы локализации.
    • Язык по умолчанию можно указать в config.php
    • Виджет научился автоматически определять язык пользователя. Можно отключить в config.php
    • Можно изменить язык виджета с помощью $_GET переменной.
    • Произведён небольшой рефакторинг кода.
    inWidget-1.0.3

    Дата: 11 августа 2014 г.

    Исправлена ошибка из-за которой виджет мог начать транслировать фотографии другого пользователя.

    inWidget-1.0.2

    Дата: 01 августа 2014 г.

    Добавлена возможность вывода фотографий по хэш-тегу.

    inWidget-1.0.1

    Дата: 28 июля 2014 г.

    • Переписан механизм кэширования. Теперь используется файл, а не база данных.
    • Размер кэша уменьшен в 10 раз.
    • Скорость работы виджета увеличилась в 2 раза.
    • Ошибки стали более информативными. Появились коды ошибок и пояснения.
    • Картинки оформления встроены прямо в CSS, чтобы уменьшить количество запросов к серверу.
    • Улучшена стабильность, произведён рефекторинг кода и исправлены мелкие баги.
    inWidget-1.0.0

    Дата: 23 января 2014 г.

    С этой версии всё началось. Кэширование производится в базу данных MySQL.
    Актуальная инструкция для этой версии содержится в архиве.

    Порадуй моего котэ. Поддержи проект!

     


    Поделись с друзьями



    Рекомендуем посмотреть ещё:


    Закрыть ... [X]

    Техподдержка и администрация сайта одноклассники - как связатьcя? Широкий стол своими руками

    Как сделать ошибка 404 для своего сайта Как сделать ошибка 404 для своего сайта Как сделать ошибка 404 для своего сайта Как сделать ошибка 404 для своего сайта Как сделать ошибка 404 для своего сайта Как сделать ошибка 404 для своего сайта

    ШОКИРУЮЩИЕ НОВОСТИ