Direct and Indirect
Clients must call the controller either directly or indirectly. The direct method adds request parameters to the controller URI:http://host/controller.php?display=main
http://host/controller.php?display=contact_form
http://host/controller.php?display=privacy_policy
All intra-site links point to /controller.php, but the varied
request parameters change which page to show. This works and has wide support
among web servers, but the string of parameters can grow unwieldy.The indirect way is cleaner and looks more natural, but the specific setup depends on the web server used. Apache's
AddHandler configuration
directive associates an executable or module with a path (such as
/special) or filename extension (.site):http://host/intro/main.site
http://host/intro/contact_form.site
http://host/about/privacy_policy.site
Notice that there is no explicit mention of the controller. Associating of
the controller with the file extension .site takes place behind
the scenes in the httpd.conf or .htaccess file.The (hidden) executable here is an Apache content handler. When a user requests a matching URI, Apache short-circuits its normal request/response flow and passes control to the registered handler. It is then up to the handler to generate the content to return to the requesting browser.
This article will demonstrate the indirect method and use filename extensions.
A Simple Example
A concrete example will clarify the previous sections' points. Consider the following code,simple.php:<p>
Controller called for URI
<code>
<?= $_SERVER[ 'REQUEST_URI' ] ?>
</code>
</p>
<ul>
<?php foreach( $_SERVER as $key => $val ){ ?>
<li>
<b><?= ${key} ?>:</b>
<tt><?= ${val} ?></tt>
</li>
<?php } ?>
</ul>
Assume simple.php exists in the base directory of the document
root of a web server listening on localhost:8000.In
.htaccess, the lines:Action controller-test /simple.php
AddHandler controller-test .tst
define /simple.php as the action controller-test
and associate that action with the file extension .tst. When
Apache receives a request for a filename ending in .tst, it will
execute /simple.php instead of trying to serve a file from disk.
(The executable named by Action is relative to the document
root.)Try it out: make web requests for
simple.php then various
.tst files. For example:http://localhost:8000/simple.php
http://localhost:8000/foo.tst
http://localhost:8000/params.tst?p1=one&p2=two
http://localhost:8000/not_here/this_will_fail.tst
The first URL prints out all request parameters and server variables. So
does the second URL, although the "request URI" line changes. Here,
foo.tst was requested, and because of the AddHandler
call in .htaccess, Apache let simple.php take over.
Though it doesn't demonstrate much in the way of aesthetics, the output from
simple.php shows the wealth of variables available to a PHP script
that is called as a controller. (Sharp eyes may notice that it's the same set
of variables available during normal PHP script execution.)Fittingly, the third URL doesn't work. A requested resource may be purely virtual, but directories leading up to that resource must exist. Requests for
/not_here/this_will_fail.tst fail because the directory
not_here does not exist in the document root.Nor can a controller-managed resource act as an index page. An explicit request for
index.site will work, but a request of
http://localhost:8000/ will not attempt to load
/index.site, regardless of DirectoryIndex
directives.These two limitations are based on how Apache maps requests, described in detail in Writing Apache Modules with Perl and C.
No comments:
Post a Comment
comment.........