Я хотел бы сделать вывод php-скрипта, как реальная страница 404 (как указано в директиве Apache ErrorDocument), если определенные условия не выполняются. Я не уверен, как я могу / если можно получить доступ к этому значению с PHP.
if(!@$_SESSION['value']){ header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found"); echo $default_page['404']; exit(); } echo 'Welcome to a secret place.';
Я понимаю, что значение ErrorDocument может быть перезаписано, но меня особенно интересует значение по умолчанию, жестко закодированное Apache. Если можно узнать значение, которое перезаписывается (например, файлом .htaccess), то это бонус 🙂
http://httpd.apache.org/docs/2.0/mod/core.html#ErrorDocument
edit: чтобы быть ясным, я хотел бы отправить содержимое по умолчанию 404 страницы (или 403 и т. д.) Apache из PHP. Если я использую только header
по себе, то ничего не выводится клиенту / пользователю (по крайней мере, в FF / Chrome, IE имеет свои собственные встроенные страницы, которые показаны).
Рекомендуемый способ установки кода ответа из PHP – это @mario:
Header('Status: 404 Not Found');
Если вы хотите получить тело страницы, сервер обычно будет предоставлять 404 и не заботится о том, чтобы URL-адрес, который был переписан в браузере пользователя, вы могли бы использовать что-то вроде:
$uri_404 = 'http://' . $_SERVER['HTTP_HOST'] . ($_SERVER['HTTP_PORT'] ? (':' . $_SERVER['HTTP_PORT']) : '') . '/was-nowhere-to-be-seen'; Header("Location: $uri");
(Если вы прямо из frobbing поля заголовка Location
, вам нужно предоставить полный URI.) В результате этого браузер пользователя в конечном итоге укажет на это фиктивное местоположение, которое может быть не таким, каким вы хотите. (Наверное, нет.) Итак, вы могли бы сами собрать содержимое страницы самостоятельно и объединить два, по сути:
Header('Status: 404 Not Found'); $uri_404 = 'http://' . $_SERVER['HTTP_HOST'] . ($_SERVER['HTTP_PORT'] ? (':' . $_SERVER['HTTP_PORT']) : '') . '/was-nowhere-to-be-seen'; $curl_req = curl_init($uri); curl_setopt($curl_req, CURLOPT_MUTE, true); $body = curl_exec($curl_req); print $body; curl_close($curl_req);
Это должно отображать содержимое 404 страницы отчетов сервера для фиктивного URI, и вы можете затем скопировать его и использовать его самостоятельно. Это должно должным образом обрабатывать ErrorDocument 404
обработчика ErrorDocument 404
.
Для этого нет метода по умолчанию. Но вы всегда можете обмануть:
header("Status: 404 Not There"); // no worky #readfile("http://$_SERVER[HTTP_HOST]/non-existant-url"); // doesn't work either (Apache detects the fraud) #virtual("/non-existant-url"); // otherwise a HTTP class, this one works but is seldomly available $request = new HttpRequest("http://localhost/error", 1); $answer = $request->send(); print $answer->getBody();
Это вызывает подзапрос. Поскольку он находится на локальном сервере, я бы проигнорировал любые более высокие штрафы за производительность. Но, возможно, стоит потратить средства на использование функции Apache / mod_php virtual()
.
Примечательно, что этот метод зависит от знания определенного местоположения ресурса 404. Если у вас уже есть переписывание url, тогда вам понадобится еще один трюк в вашем .htaccess:
RewriteRule ^non-existant-url$ error [E=404,L]
Это заставляет ресурс генерировать ожидаемый результат, тем самым делая доступным по умолчанию errordocument.
Ваш пример кажется хорошим. Для этого вам нужно использовать функцию заголовка php:
<?php header("HTTP/1.0 404 Not Found"); ?>
Например, вы говорите, что эта страница – 404, и вы можете заполнить содержимое тем, что хотите
Действительный 404 – это всего лишь часть кода, который отправляет код ошибки 404 обратно в браузер, поэтому ErrorDocument или header (.. 404 …) эквивалентны в этом отношении.