За последние 24 часа нас посетил 21551 программист и 1017 роботов. Сейчас ищут 719 программистов ...

Вывод содержимого страницы 404

Тема в разделе "PHP для новичков", создана пользователем Vladd55, 26 янв 2023.

  1. Vladd55

    Vladd55 Новичок

    С нами с:
    11 дек 2021
    Сообщения:
    84
    Симпатии:
    1
    Добрый вечер!

    На сайте с помощью .htaccess организована единая точка входа - index.php.
    Код (Text):
    1. <IfModule mod_rewrite.c>
    2.   RewriteEngine On
    3.   RewriteBase /
    4.  
    5.   RewriteCond %{REQUEST_FILENAME} !-f
    6.   RewriteCond %{REQUEST_FILENAME} !-d
    7.   RewriteRule ^(.*)$ /index.php
    8. </IfModule>
    9.  
    10. ErrorDocument 404 /error404.html
    Файл error404.html лежит в корне сайта.

    На странице index.php имеется такой код:

    Код (Text):
    1. include '../config.php';
    2.  
    3.   $url = $_SERVER['REQUEST_URI'];
    4.  
    5.   $query = mysqli_query($db, "SELECT * FROM `content` WHERE `url` = '$url'");
    6.  
    7.   $row = mysqli_fetch_assoc($query);
    8.  
    9.   if ($row)
    10.   {
    11.   $text = $row['text'];
    12.   echo $text;
    13.   }
    14.   else
    15.   {
    16.   header("HTTP/1.1 404 Not Found");
    17.   }
    В таблице content для одного из значений url занесен простейший код страницы. Если в адресной строке браузера набрать этот url, то страница нормально воспроизводится. А для всех остальных адресов должен выдаваться отклик 404 и показываться страница error404.html.

    Отклик 404 есть, а вот страница error404.html не показывается.

    Конечно, можно после header("HTTP/1.1 404 Not Found"); написать
    readfile(__DIR__ . '/error404.html');
    И тогда страница 404 будет показана, но, как мне кажется, это плохой вариант: ведь не зря же в типовой .htaccess (в любой CMS) повсеместно вписывается ErrorDocument 404 /error404.html ?

    Как вообще это делается?
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    А в какой строке вы говорите серверу показать этот 404 хтмл? - нигде! Чего же ждёте?
    --- Добавлено ---
    да ну? 100 лет не видал такого, этот раньше когда единой точки входа и не было - так делали.
     
    Vladd55 нравится это.
  3. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Оно не связано. Так могут сделать, чтобы контент 404-ой совпадал, несмотря на разные источники генерации ошибки (и внутри движка, и вне его).
    --- Добавлено ---
    Еще, как вариант: ErrorDocument 404 /404 – наоборот серверную ошибку отдаете на обработку в движок, а там строите страницу по шаблону и т.п., в общем со всеми прелестями динамика.
    --- Добавлено ---
    P.S. /404 по идее не должна существовать или ее контроллер должен сам выдавать статус 404, иначе при обычном запросе браузером /404 будет статус 200, что нафиг не надо в 99% случаев (мусорная страница).
     
    Vladd55 нравится это.
  4. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    858
    Симпатии:
    132
    И инъекция никого не смутила )
     
    Vladd55 и miketomlin нравится это.
  5. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Смутила еще на киберфоруме (видел там этот код). Но ТСу что-то объяснять себе дороже :)
    --- Добавлено ---
    Подход Архиварикса – тоже так себе прелесть :( Я вчера показывал ТСу свою статью, в которой говорится, что нужно использовать хотя бы двухуровневую иерархию, а не тупо таблицу страниц со «слагами» типа /qwerty/uiop/asdfg?zxcvb&zdec :)
     
    don.bidon нравится это.
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Зы. Прям такой вариант я вроде бы не видел, зато видел ErrorDocument 403 /404 – походу движок переопределяет не только контент страницы, но и устанавливаемый сервером статус – нужно проверить. Скорее всего это так. Когда-то читал, что можно во фронт перенаправлять директивой ErrorDocument 404 /index.php, а там движок может менять статус на 200 и т.п.
     
  7. Vladd55

    Vladd55 Новичок

    С нами с:
    11 дек 2021
    Сообщения:
    84
    Симпатии:
    1
    А по инъекции можно чуть поподробнее?
    Что Вы имеете в виду?

    * * *
    Я хочу пояснить свою настойчивость. Я когда-то прочитал статью про Апач, в которой говорилось, что запись ErrorDocument 404 /error404.html непременно должна быть в .htaccess, а файл error404.html лежать в корне. И что Апач после выдачи заголовка 404 сам подтягивает этот файл. Это руководство я сохранил в рабочем блокноте и был уверен, что так оно и есть, не сомневался. Поэтому просто старался понять, как это происходит, поскольку на моем файле этого не происходило, а, по данным записи, должно было быть.
     
    #7 Vladd55, 26 янв 2023
    Последнее редактирование: 26 янв 2023
  8. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    Вот если б не было у вас единой точки входа, эта директива для страниц ошибок сработала... А так у вас правило + всё подряд перенаправлять, если нет в файловой системе такого каталога или файла.... То и есть правила про страницу ошибок никогда не сработают... Поэтому формируйте страницу 404 в роутах, статус же отдаёте, ну им содержимое отдайте и всё будут счастливы
     
  9. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    SQL-инъекции. Нужно или фильтровать адрес на входе, или экранировать, или использовать подготовленные запросы.

    Забудьте. В норм. сайтах часто и .htaccess нет (даже если используется Apache).
     
  10. Vladd55

    Vladd55 Новичок

    С нами с:
    11 дек 2021
    Сообщения:
    84
    Симпатии:
    1
    Это я понимаю, этот вопрос под контролем.

    Сейчас хочу просто отладить самый примитивный роутинг, чтобы все прочувствовать.

    В строку базы для URL = /Vesna/ я внес вот такой код:
    Код (Text):
    1. <!DOCTYPE html>
    2.     <html lang=ru>
    3.     <head>
    4. <title>Проба</title>
    5. <meta name="description" content="Проверка">
    6. <meta name="keywords" content="Тест">
    7. <meta charset=utf-8>
    8. <link rel="stylesheet" href="/test.css" type="text/css">
    9. <link rel="shortcut icon" href="/favicon.ico" >
    10. </head>
    11.  
    12. <body>
    13. <p>Страница <b>/Vesna/</b></p>
    14. <img src="/design/logo.jpg">
    15. <script src="/js/left-menu.js"></script>
    16. </body>
    17.  
    18. </html>
    Файлы test.css, logo.jpg и left-menu.js на сервере отсутствуют.

    Код индексной страницы
    Код (Text):
    1.     include '../config.php';
    2.  
    3.     $url = $_SERVER['REQUEST_URI'];
    4.  
    5.     $query = mysqli_query($db, "SELECT * FROM `content` WHERE `url` = '$url'");
    6.     $row = mysqli_fetch_assoc($query);
    7.  
    8.     if ($row)
    9.     {
    10.         $text = $row['text'];
    11.         echo ($text);
    12.     }
    13.     else
    14.     {
    15.         header("HTTP/1.1 404 Not Found");
    16.         readfile(__DIR__ . '/error404.html');
    17.     }
    Соответственно, браузер, помимо основного, пришлет 3 запроса для файлов:
    test.css
    logo.jpg
    left-menu.js

    и на каждый, помимо header 404, будет получать код страницы error404.html.

    Как я полагаю, это неправильно: на запросы css, jpg и js достаточно выдавать header 404 - ведь это не страницы. А как там на самом деле, по нормам интернета, понять не сумел.

    Как это положено делать?
     
  11. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Перестаньте уже «полагать». 404-ая – тоже страница. У нее должен быть контент.

    Mля, о5 25. Забыли, о чем я вам написал в пред. теме? Или так и не поняли, а «спасибо» сказали, чтобы я перестал ругаться?
    --- Добавлено ---
    И нафига вы упорно суете такие запросы на обработку во фронт? Все будет тормозить. Такие вещи делаются в особых случаях, для ускорения их работы используется спец. методы вроде использования X-Sendfile.
     
  12. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    откуда такая уверенность? оттуда же из 90-х и случайную инфу про ErrorDocument 404 ?
    путь несуществующий? хоть каталога, хоть файла.... - несуществующий, надо отдать страницу 404
    а если я это взял и в адресной строке ввел? какая разница то?
     
    Vladd55 нравится это.
  13. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Можете сделать 404-ое изображение :D и т.п. Но это будет хрень. Не уверен даже, что любой клиент это поймет.

    Если при «404-ых» запросах не отдавался контент, вы бы постоянно в ответ на такие запросы наблюдали «белую/пустую» страницу.
     
    #13 miketomlin, 27 янв 2023
    Последнее редактирование: 27 янв 2023
  14. Vladd55

    Vladd55 Новичок

    С нами с:
    11 дек 2021
    Сообщения:
    84
    Симпатии:
    1
    В общем-то, да, я вполне согласен с Вами. Сам тоже такой довод держал в голове. Просто подумал, что, может быть, есть для этой ситуации какой-то стандарт - ведь битых ссылок на странице может быть много.
    --- Добавлено ---
    Тот случай, когда я реально Вас не понимаю. Если на сайте с помощью .htaccess создана единая точка входа, и это индексная страница, то на неё все и приходит, только так оно и получается.

    Или Вы имели в виду что-то другое?
     
  15. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    NO!!! Статик обычно, минуя единую точку входа, выдается. Я вам 10 раз об этом писал!

    Вам уже три человека сказали, что это НЕ «индексная страница». Единая точка входа, front controller (в контексте я могу сократить до «фронт»).
    --- Добавлено ---
    Перед запуском фронта обычно добавляют условие с !-f, уже давал ссылку: Как сделать единую точку входа с ЧПУ? (комменты тоже почитайте). В вашем конфиге есть это условие.
     
    #15 miketomlin, 27 янв 2023
    Последнее редактирование: 27 янв 2023
  16. Vladd55

    Vladd55 Новичок

    С нами с:
    11 дек 2021
    Сообщения:
    84
    Симпатии:
    1
    Статические файлы, если они имеются на сервере, у меня не приходят на единую точку входа, . Я на это замечание Вам сразу ответил. Файл .htaccess их туда не приглашает. И на практике я это вижу.

    Или я ошибаюсь? Или Вы имеете в виду что-то другое?

    (Статью, конечно же, я читал. И вчера, и сейчас освежил в памяти. strtolower, preg_replace, маска допустимых урлов - это все потом, это есть в плане.)
     
  17. Vladd55

    Vladd55 Новичок

    С нами с:
    11 дек 2021
    Сообщения:
    84
    Симпатии:
    1
    Я планирую вот такую структуру урлов: /wowa/leto/ . Без динамической части. Соответственно, проверка будет на буквы, цифры, слеши. Это одновременно и защита от инъекций.

    А служебные файлы могут иметь динамическую часть: /leto.php?abc=12&bcd=22 Но это только реально существующие файлы, и их будем проверять соответствующим образом на допустимость параметров. На единую точку входа они не попадут.
     
  18. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    А что за странные адреса тогда:
    /test.css
    /logo.jpg
    /left-menu.js
    Такие адреса обычно у статика! Но в общем их можно обрабатывать и через фронт. В конце пред. темы именно на это делал упор!

    Как написал вам на серче, путь тоже «динамический» ;) «Динамическую часть» принято называть строкой GET-параметров или строкой запроса (не путать со «строкой запроса» типа GET /addr – здесь запрос в англ. варианте это request, а там query).

    Шо за «служебные файлы»? Суть единой точки входа в том, что она одна на весь сайт. Можно, конечно, скрещивать ежа с носорогом, но результат будет плачевный. Даже когда отдельные «сайты» размещают в отдельных каталогах корня – это идиотизм! Походу вы так и не поняли, что такое роутинг, контроллеры и т.п.

    Элементарный фронт, использующий Простую модель, поддерживает один GET-параметр: https://gency.ru/comment/145 (его можно разрешить или запретить в роуте, причем отдельно для адресов /wowa и /wowa/leto).
     
    #18 miketomlin, 27 янв 2023
    Последнее редактирование: 27 янв 2023
  19. Vladd55

    Vladd55 Новичок

    С нами с:
    11 дек 2021
    Сообщения:
    84
    Симпатии:
    1
    Я очень внимательно и с большим удовольствием читаю все, что мне пишут. И ваши статьи тоже. Но для меня, действительно, все эти понятия не столь важны, они не стоят на первом месте. Мне просто нужно, чтобы работало. Тем более, что кроме меня, все равно все эти коды никто не увидит.

    Первая версия сайта прекрасно отработала больше 10 лет. Сейчас немного модернизирую её и будет работать дальше. Мои основные интересы сконцентрированы на контенте, но приходится заниматься и кодом.

    Надеюсь, Вы меня поняли.
     
  20. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Да, конечно. Возьмите WP :D шЮтка
    --- Добавлено ---
    Понятия (в смысле термины) важны, чтобы вас хорошо понимали.

    И реализация упомянутых понятий (в смысле вещей) важна, чтобы все норм. работало ;)
     
    #20 miketomlin, 27 янв 2023
    Последнее редактирование: 27 янв 2023
    Vladd55 нравится это.
  21. Vladd55

    Vladd55 Новичок

    С нами с:
    11 дек 2021
    Сообщения:
    84
    Симпатии:
    1
    Да, я согласен с этим.
    Спасибо.
     
  22. JohnWarner

    JohnWarner Новичок

    С нами с:
    16 ноя 2022
    Сообщения:
    6
    Симпатии:
    0
    У меня в .htaccess добавлено (далее пример из сети)
    PHP:
    1. ErrorDocument 404 https://site.ru/404.html
    ...и работает.
     
  23. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    Ну если нет единой точки входа, либо она дальше чем определение страницы ошибок, то че не работать то?