Правильный способ работы с документами об ошибках при использовании загрузчика php - PullRequest
0 голосов
/ 20 декабря 2010

Я настраиваю сайт, используя загрузчик php. Кажется, директивы ErrorDocument отданы в предпочтение RewriteRule. Это нормально, однако, заголовки по-прежнему отправляются правильно, поэтому я думаю, что мне нужно отслеживать их в php и перенаправлять на правильный документ об ошибках вручную. Проблема, однако, в том, что до того, как я отправил несколько конкретных ошибок на пользовательские страницы, а остальные остались с сообщением об ошибке apache по умолчанию, теперь я вижу, как я могу перенаправить свои конкретные страницы, но я теряю все сообщения по умолчанию. Я не могу добавить поддержку всех возможных ошибок. И я не пробовал, но, думаю, это будет распространяться и на коды состояния перенаправления, что мне потребуется, поскольку этот сайт заменяет старый на том же сервере.

Как правильно это сделать? Я надеюсь, что просто делаю что-то не так в своем .htaccess, основные части которого следуют:

# .htaccess

# redirect error documents - commented since they don't work anyway
# ----------------------------------------------------------------------
#ErrorDocument 404 /error/404/
#ErrorDocument 403 /error/403/
#ErrorDocument 401 /error/401/
#ErrorDocument 500 /error/500/

# Redirect to bootstrap
# ----------------------------------------------------------------------
RewriteEngine on
RewriteBase /
RewriteRule !\.(ico|jpg|png|svg|js|css)$ index.php

# Prevent hotlinking 
# ----------------------------------------------------------------------
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?.*\.mysite\.net/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule \.(ico|jpg|png|svg|js|css)$ - [F]

Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 20 декабря 2010

Хороший вопрос, мы работаем через PHP.

Мы используем собственную платформу, которую мы создали.У нас есть таблица, которая содержит все действительные URL-адреса, или «Маршруты» (очень похоже на воспламенитель кода или kohana).Мы делаем две вещи.

Настройте htaccess так, чтобы, если файл существует на физическом сервере, то показывал этот файл.поэтому htaccess выглядит примерно так:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?r=$1 [L,QSA] 

пояснение - переписать любой URL, например www.domain.com/myurl, чтобы перейти к index.php? r = myurl, кромекогда URL-адрес представляет собой файл (! -f) или каталог (! -d), который существует на сервере.

Тогда у нас есть файл начальной загрузки, index.php делает что-то вроде этого:

$route = $_GET['r'];
db::where('route', $route);
$result = db::get('routes')->fetch();
if(!$result) show_error('404');

и затем мы определили show_error ('404') как

function show_error($type){
switch($type){
  case '404':
  default:
    header("HTTP/1.0 404 Not Found");
    include('404.html');
    exit;
    break;
 }
}

Используя эту технику, большинство других ошибок, таких как 403 без доступа и т. Д., Все еще будут обслуживаться из Apache.Потому что, если, например, существует защищенный паролем каталог, то перезапись заставит сервер отобразить этот каталог, который затем запросит пароль, а если действительный пароль не указан, он будет обслуживать 403.

Удачи!

0 голосов
/ 20 декабря 2010

Директивы ErrorDocument - это параметры конфигурации для Apache, которые он использует при отправке какого-либо кода ошибки. Если вы перенаправляете весь трафик на PHP, то PHP отвечает за ответный документ с ошибкой. Поскольку PHP по умолчанию ничего не делает, он становится вашей ответственностью.

Нужно сделать соответствующий код ошибки, используя header, а затем отобразить любой документ, который вы хотите отобразить. Вы можете использовать те же документы, что и Apache, если хотите. Просто include это. Eg.:

function respond404() {
  header("HTTP/1.0 404 Page Not Found");
  include("/error/404/index.html");
  exit;
}

Насколько я знаю, невозможно получить эти настройки apache с помощью PHP, поэтому вам нужно либо вручную проанализировать файл .htaccess, либо дублировать информацию между настройками Apache и ваше PHP-приложение. В любом случае кодов ошибок не так много - вам нужно только охватить коды в диапазоне 4xx и 5xx. Смотрите здесь

...