File:
[ELWIX - Embedded LightWeight unIX -] /
embedaddon /
php /
sapi /
apache_hooks /
README
Revision
1.1.1.1 (vendor branch):
download - view:
text,
annotated -
select for diffs -
revision graph
Tue Feb 21 23:48:06 2012 UTC (12 years, 6 months ago) by
misho
Branches:
php,
MAIN
CVS tags:
v5_4_3elwix,
v5_4_29p0,
v5_4_29,
v5_4_20p0,
v5_4_20,
v5_4_17p0,
v5_4_17,
v5_3_10,
HEAD
php
1: This is very beta documentation. Clearly better stuff can and will follow.
2:
3: INTRO:
4:
5: apache_hooks is a full super-set enhancement of the apache 1.3 sapi that allows for
6: php code to be run on the apache request object at every stage of the apache
7: request. It supports all of the apache 1.3 sapi commands and configurations, and
8: additionally supports the following httpd.conf directives:
9:
10:
11: HTTPD.CONF DIRECTIEVS:
12:
13: phpRequire /path/to/file = requires a file at the beginning of an
14: initial apache request
15:
16: phpUriHandler /path/to/file = registers a hook that will run the
17: specified file at the uri translation stage of the apache request
18: phpUriHandler Class::Method = registers a hook to run Class::Method at
19: the uri translation stage of the apache request
20:
21: phpPostReadHandler /path/to/file = hook for post-read phase
22: phpPostReadHandlerMethod Class::Method
23:
24: phpHeaderHandler = hook for header parsing phase
25: phpHeaderHandlerMethod
26:
27: phpAuthHandler = hook for authentication phase
28: phpAuthHandlerMethod
29:
30: phpAccessHandler = hook for access control phase
31: phpAccessHandlerMethod
32:
33: phpTypeHandler = hook for Type Checking phase
34: phpTypeHandlerMethod
35:
36: phpFixupHandler = hook for 'fixup' phase
37: phpFixupHandlerMethod
38:
39: phpLoggerHandler = hook for logging phase
40: phpLoggerHandlerMethod
41:
42: AddHandler php-script = set's up a special type handler
43: phpResponseHandler /path/to/file = sets file to be called to handle
44: response phase
45: phpResponseHandlerMethod Class::Method
46:
47:
48: All handlers may be stacked, i.e. you can list multiple handler directives
49: in a single scope and they will be run in order.
50:
51:
52: EXAMPLES:
53:
54: So, to set up a 'hello world' location handler (so that any request to
55: /hello/* returns hello world) you can:
56:
57: phpRequire /tmp/setup.php
58: <Location /hello>
59: AddHandler php-script
60: phpResponseHandlerMethod Hello::World
61: </Location>
62:
63: with
64: #/tmp/setup.php
65: <?
66: class Hello {
67: function World() {
68: global $request;
69: $request->send_http_header();
70: echo "Hello World";
71: }
72: }
73: ?>
74:
75: $request is the apache request. It is instantiated at all stages
76: automatically. The methods of that class are:
77:
78: getallheaders
79: args
80: boundary
81: content_encoding
82: content_type
83: filename
84: handler
85: hostname
86: method
87: path_info
88: protocol
89: status_line
90: the_request
91: unparsed_uri
92: uri
93: allowed
94: bytes_sent
95: chunked
96: content_length
97: header_only
98: method_number
99: mtime
100: no_cache
101: no_local_copy
102: proto_num
103: proxyreq
104: read_body
105: remaining
106: request_time
107: status
108: headers_in
109: headers_out
110: err_headers_out
111: auth_name
112: auth_type
113: basic_auth_pw
114: discard_request_body
115: is_initial_req
116: meets_conditions
117: remote_host
118: satisfies
119: server_port
120: set_etag
121: set_last_modified
122: some_auth_required
123: update_mtime
124: send_http_header
125: basic_http_header
126: send_header_field
127: send_http_trace
128: send_http_options
129: send_error_response
130: set_content_length
131: set_keepalive
132: rputs
133: log_error
134: lookup_uri
135: lookup_file
136: method_uri
137: run
138: internal_redirect
139:
140:
141: These all wrap the ap_* apache EXPORT_API functions using the same
142: semantics (and are also the same as the Apache::Request methods in
143: mod_perl if you are familiar with that)
144:
145: So, a uri handler to redirect all non-local traffic to /404.php (an
146: error page) would be
147:
148: phpUriHandler /tmp/uri.php
149:
150: #/tmp/uri.php
151: <?
152: if($REMOTE_ADDR != '127.0.0.1') {
153: $request->uri('/404.php');
154: }
155: return OK;
156: ?>
157:
158: It's important to note that since this is called from the uri
159: translations phase, this validation is performed for every request to
160: the server, not just for php pages.
161:
162: Also, scope is shared between all the hooks. So in the above, we could
163: merge the two and do something like:
164:
165: #/tmp/uri.php
166: <?
167: if($REMOTE_ADDR != '127.0.0.1') {
168: $whoami = 'Stranger';
169: }
170: else {
171: $whoami = 'Friend';
172: }
173: return DECLINED; # because we're not redirecting, just messing around
174: ?>
175:
176: and then:
177:
178: #/tmp/setup.php
179: <?
180: class Hello {
181: function World() {
182: global $request;
183: global $whoami;
184: $request->send_http_header();
185: echo "Hello $whoami";
186: }
187: }
188: ?>
189:
190: These variables are also in the same scope as a script if your script is
191: being handled by the standard application/x-httpd-php handler.
192:
193: This allows you to make decisions and pass data between your handlers
194: and scripts at all stages.
195:
196: The above are clearly trite examples, but hopefully give you a starting
197: point.
198:
199: One note: all handlers can be validly re-entered 'in sub-requests'.
200: For this reason you should not define functions/classes here without
201: anti-redefinition guards (I would just recommend putting them in an
202: include and using include_one). This is not true for phpRequire, which
203: is only entered once, at the main request, and so it is safe to make
204: function/class declarations there (in fact that's what it's for).
205:
206: Hope that helps!
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>