On Tue, Mar 06, 2018 at 04:39:04PM -0300, Diogo Galvao wrote: > The following patch makes it possible to handle all FastCGI requests > with a single script so it can route clean URLs itself. > > Was it already possible some other way? > > And, regardless of this patch, is it even a feature you'd > like to see in base? Any suggestion for a better implementation? > > > server "example.com" { > listen on * port 80 > root "/htdocs/example.com" > > location "/robots.txt" { > pass > } > location "/favicon.ico" { > pass > } > location "*" { > fastcgi { > socket "/run/php-fpm.sock" > with "/htdocs/example.com/router.php" > } > } > } > > > Index: httpd.conf.5 > =================================================================== > RCS file: /cvs/src/usr.sbin/httpd/httpd.conf.5,v > retrieving revision 1.89 > diff -u -p -u -p -r1.89 httpd.conf.5 > --- httpd.conf.5 4 Jan 2018 20:38:12 -0000 1.89 > +++ httpd.conf.5 6 Mar 2018 19:11:56 -0000 > @@ -272,7 +272,12 @@ Disable the directory index. > .Xr httpd 8 > will neither display nor generate a directory index. > .El > -.It Oo Ic no Oc Ic fastcgi Op Ic socket Ar socket > +.It Xo > +.Op Ic no > +.Ic fastcgi > +.Op Ic socket Ar socket > +.Op Ic with Ar script > +.Xc > Enable FastCGI instead of serving files. > The > .Ar socket > @@ -282,6 +287,14 @@ root directory of > .Xr httpd 8 > and defaults to > .Pa /run/slowcgi.sock . > +.Pp > +If provided, > +.Ar script > +is a local path name within the > +.Xr chroot 2 > +root directory of > +.Xr httpd 8 > +that is used as the SCRIPT_FILENAME for all requests. > .Pp > The FastCGI handler will be given the following variables: > .Pp > Index: httpd.h > =================================================================== > RCS file: /cvs/src/usr.sbin/httpd/httpd.h,v > retrieving revision 1.135 > diff -u -p -u -p -r1.135 httpd.h > --- httpd.h 7 Feb 2018 03:28:05 -0000 1.135 > +++ httpd.h 6 Mar 2018 19:11:56 -0000 > @@ -397,13 +397,14 @@ SPLAY_HEAD(client_tree, client); > #define SRVFLAG_SERVER_MATCH 0x00200000 > #define SRVFLAG_SERVER_HSTS 0x00400000 > #define SRVFLAG_DEFAULT_TYPE 0x00800000 > +#define SRVFLAG_FCGISCRIPT 0x01000000 > #define SRVFLAG_BITS \ > "\10\01INDEX\02NO_INDEX\03AUTO_INDEX\04NO_AUTO_INDEX" \ > "\05ROOT\06LOCATION\07FCGI\10NO_FCGI\11LOG\12NO_LOG\13SOCKET" \ > "\14SYSLOG\15NO_SYSLOG\16TLS\17ACCESS_LOG\20ERROR_LOG" \ > "\21AUTH\22NO_AUTH\23BLOCK\24NO_BLOCK\25LOCATION_MATCH" \ > - "\26SERVER_MATCH\27SERVER_HSTS\30DEFAULT_TYPE" > + "\26SERVER_MATCH\27SERVER_HSTS\30DEFAULT_TYPE\31FCGISCRIPT" > #define TCPFLAG_NODELAY 0x01 > #define TCPFLAG_NNODELAY 0x02 > @@ -467,6 +468,7 @@ struct server_config { > char index[PATH_MAX]; > char root[PATH_MAX]; > char socket[PATH_MAX]; > + char fcgiscript[PATH_MAX]; > char accesslog[PATH_MAX]; > char errorlog[PATH_MAX]; > struct media_type default_type; > Index: parse.y > =================================================================== > RCS file: /cvs/src/usr.sbin/httpd/parse.y,v > retrieving revision 1.92 > diff -u -p -u -p -r1.92 parse.y > --- parse.y 28 Aug 2017 06:00:05 -0000 1.92 > +++ parse.y 6 Mar 2018 19:11:57 -0000 > @@ -674,6 +674,17 @@ fcgiflags : SOCKET STRING { > free($2); > srv_conf->flags |= SRVFLAG_SOCKET; > } > + | WITH STRING { > + if (strlcpy(srv_conf->fcgiscript, $2, > + sizeof(srv_conf->fcgiscript)) >= > + sizeof(srv_conf->fcgiscript)) { > + yyerror("fastcgi script too long"); > + free($2); > + YYERROR; > + } > + free($2); > + srv_conf->flags |= SRVFLAG_FCGISCRIPT; > + } > ; > connection : CONNECTION '{' optnl conflags_l '}' > Index: server_fcgi.c > =================================================================== > RCS file: /cvs/src/usr.sbin/httpd/server_fcgi.c,v > retrieving revision 1.75 > diff -u -p -u -p -r1.75 server_fcgi.c > --- server_fcgi.c 31 Jul 2017 08:02:49 -0000 1.75 > +++ server_fcgi.c 6 Mar 2018 19:11:57 -0000 > @@ -236,9 +236,18 @@ server_fcgi(struct httpd *env, struct cl > errstr = "failed to encode param"; > goto fail; > } > - if (fcgi_add_param(¶m, "SCRIPT_FILENAME", script, clt) == -1) { > - errstr = "failed to encode param"; > - goto fail; > + if (srv_conf->flags & SRVFLAG_FCGISCRIPT) { > + if (fcgi_add_param(¶m, "SCRIPT_FILENAME", > + srv_conf->fcgiscript, clt) == -1) { > + errstr = "failed to encode param"; > + goto fail; > + } > + } else { > + if (fcgi_add_param(¶m, "SCRIPT_FILENAME", > + script, clt) == -1) { > + errstr = "failed to encode param"; > + goto fail; > + } > } > if (desc->http_query) { >
Hi, I wonder if it can't be done simpler with some wrapper program/script that sets $SCRIPT_FILENAME to your router PHP script beforehand? It it would then it would require no changes to httpd and be more useful in other cases aswell. -- Kind regards, Hiltjo