Intereting Posts
Один общий поставщик с двумя проектами Вставка нескольких строк сразу с помощью подготовленных операторов Сериализация «Symfony \ Component \ HttpFoundation \ File \ UploadedFile» не допускается вставить вывод print_r в базу данных? Facebook Graph API не даст мне данные изображения Знание с помощью PHP, если браузер может воспроизводить аудиофайл с помощью тега html5 audio Weird PHP error: «Невозможно использовать возвращаемое значение функции в контексте записи» Изменение размера изображения до квадрата, но сохраняйте пропорции и заполняйте прозрачность Интерфейс с запущенными приложениями в PHP? Laravel 4, Несколько полиморфных отношений от одной модели Doctrine2 ORM не обновляет объекты, которые изменены вне сценария HTML PHP Отобразить имя пользователя после успешного входа в систему PHP и MySQL: порядок по последней дате и лимиту 10 Magento настраивает результат поиска каталогов html Как вставить событие в календарь Google Google, используя php?

Доступ к директиве apache errordocument от PHP

Я хотел бы сделать вывод 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 …) эквивалентны в этом отношении.