On August 5, 2007, Elliotte Harold wrote: > I'm considering a simple site that I may design in PHP. PHP is probably > the simplest solution except for one thing: it carries a very strong > coupling between pages and scripts. As far as I've ever been able to > tell PHP really, really, really wants there to be a single primary .php > file for each URL that does not contain a query string (though that file > may of course invoke others). > > For the system I'm designing that simply won't work. In Java servlet > environments it's relatively trivial to map one servlet to an entire > directory structure, so that it handles all requests for all pages > within that hierarchy.
You have to think of the whole file-serving hierarchy here. Apache gets a request for an URL. What will Apache do with it? Apache will find a file somewhere that matches that URL, and then Apache will either send that file off for further processing (if the file is registered as such within Apache) or Apache will just send that file off to the browser as-is. PHP doesn't even enter into the picture until the decision you're talking about has already been made by Apache. I don't know much about java servlets, but I strongly suspect it's the same - the Sun web server or whatever you're using is making that decision. It may appear to be "simpler" than the PHP/Apache combination but it really isn't. Perhaps it is better integrated because both the web server and the programming language are products of one company, but it's not any simpler when it executes. In any case the correct answer is just to tell Apache to serve file X for every URL that looks like Y or Z or W. Mod_rewrite. That's what it's there for, and it does its job well, and it can be as simple as a couple lines in an .htaccess file. No doubt one could partly handle this with PHP files: foo.com/index.php - lots of code foo.com/dir1/index.php - PHP file sends everything to foo.com/index.php foo.com/dir2/index.php - PHP file sends everything to foo.com/index.php foo.com/dir1/dir3/index.php - PHP file sends everything to foo.com/index.php but telling Apache to use foo.com/index.php for all requests is simpler and less error-prone. It can be quite simple: Contents of foo.com/yourdir/.htaccess file: ------------------------------------------------------- RewriteEngine On RewriteOptions inherit RewriteBase /yourdir RewriteRule ^([0-9A-Za-z]+)/([0-9A-Za-z]+)/ index.php?var1=$1&var2=$2 RewriteRule ^([0-9A-Za-z]+)/([0-9A-Za-z]+) index.php?var1=$1&var2=$2 RewriteRule ^([0-9A-Za-z]+)/ index.php?var1=$1 -------------------------------------------------------- Now, any request for foo.com/yourdir/anything/anythingatall will be sent to foo.com/yourdir/index.php, which will see the extra "directories" as URL variables. The user will not know what's happening - they'll continue to see the "directories" in their browser status bar. Michael Sims _______________________________________________ New York PHP Community Talk Mailing List http://lists.nyphp.org/mailman/listinfo/talk NYPHPCon 2006 Presentations Online http://www.nyphpcon.com Show Your Participation in New York PHP http://www.nyphp.org/show_participation.php
