Saltar a contenido

set-misc: Módulo Set-Misc de NGINX

Instalación

Puedes instalar este módulo en cualquier distribución basada en RHEL, incluyendo, pero no limitado a:

  • RedHat Enterprise Linux 7, 8, 9 y 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 y Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-set-misc
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-set-misc

Habilita el módulo añadiendo lo siguiente en la parte superior de /etc/nginx/nginx.conf:

load_module modules/ngx_http_set_misc_module.so;

Este documento describe nginx-module-set-misc v0.33 lanzado el 06 de septiembre de 2021.


Sinopsis

 location /foo {
     set $a $arg_a;
     set_if_empty $a 56;

     # GET /foo?a=32 dará como resultado $a == 32
     # mientras que GET /foo y GET /foo?a= 
     # darán como resultado $a == 56 aquí.
 }

 location /bar {
     set $foo "hello\n\n'\"\\";
     set_quote_sql_str $foo $foo; # para mysql

     # O edición en el lugar:
     #   set_quote_sql_str $foo;

     # ahora $foo es: 'hello\n\n\'\"\\'
 }

 location /bar {
     set $foo "hello\n\n'\"\\";
     set_quote_pgsql_str $foo;  # para PostgreSQL

     # ahora $foo es: E'hello\n\n\'\"\\'
 }

 location /json {
     set $foo "hello\n\n'\"\\";
     set_quote_json_str $foo $foo;

     # O edición en el lugar:
     #   set_quote_json_str $foo;

     # ahora $foo es: "hello\n\n'\"\\"
 }

 location /baz {
     set $foo "hello%20world";
     set_unescape_uri $foo $foo;

     # O edición en el lugar:
     #   set_unescape_uri $foo;

     # ahora $foo es: hello world
 }

 upstream_list universe moon sun earth;
 upstream moon { ... }
 upstream sun { ... }
 upstream earth { ... }
 location /foo {
     set_hashed_upstream $backend universe $arg_id;
     drizzle_pass $backend; # usado con ngx_drizzle
 }

 location /base32 {
     set $a 'abcde';
     set_encode_base32 $a;
     set_decode_base32 $b $a;

     # ahora $a == 'c5h66p35' y
     # $b == 'abcde'
 }

 location /base64 {
     set $a 'abcde';
     set_encode_base64 $a;
     set_decode_base64 $b $a;

     # ahora $a == 'YWJjZGU=' y
     # $b == 'abcde'
 }

 location /hex {
     set $a 'abcde';
     set_encode_hex $a;
     set_decode_hex $b $a;

     # ahora $a == '6162636465' y
     # $b == 'abcde'
 }

 # GET /sha1 da como resultado la salida
 #   aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
 location /sha1 {
     set_sha1 $a hello;
     echo $a;
 }

 # igual
 location /sha1 {
     set $a hello;
     set_sha1 $a;
     echo $a;
 }

 # GET /today da como resultado la fecha de hoy en hora local usando el formato 'yyyy-mm-dd'
 location /today {
     set_local_today $today;
     echo $today;
 }

 # GET /signature da como resultado la firma hmac-sha-1
 # dada una clave secreta y una cadena para firmar
 # este ejemplo da como resultado la firma codificada en base64 que es
 # "HkADYytcoQQzqbjQX33k/ZBB/DQ="
 location /signature {
     set $secret_key 'secret-key';
     set $string_to_sign "some-string-to-sign";
     set_hmac_sha1 $signature $secret_key $string_to_sign;
     set_encode_base64 $signature $signature;
     echo $signature;
 }

 location = /rand {
     set $from 3;
     set $to 15;
     set_random $rand $from $to;

     # o escribir directamente
     #   set_random $rand 3 15;

     echo $rand;  # imprimirá un número entero aleatorio en el rango [3, 15]
 }

Descripción

Este módulo extiende el conjunto de directivas del módulo estándar HttpRewriteModule para proporcionar más funcionalidades como escape y desescape de URI, citación JSON, codificación y decodificación de digestos Hexadecimal/MD5/SHA1/Base32/Base64, generador de números aleatorios, ¡y más!

