What About Apache 2.x?
Users of Apache 2 will notice thatsimple.php does not work as
a content handler. For Apache 2.0.x, AddHander works only for
existing files. According to reports (specifically, Bugzilla bug ID
8431), Apache 1.x misused the term "handler" so this changed in 2.x.There is hope. Per that bug report, Apache 2.1 may add a configuration directive to relax the restriction, such that
AddHandler can refer
to nonexistent files just as it did in Apache 1.x.Putting It Together: An Overview of the Sample Site
This article's sample web site uses a Front Controller to separate content from layout. The controller maps request URIs to content files, then merges the content with a layout template at request time.php_include/classes.php contains the helper classes that
simplify the process:AppConfigwraps an array of common application settings such as page background color.SitePagerepresents a page of content. It wraps a title (for the browser title bar) and the path to a content file.PageMapis the backbone of the controller's work. It associatesSitePageobjects with URIs and holdsSitePages for HTTP errors (such as 404 and 500).AliasMapholds aliases for the controller-managed URIs.- Content pages use
AliasMap, viaUtil::aliasLink(), to refer to one another without hard-coding paths in<a>tags. (This is not required, but certainly eases maintenance.)Utilexposes a second function,literalLink(), to create anchor tags to offsite resources.
SitePage, PageMap, and AliasMap could
be replaced by an XML document; but they are straight code here for the sake of
simplicity.php_include/mappings.php configures the page mappings and
populates AppConfig with some values. End-users can adjust site
settings here without touching the support classes or controller code.Controller.php, the controller, weighs in around 30 lines of code
because the helper classes do the heavy lifting:<?php
require_once( 'php_include/classes.php' );
require_once( 'php_include/mappings.php' );
$daysToCache = 1.5;
$cacheMaxAge = ${daysToCache}*24*(60*60);
$layoutFile = 'php_include/layout_main.php';
$requestedURI = ereg_replace(
$config->getValue( 'URISuffix' ) . '$' ,
"" ,
$_SERVER["REQUEST_URI"]
);
$page = $pageMappings->getPage( $requestedURI );
if( is_null( $page ) )
{
header( 'HTTP/1.0 404 Not Found' );
$page = $pageMappings->getNotFoundPage();
}
if( ! headers_sent() )
{
header(
'Cache-Control: max-age=' . ${cacheMaxAge} . ',
must-revalidate'
);
header(
'Last-Modified: ' . gmdate('D, d M Y H:i:s' ,
$page->getLastModified() ) . ' GMT'
);
}
include( $layoutFile );
?>
The actual content files in the content directory are HTML
fragments with no layout. The include() function merges them with
the layout template. Adding a new page to the site requires placing the file
under content, updating the PageMap, and (optionally)
updating AliasMap.The
content and php_include directories should
never allow direct access, so .htaccess files restrict normal web
requests..htaccess in the base of the document root contains various
Apache settings. Since virtual resources cannot be index documents,
RedirectMatch forwards requests for the root URI to
/main/index.site. (Change the host and port statements to make the
sample code to work on your computer.) AddHandler directives
associate Controller.php with requests ending in
.site. ErrorDocument directives map HTTP status
codes to controller-managed error pages.The stub directories
main and errors permit us to
call controller-managed resources with directory paths, for logical grouping.
(Recall Apache's handling of nonexistent directories, described above.)
No comments:
Post a Comment
comment.........