123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 |
- This is very beta documentation. Clearly better stuff can and will follow.
- INTRO:
- apache_hooks is a full super-set enhancement of the apache 1.3 sapi that allows for
- php code to be run on the apache request object at every stage of the apache
- request. It supports all of the apache 1.3 sapi commands and configurations, and
- additionally supports the following httpd.conf directives:
- HTTPD.CONF DIRECTIEVS:
- phpRequire /path/to/file = requires a file at the beginning of an
- initial apache request
- phpUriHandler /path/to/file = registers a hook that will run the
- specified file at the uri translation stage of the apache request
- phpUriHandler Class::Method = registers a hook to run Class::Method at
- the uri translation stage of the apache request
- phpPostReadHandler /path/to/file = hook for post-read phase
- phpPostReadHandlerMethod Class::Method
- phpHeaderHandler = hook for header parsing phase
- phpHeaderHandlerMethod
- phpAuthHandler = hook for authentication phase
- phpAuthHandlerMethod
- phpAccessHandler = hook for access control phase
- phpAccessHandlerMethod
- phpTypeHandler = hook for Type Checking phase
- phpTypeHandlerMethod
- phpFixupHandler = hook for 'fixup' phase
- phpFixupHandlerMethod
- phpLoggerHandler = hook for logging phase
- phpLoggerHandlerMethod
- AddHandler php-script = set's up a special type handler
- phpResponseHandler /path/to/file = sets file to be called to handle
- response phase
- phpResponseHandlerMethod Class::Method
- All handlers may be stacked, i.e. you can list multiple handler directives
- in a single scope and they will be run in order.
- EXAMPLES:
- So, to set up a 'hello world' location handler (so that any request to
- /hello/* returns hello world) you can:
- phpRequire /tmp/setup.php
- <Location /hello>
- AddHandler php-script
- phpResponseHandlerMethod Hello::World
- </Location>
- with
- #/tmp/setup.php
- <?
- class Hello {
- function World() {
- global $request;
- $request->send_http_header();
- echo "Hello World";
- }
- }
- ?>
- $request is the apache request. It is instantiated at all stages
- automatically. The methods of that class are:
- getallheaders
- args
- boundary
- content_encoding
- content_type
- filename
- handler
- hostname
- method
- path_info
- protocol
- status_line
- the_request
- unparsed_uri
- uri
- allowed
- bytes_sent
- chunked
- content_length
- header_only
- method_number
- mtime
- no_cache
- no_local_copy
- proto_num
- proxyreq
- read_body
- remaining
- request_time
- status
- headers_in
- headers_out
- err_headers_out
- auth_name
- auth_type
- basic_auth_pw
- discard_request_body
- is_initial_req
- meets_conditions
- remote_host
- satisfies
- server_port
- set_etag
- set_last_modified
- some_auth_required
- update_mtime
- send_http_header
- basic_http_header
- send_header_field
- send_http_trace
- send_http_options
- send_error_response
- set_content_length
- set_keepalive
- rputs
- log_error
- lookup_uri
- lookup_file
- method_uri
- run
- internal_redirect
- These all wrap the ap_* apache EXPORT_API functions using the same
- semantics (and are also the same as the Apache::Request methods in
- mod_perl if you are familiar with that)
- So, a uri handler to redirect all non-local traffic to /404.php (an
- error page) would be
- phpUriHandler /tmp/uri.php
- #/tmp/uri.php
- <?
- if($REMOTE_ADDR != '127.0.0.1') {
- $request->uri('/404.php');
- }
- return OK;
- ?>
- It's important to note that since this is called from the uri
- translations phase, this validation is performed for every request to
- the server, not just for php pages.
- Also, scope is shared between all the hooks. So in the above, we could
- merge the two and do something like:
- #/tmp/uri.php
- <?
- if($REMOTE_ADDR != '127.0.0.1') {
- $whoami = 'Stranger';
- }
- else {
- $whoami = 'Friend';
- }
- return DECLINED; # because we're not redirecting, just messing around
- ?>
- and then:
- #/tmp/setup.php
- <?
- class Hello {
- function World() {
- global $request;
- global $whoami;
- $request->send_http_header();
- echo "Hello $whoami";
- }
- }
- ?>
- These variables are also in the same scope as a script if your script is
- being handled by the standard application/x-httpd-php handler.
- This allows you to make decisions and pass data between your handlers
- and scripts at all stages.
- The above are clearly trite examples, but hopefully give you a starting
- point.
- One note: all handlers can be validly re-entered 'in sub-requests'.
- For this reason you should not define functions/classes here without
- anti-redefinition guards (I would just recommend putting them in an
- include and using include_one). This is not true for phpRequire, which
- is only entered once, at the main request, and so it is safe to make
- function/class declarations there (in fact that's what it's for).
- Hope that helps!
|