Cada directiva proporcionada por este módulo puede mezclarse libremente con otras directivas del ngx_http_rewrite_module, como if y set. (¡Gracias al Nginx Devel Kit!)

Directivas

set_if_empty

sintaxis: set_if_empty $dst <src>

predeterminado: no

contexto: location, location if

fase: rewrite

Asigna el valor del argumento <src> si y solo si la variable $dst está vacía (es decir, no se encuentra o tiene un valor de cadena vacía).

En el siguiente ejemplo,

 set $a 32;
 set_if_empty $a 56;

la variable $dst tomará el valor 32 al final. Pero en el ejemplo

 set $a '';
 set $value "hello, world"
 set_if_empty $a $value;

$a tomará el valor "hello, world" al final.

set_quote_sql_str

sintaxis: set_quote_sql_str $dst <src>

sintaxis: set_quote_sql_str $dst

predeterminado: no

contexto: location, location if

fase: rewrite

categoría: ndk_set_var_value

Al tomar dos argumentos, esta directiva citará el valor del segundo argumento <src> según la regla de citación de valores de cadena de MySQL y asignará el resultado al primer argumento, la variable $dst. Por ejemplo,

 location /test {
     set $value "hello\n\r'\"\\";
     set_quote_sql_str $quoted $value;

     echo $quoted;
 }

Entonces, la solicitud GET /test dará como resultado la siguiente salida

 'hello\n\r\'\"\\'

Ten en cuenta que estamos utilizando la directiva echo del echo-nginx-module aquí para mostrar los valores de las variables de nginx directamente.

Al tomar un solo argumento, esta directiva realizará una modificación en el lugar de la variable del argumento. Por ejemplo,

 location /test {
     set $value "hello\n\r'\"\\";
     set_quote_sql_str $value;

     echo $value;
 }

entonces la solicitud GET /test dará exactamente la misma salida que el ejemplo anterior.

Esta directiva se utiliza generalmente para prevenir inyecciones SQL.

Esta directiva puede ser invocada por la interfaz ndk.set_var.DIRECTIVE del lua-nginx-module y la directiva array_map_op del array-var-nginx-module.

set_quote_pgsql_str

sintaxis: set_quote_pgsql_str $dst <src>

sintaxis: set_quote_pgsql_str $dst

predeterminado: no

contexto: location, location if

fase: rewrite

categoría: ndk_set_var_value

Muy similar a set_quote_sql_str, pero con reglas de citación de PostgreSQL para literales de cadena SQL.

set_quote_json_str

sintaxis: set_quote_json_str $dst <src>

sintaxis: set_quote_json_str $dst

predeterminado: no

contexto: location, location if

fase: rewrite

categoría: ndk_set_var_value

Al tomar dos argumentos, esta directiva citará el valor del segundo argumento <src> según la regla de citación de valores de cadena JSON y asignará el resultado al primer argumento, la variable $dst. Por ejemplo,

 location /test {
     set $value "hello\n\r'\"\\";
     set_quote_json_str $quoted $value;

     echo $quoted;
 }

Entonces, la solicitud GET /test dará como resultado la siguiente salida

 "hello\n\r'\"\\"

Ten en cuenta que estamos utilizando la directiva echo del echo-nginx-module aquí para mostrar los valores de las variables de nginx directamente.

Al tomar un solo argumento, esta directiva realizará una modificación en el lugar de la variable del argumento. Por ejemplo,

 location /test {
     set $value "hello\n\r'\"\\";
     set_quote_json_str $value;

     echo $value;
 }

entonces la solicitud GET /test dará exactamente la misma salida que el ejemplo anterior.

Esta directiva puede ser invocada por la interfaz ndk.set_var.DIRECTIVE del lua-nginx-module y la directiva array_map_op del array-var-nginx-module.

set_unescape_uri

sintaxis: set_unescape_uri $dst <src>

sintaxis: set_unescape_uri $dst

predeterminado: no

contexto: location, location if

