[mod_ssi] Add SSI vars SCRIPT_{URI,URL} and REQUEST_SCHEME (fixes #2721)
This is a proposal to add to lighttpd the famous SSI variables SCRIPT_URI and SCRIPT_URL (known to Apache users), as well as a bonus ENV variable called REQUEST_SCHEME. SCRIPT_URI and SCRIPT_URL will be available as SSI variables from within documents handled by mod_ssi. They can be used like any other SSI var with the "#echo var" command: <!--#echo var="SCRIPT_URI"--> <!--#echo var="SCRIPT_URL"--> Webmasters willing to display links to the W3C Validator will be able to use: <a href="http://validator.w3.org/check?uri=<!--#echo var="SCRIPT_URI"-->">…</a> instead of the generic http://validator.w3.org/check?uri=referer link which does not work on some (most?) browsers which do not send referers when the link itself resides in a document sent through https. REQUEST_SCHEME will be available both as an environment variable. It is defined as "http" or "https", depending on the scheme of the connection. It is safe to use this name as it does not conflict with any existing variable on Apache or Nginx. This is slightly different from the HTTPS var which is often added by webadmins on their server's configuration. EDIT: Some Apache modules also define REQUEST_SCHEME with the same possible values as this proposal. From: fbrosson <fbrosson@users.noreply.github.com> git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@3124 152afb58-edef-0310-8abb-c4023f1b3aa9
This commit is contained in:
parent
cc81f1f9dc
commit
a579e7ffc0
1
NEWS
1
NEWS
|
@ -48,6 +48,7 @@ NEWS
|
|||
* [unittests] add test_buffer and test_base64 unit tests
|
||||
* [buffer] refactor buffer_path_simplify (fixes #2560)
|
||||
* validate return values from strtol, strtoul (fixes #2564)
|
||||
* [mod_ssi] Add SSI vars SCRIPT_{URI,URL} and REQUEST_SCHEME (fixes #2721)
|
||||
|
||||
- 1.4.39 - 2016-01-02
|
||||
* [core] fix memset_s call (fixes #2698)
|
||||
|
|
|
@ -277,6 +277,11 @@ static int build_ssi_cgi_vars(server *srv, connection *con, plugin_data *p) {
|
|||
ssi_env_add(p->ssi_cgi_env, CONST_STRING("DOCUMENT_ROOT"), con->physical.doc_root->ptr);
|
||||
|
||||
ssi_env_add(p->ssi_cgi_env, CONST_STRING("REQUEST_URI"), con->request.uri->ptr);
|
||||
|
||||
if (!buffer_string_is_empty(con->uri.scheme)) {
|
||||
ssi_env_add(p->ssi_cgi_env, CONST_STRING("REQUEST_SCHEME"), con->uri.scheme->ptr);
|
||||
}
|
||||
|
||||
ssi_env_add(p->ssi_cgi_env, CONST_STRING("QUERY_STRING"), buffer_is_empty(con->uri.query) ? "" : con->uri.query->ptr);
|
||||
ssi_env_add(p->ssi_cgi_env, CONST_STRING("REQUEST_METHOD"), get_http_method_name(con->request.http_method));
|
||||
ssi_env_add(p->ssi_cgi_env, CONST_STRING("REDIRECT_STATUS"), "200");
|
||||
|
@ -330,8 +335,17 @@ static int process_ssi_stmt(server *srv, connection *con, plugin_data *p, const
|
|||
|
||||
struct {
|
||||
const char *var;
|
||||
enum { SSI_ECHO_UNSET, SSI_ECHO_DATE_GMT, SSI_ECHO_DATE_LOCAL, SSI_ECHO_DOCUMENT_NAME, SSI_ECHO_DOCUMENT_URI,
|
||||
SSI_ECHO_LAST_MODIFIED, SSI_ECHO_USER_NAME } type;
|
||||
enum {
|
||||
SSI_ECHO_UNSET,
|
||||
SSI_ECHO_DATE_GMT,
|
||||
SSI_ECHO_DATE_LOCAL,
|
||||
SSI_ECHO_DOCUMENT_NAME,
|
||||
SSI_ECHO_DOCUMENT_URI,
|
||||
SSI_ECHO_LAST_MODIFIED,
|
||||
SSI_ECHO_USER_NAME,
|
||||
SSI_ECHO_SCRIPT_URI,
|
||||
SSI_ECHO_SCRIPT_URL,
|
||||
} type;
|
||||
} echovars[] = {
|
||||
{ "DATE_GMT", SSI_ECHO_DATE_GMT },
|
||||
{ "DATE_LOCAL", SSI_ECHO_DATE_LOCAL },
|
||||
|
@ -339,6 +353,8 @@ static int process_ssi_stmt(server *srv, connection *con, plugin_data *p, const
|
|||
{ "DOCUMENT_URI", SSI_ECHO_DOCUMENT_URI },
|
||||
{ "LAST_MODIFIED", SSI_ECHO_LAST_MODIFIED },
|
||||
{ "USER_NAME", SSI_ECHO_USER_NAME },
|
||||
{ "SCRIPT_URI", SSI_ECHO_SCRIPT_URI },
|
||||
{ "SCRIPT_URL", SSI_ECHO_SCRIPT_URL },
|
||||
|
||||
{ NULL, SSI_ECHO_UNSET }
|
||||
};
|
||||
|
@ -413,7 +429,7 @@ static int process_ssi_stmt(server *srv, connection *con, plugin_data *p, const
|
|||
buffer_free(b);
|
||||
break;
|
||||
}
|
||||
case SSI_ECHO_LAST_MODIFIED: {
|
||||
case SSI_ECHO_LAST_MODIFIED: {
|
||||
time_t t = sce->st.st_mtime;
|
||||
|
||||
if (0 == strftime(buf, sizeof(buf), p->timefmt->ptr, localtime(&t))) {
|
||||
|
@ -457,6 +473,27 @@ static int process_ssi_stmt(server *srv, connection *con, plugin_data *p, const
|
|||
chunkqueue_append_mem(con->write_queue, CONST_BUF_LEN(con->uri.path));
|
||||
break;
|
||||
}
|
||||
case SSI_ECHO_SCRIPT_URI: {
|
||||
if (!buffer_string_is_empty(con->uri.scheme) && !buffer_string_is_empty(con->uri.authority)) {
|
||||
chunkqueue_append_mem(con->write_queue, CONST_BUF_LEN(con->uri.scheme));
|
||||
chunkqueue_append_mem(con->write_queue, CONST_STR_LEN("://"));
|
||||
chunkqueue_append_mem(con->write_queue, CONST_BUF_LEN(con->uri.authority));
|
||||
chunkqueue_append_mem(con->write_queue, CONST_BUF_LEN(con->request.uri));
|
||||
if (!buffer_string_is_empty(con->uri.query)) {
|
||||
chunkqueue_append_mem(con->write_queue, CONST_STR_LEN("?"));
|
||||
chunkqueue_append_mem(con->write_queue, CONST_BUF_LEN(con->uri.query));
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SSI_ECHO_SCRIPT_URL: {
|
||||
chunkqueue_append_mem(con->write_queue, CONST_BUF_LEN(con->request.uri));
|
||||
if (!buffer_string_is_empty(con->uri.query)) {
|
||||
chunkqueue_append_mem(con->write_queue, CONST_STR_LEN("?"));
|
||||
chunkqueue_append_mem(con->write_queue, CONST_BUF_LEN(con->uri.query));
|
||||
}
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
data_string *ds;
|
||||
/* check if it is a cgi-var or a ssi-var */
|
||||
|
|
Loading…
Reference in New Issue