Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: PHP отдать 404 ошибку
цитата
08/12/14 в 18:28
 S_Flash
Скрипт по get параметру отдаёт страницы. Если параметр взят с потолка, то скрипту соотвественно надо отдать 404ю, например:
Код:
if (нихуя) {
  header("HTTP/1.1 404 Not Found");
  header("Status: 404 Not Found");
  die(file_get_contents('/404.html'));
}


1) Только предположим, что в апаче или htaccess уже есть настройка
ErrorDocument 404 /404_new.html
Программисту данный пример не понравится, так как есть дубли кода (путь к дизайну 404 страницы). Можно ли как-то на php отдавать вместе с заголовком дефолтную серверную 404 страницу в браузер сёрферу, чтоб не настраивать отдельно дизайн страницы в php и на сервере?

2) Корректно ли у меня в примере вариант хедера для fast-cgi пихать в одну кучу с апачевским?
цитата
08/12/14 в 18:49
 Дартаньян
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
Так коректней, нет редирект 404 не выйдет.
цитата
09/12/14 в 14:59
 S_Flash
Спасибо за совет.
А есть какя-то идея отдавать саму страницу\дизайн 404 в варианте, который настроен на сервере?
цитата
09/12/14 в 16:03
 Ailk
отдавать любую страницу с заголовком 404. т.е. можешь сам генерить страничку с указанным заголовком, если нет контента.
цитата
09/12/14 в 17:49
 S_Flash
Хотелось бы отдавать ту, которая настроена в апачевском конфиге или в htaccess, дапбы дизайн страниц саовпадал.
цитата
09/12/14 в 20:29
 Mika
Ну так создай переменную окружения, значением которой будет путь к нужному файлу, и ее уже используй в апаче и пхп.
цитата
09/12/14 в 20:30
 Ailk
так в .хтаксес отдавай свою 404

Код:
ErrorDocument 404 http://mysite.com/404.html
цитата
09/12/14 в 20:44
 S_Flash
Ailk: Как тогда не меняя кода в php отдать в скриптом ту же самую http://mysite.com/404.html ?
Предположим я поменял URL к 404.html или установил скрипт на другой домен, на другой сервер...
цитата
09/12/14 в 21:19
 Ailk
никак, только вручную задавать переменную в конфиге апача, как мика сказал. Или через хтакцесс.
цитата
10/12/14 в 01:25
 rx
пути как правило как относительны так и абсолютны и всегда можно вычислить нужный,
ну и в хардкорном программинге нет слова нельзя trollface.png

$default_404=$_SERVER["DOCUMENT_ROOT"]."/404.html";
$default_htaccess=$_SERVER["DOCUMENT_ROOT"]."/.htaccess";

function get_404()
{

global $default_404, $default_htaccess;

if(file_exists($default_htaccess))
{
if(preg_match("/^ErrorDocument\s+404(.*?)$/smi",file_get_contents($default_htaccess),$ar)) {return $_SERVER["DOCUMENT_ROOT"].trim($ar[1]);}
}
return $default_404;
}

print(get_404());

подобные рутины можно юзать рантаймом, можно закешить найденное вместе с датой проверки и периодически проверять или же обновлять по триггерам, тем самым получая самонастраивающуюся систему подстраивающуюся под хтаксесс в случае смены дефолтных значений
цитата
10/12/14 в 02:21
 Evial
Не надо так делать
die(file_get_contents('/404.html'));
file_get_contents($default_htaccess)

Вы сервер до смерти затрахаете этим, если часто будет это выполняться. А выполняться оно будет часто, потому что 404 ошибок обычно много.
цитата
10/12/14 в 04:07
 rx
Sargas писал:


Не надо так делать
die(file_get_contents('/404.html'));
file_get_contents($default_htaccess)

Вы сервер до смерти затрахаете этим, если часто будет это выполняться. А выполняться оно будет часто, потому что 404 ошибок обычно много.



хз что там у ТС с die(file_get_contents('/404.html')); (ибо readfile() адекватнее),
но что касается моего коммента - специально выделил

rx писал:

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


в тру хардкорных случаях после первого запуска полученное значение кидается в мемкеш или еще куда душе угодно или банально перезаписывается общий конфиг файл, и апдейтится по триггерам (событийные, кнопка "настроить", контроль спайдером смены размера/даты или банально резапуск по крону, етц)

и моя практика показывает что если сервак кончается от пары вызовов на чтение - это как правило не пара вызовов на чтение виноваты trollface.png
цитата
10/12/14 в 06:46
 Ailk
Ха! Смелое решение smail54.gif Но что если 404 файл прописан не в верхнем акцессе, а прямо в конфиге апача для всех серверов? Или того хуже в качестве сервера стоит нгинкс голый или лайтхттпд?
цитата
10/12/14 в 09:39
 rx
Ailk писал:
Но что если 404 файл прописан не в верхнем акцессе, а прямо в конфиге апача для всех серверов?


указать по умолчанию на поиск другой файл/симлинк или сделать htaccess каталогом выше. но задачи как на фри хосте что-то изобрести - это обычно из другой оперы trollface.png

Ailk писал:
Или того хуже в качестве сервера стоит нгинкс голый или лайтхттпд?



у любого из них есть конфигурационный файл trollface.png

та же подстрока error_page 404 для нгинкса или server.error-handler-404 для лайтхттпд


зы - нет универсального эффективного решения ВСЕХ проблем сразу. но если есть конкретная задача - всегда есть ее эффективное решение icon_wink.gif
цитата
10/12/14 в 11:31
 Stek
Не понимаю, нафига себе пудрить мозги до такой степени. Взяли и решили "ошибку у нас отдает /404.php". В дальнейшем на него все и заворачивается. И в нем хоть редирект влупите по желанию.


S_Flash писал:
Предположим я поменял URL к 404.html или установил скрипт на другой домен, на другой сервер...

/404.php внутри домена будет всегда иметь один и тот же путь DOCUMENT_ROOT/404.php
цитата
10/12/14 в 21:45
 S_Flash
Stek:
Какой итоговый код на php будет корректным для Apache и fast-cgi, если принять как правило, что страница дизайна ошибки /404.php?
цитата
10/12/14 в 22:04
 ivango
Вот так нормально работает
----------------------------
header("HTTP/1.1 404 Not Found");
virtual("/404.php");
----------------------------
отдается страница из корня с хедером Not Found
цитата
10/12/14 в 22:17
 Stek
S_Flash писал:
Какой итоговый код на php будет корректным для Apache и fast-cgi, если принять как правило, что страница дизайна ошибки /404.php?


Код:
<?php
require_once($_SERVER['DOCUMENT_ROOT'].'/404.php');
die;


В все заголовки и прочее уже в 404.php пихать. В таком случае если решите вдруг отдавать 302 или 200, то поменять придется только в одном месте.


Эта страница в полной версии