fase: rewrite

categoría: ndk_set_var_value

Al tomar dos argumentos, esta directiva desescapará el valor del segundo argumento <src> como un componente URI y asignará el resultado al primer argumento, la variable $dst. Por ejemplo,

 location /test {
     set_unescape_uri $key $arg_key;
     echo $key;
 }

Entonces, la solicitud GET /test?key=hello+world%21 dará como resultado la siguiente salida

hello world!

La variable estándar de nginx $arg_PARAMETER contiene el valor crudo (escapado) del parámetro URI. Así que necesitamos la directiva set_unescape_uri para desescaparlo primero.

Ten en cuenta que estamos utilizando la directiva echo del echo-nginx-module aquí para mostrar los valores de las variables de nginx directamente.

Al tomar un solo argumento, esta directiva realizará una modificación en el lugar de la variable del argumento. Por ejemplo,

 location /test {
     set $key $arg_key;
     set_unescape_uri $key;

     echo $key;
 }

entonces la solicitud GET /test?key=hello+world%21 dará exactamente la misma salida que el ejemplo anterior.

Esta directiva puede ser invocada por la interfaz ndk.set_var.DIRECTIVE del lua-nginx-module y la directiva array_map_op del array-var-nginx-module.

set_escape_uri

sintaxis: set_escape_uri $dst <src>

sintaxis: set_escape_uri $dst

predeterminado: no

contexto: location, location if

fase: rewrite

categoría: ndk_set_var_value

Muy similar a la directiva set_unescape_uri, pero realiza la conversión en la dirección opuesta, es decir, el escape de componentes de URL.

set_hashed_upstream

sintaxis: set_hashed_upstream $dst <upstream_list_name> <src>

predeterminado: no

contexto: location, location if

fase: rewrite

Hashea el argumento de cadena <src> en uno de los nombres de upstream incluidos en la lista de upstream llamada <upstream_list_name>. La función hash utilizada es un simple módulo.

Aquí hay un ejemplo,

 upstream moon { ... }
 upstream sun { ... }
 upstream earth { ... }

 upstream_list universe moon sun earth;

 location /test {
     set_unescape_uri $key $arg_key;
     set $list_name universe;
     set_hashed_upstream $backend $list_name $key;

     echo $backend;
 }

Entonces, GET /test?key=blah dará como resultado "moon", "sun" o "earth", dependiendo del valor real del argumento de consulta key.

