使用php bootstrap时正确处理错误文档的方法

时间:2010-12-19 21:20:22

标签: php apache .htaccess mod-rewrite

我正在使用php bootstrap设置一个站点。似乎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 个答案:

答案 0 :(得分:1)

好问题,我们通过PHP工作。

我们使用我们构建的专有框架。我们有一个包含所有有效网址的表格,或“路由”(很像代码点火器或kohana)。我们做了两件事。

设置htaccess,以便在物理服务器上存在文件时,显示该文件。所以htaccess看起来像这样:

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

说明 - 重写任何网址,例如www.domain.com/myurl,转到index.php?r = myurl,除非网址是文件(!-f)或者服务器上存在的目录(!-d)。

然后我们有自己的bootstrap文件,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提供服务​​。

祝你好运!

答案 1 :(得分:0)

ErrorDocument指令是Apache的配置选项,它在发送某种错误代码时使用。如果您将所有流量重定向到PHP,则PHP负责使用错误文档进行响应。由于PHP默认情况下不会执行任何操作,因此它将成为您的责任。

正确的做法是使用header发出适当的错误代码,然后回显您想要显示的任何文档。如果您愿意,可以使用与Apache相同的文档。只需include它。例如:

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

据我所知,没有办法从PHP中获取这些apache设置,因此你要么必须手动解析.htaccess文件,要么必须在Apache之间复制信息设置和PHP应用程序。无论如何,错误代码并不多 - 您只需要涵盖4xx和5xx范围内的错误代码。 See here