Quiero alternar la redirección de URL de una ubicación según el valor del encabezado. El objetivo final es alternar la reescritura de URL según el valor de una cookie.
Para eso, establecí la siguiente configuración.
server{ ... set $toggle "off"; location / { if ( $toggle = "on"){ return 301 https://stackoverflow.com; } } }Necesito cambiar el valor de la variable de alternancia antes de que Nginx evalúe el código en la ubicación. Establecí la siguiente función de inicio:
static ngx_int_t ngx_http_toggle_init(ngx_conf_t *cf){ ngx_http_handler_pt *h; ngx_http_core_main_conf_t *cmcf; cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); h = ngx_array_push(&cmcf->phases[NGX_HTTP_SERVER_REWRITE_PHASE].handlers); if (h == NULL) { return NGX_ERROR; } *h = ngx_http_toggle_handler; return NGX_OK; }Y el siguiente controlador:
static ngx_int_t ngx_http_toggle_handler(ngx_http_request_t *r){ ngx_int_t response; response = ngx_http_toggle(r); if(response != NGX_OK){ ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "Error with toggle"); return NGX_ERROR; } ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "Handler is ok"); return NGX_OK; }El siguiente código se ejecuta para establecer el valor de la variable:
ngx_http_variable_value_t *var = ngx_pcalloc(r->pool, sizeof(ngx_http_variable_value_t)); var = ngx_http_get_indexed_variable(r, index); if( #condition ){ ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "Redirected for: %s", var_name.data); var->len = 2; var->data = (unsigned char *)"on"; }else{ ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "Not redirected for: %s", var_name.data); var->len = 3; var->data = (unsigned char *)"off"; }Los registros devuelven buenos valores y "ok". Pero NGINX nunca devuelve ninguna respuesta.
¿Me perdí una parte sobre los controladores NGX_HTTP_SERVER_REWRITE_PHASE? ¿Tiene una mejor idea de cómo actualizar las variables con el valor de las solicitudes?
Gracias por sus respuestas.
En ngx_int_t ngx_http_toggle_handler intente devolver NGX_DECLINED (no NGX_OK), me ayudó a obtener una respuesta.