Esta directiva se utiliza generalmente para calcular una variable de nginx que se pasará a la directiva memc_pass del memc-nginx-module, la directiva [[HttpRedis2Module#redis2_pass]] del redis2-nginx-module y la directiva proxy_pass del ngx_http_proxy_module, entre otros.

set_encode_base32

sintaxis: set_encode_base32 $dst <src>

sintaxis: set_encode_base32 $dst

predeterminado: no

contexto: location, location if

fase: rewrite

categoría: ndk_set_var_value

Al tomar dos argumentos, esta directiva codificará el valor del segundo argumento <src> a su digest base32(hex) y asignará el resultado al primer argumento, la variable $dst. Por ejemplo,

 location /test {
     set $raw "abcde";
     set_encode_base32 $digest $raw;

     echo $digest;
 }

Entonces, la solicitud GET /test dará como resultado la siguiente salida

c5h66p35

Ten en cuenta que estamos utilizando la directiva echo del echo-nginx-module aquí para mostrar los valores de las variables de nginx directamente.

El RFC obliga a la codificación conforme a [A-Z2-7] RFC-3548, pero estamos utilizando la codificación "base32hex" ([0-9a-v]) por defecto. La directiva set_base32_alphabet (introducida por primera vez en v0.28) te permite cambiar el alfabeto utilizado para la codificación/decodificación, por lo que la codificación conforme a RFC-3548 sigue siendo posible mediante configuraciones personalizadas.

Por defecto, el carácter = se utiliza para rellenar los bytes restantes debido a la alineación. Pero el comportamiento de relleno puede ser completamente deshabilitado configurando set_base32_padding off.

Al tomar un solo argumento, esta directiva realizará una modificación en el lugar de la variable del argumento. Por ejemplo,

 location /test {
     set $value "abcde";
     set_encode_base32 $value;

     echo $value;
 }

entonces la solicitud GET /test dará exactamente la misma salida que el ejemplo anterior.

Esta directiva puede ser invocada por la interfaz ndk.set_var.DIRECTIVE del lua-nginx-module y la directiva array_map_op del array-var-nginx-module.

set_base32_padding

sintaxis: set_base32_padding on|off

predeterminado: on

contexto: http, server, server if, location, location if

fase: no

Esta directiva puede controlar si se rellenan los bytes restantes con el carácter "=" al codificar un digest base32 mediante la directiva set_encode_base32.

Esta directiva fue introducida por primera vez en v0.28. Si utilizas versiones anteriores de este módulo, entonces deberías usar set_misc_base32_padding en su lugar.

set_misc_base32_padding

sintaxis: set_misc_base32_padding on|off

predeterminado: on

contexto: http, server, server if, location, location if

fase: no

Esta directiva ha sido desaprobada desde v0.28. Usa set_base32_padding en su lugar si estás utilizando v0.28+.

set_base32_alphabet

sintaxis: set_base32_alphabet <alphabet>

predeterminado: "0123456789abcdefghijklmnopqrstuv"

contexto: http, server, server if, location, location if

fase: no

Esta directiva controla el alfabeto utilizado para codificar/decodificar un digest base32. Acepta una cadena que contiene el alfabeto deseado como "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567" para el alfabeto estándar.

Se utiliza el alfabeto extendido (base32hex) por defecto.

Esta directiva fue introducida por primera vez en v0.28.

set_decode_base32

sintaxis: set_decode_base32 $dst <src>

sintaxis: set_decode_base32 $dst

predeterminado: no

contexto: location, location if

fase: rewrite

categoría: ndk_set_var_value

Similar a la directiva set_encode_base32, pero realiza exactamente la operación opuesta, es decir, decodifica un digest base32(hex) a su forma original.

set_encode_base64

sintaxis: set_encode_base64 $dst <src>

sintaxis: set_encode_base64 $dst

predeterminado: no

contexto: location, location if

fase: rewrite

categoría: ndk_set_var_value

Al tomar dos argumentos, esta directiva codificará el valor del segundo argumento <src> a su digest base64 y asignará el resultado al primer argumento, la variable $dst. Por ejemplo,

 location /test {
     set $raw "abcde";
     set_encode_base64 $digest $raw;

     echo $digest;
 }

Entonces, la solicitud GET /test dará como resultado la siguiente salida

YWJjZGU=

Ten en cuenta que estamos utilizando la directiva echo del echo-nginx-module aquí para mostrar los valores de las variables de nginx directamente.

Al tomar un solo argumento, esta directiva realizará una modificación en el lugar de la variable del argumento. Por ejemplo,

 location /test {
     set $value "abcde";
     set_encode_base64 $value;

     echo $value;
 }

entonces la solicitud GET /test dará exactamente la misma salida que el ejemplo anterior.

Esta directiva puede ser invocada por la interfaz ndk.set_var.DIRECTIVE del lua-nginx-module y la directiva array_map_op del array-var-nginx-module.

set_encode_base64url

sintaxis: set_encode_base64url $dst <src>

sintaxis: set_encode_base64url $dst

predeterminado: no

contexto: location, location if

fase: rewrite

categoría: ndk_set_var_value

Al tomar dos argumentos, esta directiva codificará el valor del segundo argumento <src> a su digest base64 seguro para URL y asignará el resultado al primer argumento, la variable $dst. Por ejemplo,

 location /test {
     set $raw "abcde";
     set_encode_base64url $digest $raw;

     echo $digest;
 }

Entonces, la solicitud GET /test dará como resultado la siguiente salida

YWJjZGU=

Ten en cuenta que estamos utilizando la directiva echo del echo-nginx-module aquí para mostrar los valores de las variables de nginx directamente.

Al tomar un solo argumento, esta directiva realizará una modificación en el lugar de la variable del argumento. Por ejemplo,

 location /test {
     set $value "abcde";
     set_encode_base64url $value;

     echo $value;
 }

entonces la solicitud GET /test dará exactamente la misma salida que el ejemplo anterior.

Esta directiva puede ser invocada por la interfaz ndk.set_var.DIRECTIVE del lua-nginx-module y la directiva array_map_op del array-var-nginx-module.

set_decode_base64

sintaxis: set_decode_base64 $dst <src>

sintaxis: set_decode_base64 $dst

predeterminado: no

contexto: location, location if

fase: rewrite

categoría: ndk_set_var_value

Similar a la directiva set_encode_base64, pero realiza exactamente la operación opuesta, es decir, decodifica un digest base64 a su forma original.

set_decode_base64url

sintaxis: set_decode_base64url $dst <src>

sintaxis: set_decode_base64url $dst

predeterminado: no

contexto: location, location if

fase: rewrite

categoría: ndk_set_var_value

Similar a la directiva set_encode_base64url, pero realiza exactamente la operación opuesta, es decir, decodifica un digest base64 seguro para URL a su forma original.

set_encode_hex

sintaxis: set_encode_hex $dst <src>

sintaxis: set_encode_hex $dst

predeterminado: no

contexto: location, location if

fase: rewrite

categoría: ndk_set_var_value

Al tomar dos argumentos, esta directiva codificará el valor del segundo argumento <src> a su digest hexadecimal y asignará el resultado al primer argumento, la variable $dst. Por ejemplo,

 location /test {
     set $raw "章亦春";
     set_encode_hex $digest $raw;

     echo $digest;
 }

Entonces, la solicitud GET /test dará como resultado la siguiente salida

e7aba0e4baa6e698a5

Ten en cuenta que estamos utilizando la directiva echo del echo-nginx-module aquí para mostrar los valores de las variables de nginx directamente.

Al tomar un solo argumento, esta directiva realizará una modificación en el lugar de la variable del argumento. Por ejemplo,

 location /test {
     set $value "章亦春";
     set_encode_hex $value;

     echo $value;
 }

entonces la solicitud GET /test dará exactamente la misma salida que el ejemplo anterior.

Esta directiva puede ser invocada por la interfaz ndk.set_var.DIRECTIVE del lua-nginx-module y la directiva array_map_op del array-var-nginx-module.

set_decode_hex

sintaxis: set_decode_hex $dst <src>

sintaxis: set_decode_hex $dst

predeterminado: no

contexto: location, location if

fase: rewrite

categoría: ndk_set_var_value

Similar a la directiva set_encode_hex, pero realiza exactamente la operación opuesta, es decir, decodifica un digest hexadecimal a su forma original.

set_sha1

sintaxis: set_sha1 $dst <src>

sintaxis: set_sha1 $dst

predeterminado: no

contexto: location, location if

fase: rewrite

categoría: ndk_set_var_value

Al tomar dos argumentos, esta directiva codificará el valor del segundo argumento <src> a su digest SHA-1 y asignará el resultado al primer argumento, la variable $dst. La forma hexadecimal del digest SHA-1 se generará automáticamente, usa set_decode_hex para decodificar el resultado si deseas la forma binaria del digest SHA-1.

Por ejemplo,

 location /test {
     set $raw "hello";
     set_sha1 $digest $raw;

     echo $digest;
 }

Entonces, la solicitud GET /test dará como resultado la siguiente salida

aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d

Ten en cuenta que estamos utilizando la directiva echo del echo-nginx-module aquí para mostrar los valores de las variables de nginx directamente.

Al tomar un solo argumento, esta directiva realizará una modificación en el lugar de la variable del argumento. Por ejemplo,

 location /test {
     set $value "hello";
     set_sha1 $value;

     echo $value;
 }

entonces la solicitud GET /test dará exactamente la misma salida que el ejemplo anterior.

Esta directiva puede ser invocada por la interfaz ndk.set_var.DIRECTIVE del lua-nginx-module y la directiva array_map_op del array-var-nginx-module.

set_md5

sintaxis: set_md5 $dst <src>

sintaxis: set_md5 $dst

predeterminado: no

contexto: location, location if

fase: rewrite

categoría: ndk_set_var_value

Al tomar dos argumentos, esta directiva codificará el valor del segundo argumento <src> a su digest MD5 y asignará el resultado al primer argumento, la variable $dst. La forma hexadecimal del digest MD5 se generará automáticamente, usa set_decode_hex para decodificar el resultado si deseas la forma binaria del digest MD5.

Por ejemplo,

 location /test {
     set $raw "hello";
     set_md5 $digest $raw;

     echo $digest;
 }

Entonces, la solicitud GET /test dará como resultado la siguiente salida

5d41402abc4b2a76b9719d911017c592

Ten en cuenta que estamos utilizando la directiva echo del echo-nginx-module aquí para mostrar los valores de las variables de nginx directamente.

Al tomar un solo argumento, esta directiva realizará una modificación en el lugar de la variable del argumento. Por ejemplo,

 location /test {
     set $value "hello";
     set_md5 $value;

     echo $value;
 }

entonces la solicitud GET /test dará exactamente la misma salida que el ejemplo anterior.

Esta directiva puede ser invocada por la interfaz ndk.set_var.DIRECTIVE del lua-nginx-module y la directiva array_map_op del array-var-nginx-module.

set_hmac_sha1

sintaxis: set_hmac_sha1 $dst <secret_key> <src>

sintaxis: set_hmac_sha1 $dst

predeterminado: no

contexto: location, location if

fase: rewrite

Calcula el digest HMAC-SHA1 del argumento <src> y asigna el resultado a la variable de argumento $dst con la clave secreta <secret_key>.

La forma binaria cruda del digest HMAC-SHA1 se generará, usa set_encode_base64, por ejemplo, para codificar el resultado a una representación textual si lo deseas.

Por ejemplo,

 location /test {
     set $secret 'thisisverysecretstuff';
     set $string_to_sign 'some string we want to sign';
     set_hmac_sha1 $signature $secret $string_to_sign;
     set_encode_base64 $signature $signature;
     echo $signature;
 }

Entonces, la solicitud GET /test dará como resultado la siguiente salida

R/pvxzHC4NLtj7S+kXFg/NePTmk=

Ten en cuenta que estamos utilizando la directiva echo del echo-nginx-module aquí para mostrar los valores de las variables de nginx directamente.

Esta directiva requiere que la biblioteca OpenSSL esté habilitada en tu compilación de NGINX (generalmente pasando la opción --with-http_ssl_module al script ./configure).

set_hmac_sha256

sintaxis: set_hmac_sha256 $dst <secret_key> <src>

sintaxis: set_hmac_sha256 $dst

predeterminado: no

contexto: location, location if

fase: rewrite

Calcula el digest HMAC-SHA256 del argumento <src> y asigna el resultado a la variable de argumento $dst con la clave secreta <secret_key>.

La forma binaria cruda del digest HMAC-SHA256 se generará, usa set_encode_base64, por ejemplo, para codificar el resultado a una representación textual si lo deseas.

Por ejemplo,

 location /test {
     set $secret 'thisisverysecretstuff';
     set $string_to_sign 'some string we want to sign';
     set_hmac_sha256 $signature $secret $string_to_sign;
     set_encode_base64 $signature $signature;
     echo $signature;
 }

Entonces, la solicitud GET /test dará como resultado la siguiente salida

4pU3GRQrKKIoeLb9CqYsavHE2l6Hx+KMmRmesU+Cfrs=

Ten en cuenta que estamos utilizando la directiva echo del echo-nginx-module aquí para mostrar los valores de las variables de nginx directamente.

Esta directiva requiere que la biblioteca OpenSSL esté habilitada en tu compilación de NGINX (generalmente pasando la opción --with-http_ssl_module al script ./configure).

set_random

sintaxis: set_random $res <from> <to>

predeterminado: no

contexto: location, location if

fase: rewrite

Genera un número (pseudo) aleatorio (en forma textual) dentro del rango [<$from>, <$to>] (inclusive).

Solo se permiten números no negativos para los argumentos <from> y <to>.

Cuando <from> es mayor que <to>, sus valores se intercambiarán en consecuencia.

Por ejemplo,

 location /test {
     set $from 5;
     set $to 7;
     set_random $res $from $to;

     echo $res;
 }

entonces la solicitud GET /test dará como resultado un número entre 5 y 7 (es decir, entre 5, 6, 7).

Por ahora, no hay forma de configurar una semilla de generador aleatorio personalizada.

Detrás de escena, utiliza la función estándar de C rand().

Esta directiva fue introducida por primera vez en el lanzamiento v0.22rc1.

Consulta también set_secure_random_alphanum y set_secure_random_lcalpha.

set_secure_random_alphanum

sintaxis: set_secure_random_alphanum $res <length>

predeterminado: no

contexto: location, location if

fase: rewrite

Genera una cadena aleatoria criptográficamente fuerte de <length> caracteres de longitud con el alfabeto [a-zA-Z0-9].

<length> puede estar entre 1 y 64, inclusive.

Por ejemplo,

 location /test {
     set_secure_random_alphanum $res 32;

     echo $res;
 }

entonces la solicitud GET /test dará como resultado una cadena como ivVVRP2DGaAqDmdf3Rv4ZDJ7k0gOfASz.

Esta funcionalidad depende de la presencia del dispositivo /dev/urandom, disponible en la mayoría de los sistemas similares a UNIX.

Consulta también set_secure_random_lcalpha y set_random.

Esta directiva fue introducida por primera vez en el lanzamiento v0.22rc8.

set_secure_random_lcalpha

sintaxis: set_secure_random_lcalpha $res <length>

predeterminado: no

contexto: location, location if

fase: rewrite

Genera una cadena aleatoria criptográficamente fuerte de <length> caracteres de longitud con el alfabeto [a-z].

<length> puede estar entre 1 y 64, inclusive.

Por ejemplo,

 location /test {
     set_secure_random_lcalpha $res 32;

     echo $res;
 }

entonces la solicitud GET /test dará como resultado una cadena como kcuxcddktffsippuekhshdaclaquiusj.

Esta funcionalidad depende de la presencia del dispositivo /dev/urandom, disponible en la mayoría de los sistemas similares a UNIX.

Esta directiva fue introducida por primera vez en el lanzamiento v0.22rc8.

Consulta también set_secure_random_alphanum y set_random.

set_rotate

sintaxis: set_rotate $value <from> <to>

predeterminado: no

contexto: location, location if

fase: rewrite

Incrementa $value pero lo mantiene en el rango de <from> a <to>. Si $value es mayor que <to> o menor que <from>, se establecerá en el valor <from>.

El valor actual después de ejecutar esta directiva se guardará siempre en una base por ubicación. Y este valor guardado se utilizará para la incrementación cuando $value no esté inicializado o tenga un valor incorrecto.

Solo se permiten números no negativos para los argumentos <from> y <to>.

Cuando <from> es mayor que <to>, sus valores se intercambiarán en consecuencia.

Por ejemplo,

 location /rotate {
     default_type text/plain;
     set $counter $cookie_counter;
     set_rotate $counter 1 5;
     echo $counter;
     add_header Set-Cookie counter=$counter;
 }

entonces la solicitud GET /rotate dará como resultado el siguiente número entre 1 y 5 (es decir, 1, 2, 3, 4, 5) en cada actualización de la página. Esta directiva puede ser útil para propósitos de rotación de banners.

Otro ejemplo es usar la persistencia de valores del lado del servidor para hacer un simple round-robin:

 location /rotate {
     default_type text/plain;
     set_rotate $counter 0 3;
     echo $counter;
 }

Y acceder a /rotate también dará como resultado una secuencia entera 0, 1, 2, 3, 0, 1, 2, 3, y así sucesivamente.

Esta directiva fue introducida por primera vez en el lanzamiento v0.22rc7.

set_local_today

sintaxis: set_local_today $dst

predeterminado: no

contexto: location, location if

fase: rewrite

Establece la fecha de hoy ("yyyy-mm-dd") en hora local en la variable de argumento $dst.

Aquí hay un ejemplo,

 location /today {
     set_local_today $today;
     echo $today;
 }

entonces la solicitud GET /today dará como resultado algo como

2011-08-16

y el año, la fecha actual que obtienes aquí variará cada día ;)

Detrás de escena, esta directiva utiliza la API ngx_time en el núcleo de NGINX, por lo que generalmente no se involucra ninguna llamada al sistema debido al mecanismo de caché de tiempo en el núcleo de NGINX.

set_formatted_gmt_time

sintaxis: set_formatted_gmt_time $res <time-format>

predeterminado: no

contexto: location, location if

fase: rewrite

Establece un tiempo GMT formateado en la variable $res (como el primer argumento) utilizando la cadena de formato en el segundo argumento.

Se admiten todas las notaciones de especificación de conversión en la función estándar de C strftime, como %Y (para años de 4 dígitos) y %M (para minutos en decimal). Consulta http://linux.die.net/man/3/strftime para obtener una lista completa de símbolos de especificación de conversión.

A continuación se muestra un ejemplo:

 location = /t {
     set_formatted_gmt_time $timestr "%a %b %e %H:%M:%S %Y GMT";
     echo $timestr;
 }

Acceder a /t produce la salida

Fri Dec 13 15:34:37 2013 GMT

Esta directiva fue añadida por primera vez en el lanzamiento 0.23.

Consulta también set_formatted_local_time.

set_formatted_local_time

sintaxis: set_formatted_local_time $res <time-format>

predeterminado: no

contexto: location, location if

fase: rewrite

Establece un tiempo local formateado en la variable $res (como el primer argumento) utilizando la cadena de formato en el segundo argumento.

Se admiten todas las notaciones de especificación de conversión en la función estándar de C strftime, como %Y (para años de 4 dígitos) y %M (para minutos en decimal). Consulta http://linux.die.net/man/3/strftime para obtener una lista completa de símbolos de especificación de conversión.

A continuación se muestra un ejemplo:

 location = /t {
     set_formatted_local_time $timestr "%a %b %e %H:%M:%S %Y %Z";
     echo $timestr;
 }

Acceder a /t produce la salida

Fri Dec 13 15:42:15 2013 PST

Esta directiva fue añadida por primera vez en el lanzamiento 0.23.

Consulta también set_formatted_gmt_time.

Advertencias

No uses $arg_PARAMETER, $cookie_COOKIE, $http_HEADER u otras variables especiales definidas en el módulo central de NGINX como la variable objetivo en las directivas de este módulo. Por ejemplo,

 set_if_empty $arg_user 'foo';  # ¡NO USE ESTO!

puede llevar a fallos de segmentación.

Cambios

Los registros de cambios de cada lanzamiento de este módulo se pueden obtener de los registros de cambios del paquete OpenResty:

http://openresty.org/#Changes

Suite de Pruebas

Este módulo viene con una suite de pruebas impulsada por Perl. Los casos de prueba son declarativos también. Gracias al módulo Test::Nginx en el mundo de Perl.

Para ejecutarlo en tu lado:

 $ PATH=/path/to/your/nginx-with-set-misc-module:$PATH prove -r t

Necesitas terminar cualquier proceso de NGINX antes de ejecutar la suite de pruebas si has cambiado el binario del servidor NGINX.

Debido a que se utiliza un solo servidor nginx (por defecto, localhost:1984) en todos los scripts de prueba (.t), no tiene sentido ejecutar la suite de pruebas en paralelo especificando -jN al invocar la utilidad prove.

Véase También

GitHub

Puedes encontrar consejos de configuración adicionales y documentación para este módulo en el repositorio de GitHub para nginx-module-set-misc.