mozillahispano / administracion-tecnica

Seguimiento de las tareas del equipo de Administración técnica
0 stars 1 forks source link

Pasar a reglas nginx los htaccess de apache #18

Open nukeador opened 9 years ago

nukeador commented 9 years ago

Dado que ya no usamos apache, necesitamos pasar cosas que teníamos en htaccess.

Especialmente las muchas redirecciones que teníamos en el htaccess de mozilla-hispano.org

http://www.anilcetin.com/

willyaranda commented 9 years ago

Una pregunta, después de unos meses, ¿seguimos necesitando los redirects? Los motores no habrán cambiado sus datos guardados a donde redirigimos?

nukeador commented 9 years ago

Si y no. Hay cosas más recientes y luego hay redirects para cosas como mozillahispano.org y otras URLs que tienen que estar siempre ahí.

willyaranda commented 9 years ago

Puedes decirme qué hay que redirigir? qué dominios, básicamente

El 19 de agosto de 2015, 12:39, Nukeador notifications@github.com escribió:

Si y no. Hay cosas más recientes y luego hay redirects para cosas como mozillahispano.org y otras URLs que tienen que estar siempre ahí.

— Reply to this email directly or view it on GitHub https://github.com/mozillahispano/administracion-tecnica/issues/18#issuecomment-132535086 .

Guillermo López [willyaranda] http://mozilla-hispano.org http://twitter.com/mozilla_hispano http://facebook.com/mozillahispano Certified Mozillian: https://mozillians.org/willyaranda

nukeador commented 9 years ago

En el .htaccess están todos los redirects. Es importante porque del foro viejo al nuevo mandamos a la gente así.

nukeador commented 9 years ago

https://github.com/mozillahispano/mozilla-hispano.org/blob/master/.htaccess

nukeador commented 9 years ago

Le pongo P1 a esto porque rompe funcionalidades

pochy-ja commented 9 years ago

@willyaranda estas en esto?, lo que comentaba por telegram el otro día que @nukeador pidió ayuda con esto que debía ser alguien del grupo de administración técnica con acceso al server el que haga esta tarea o no se como tendrían pensado con alguien externo?, lo que pienso que de momento no se está redireccionando nada, por lo que podían es usar la herramienta [1] y pasarle lo que tienen en el .htaccess y luego avisar para ayudar a comprobar cuales han funcionado y cuales no, entonces ir corrigiendo lo que quede mal en caso de que la herramienta funcione, estado mirando un poco en como las convierte y la manera no está muy recomentada por la documentación de nginx [2] pero al menos es algo automatizado que va a resolver el problema si funciona con algunos redirect.

[1]http://www.anilcetin.com/ [2]http://nginx.org/en/docs/http/converting_rewrite_rules.html

willyaranda commented 9 years ago

No, no estoy con esto

nukeador commented 9 years ago

Esto es lo que devuelve el conversor:

if ($http_host ~* "^mozilla-hispano.com$"){
    set $rule_0 1$rule_0;
}
if ($rule_0 = "1"){
    rewrite ^/(.*)$ http://www.mozilla-hispano.org/$1 permanent;
}
if ($http_host ~* "^www.mozilla-hispano.com$"){
    set $rule_1 1$rule_1;
}
if ($rule_1 = "1"){
    rewrite ^/(.*)$ http://www.mozilla-hispano.org/$1 permanent;
}
if ($http_host ~* "^mozillahispano.org$"){
    set $rule_2 1$rule_2;
}
if ($rule_2 = "1"){
    rewrite ^/(.*)$ http://www.mozilla-hispano.org/$1 permanent;
}
if ($http_host ~* "^www.mozillahispano.org$"){
    set $rule_3 1$rule_3;
}
if ($rule_3 = "1"){
    rewrite ^/(.*)$ http://www.mozilla-hispano.org/$1 permanent;
}
if ($http_host ~* "^mozilla-hispano.org$"){
    set $rule_4 1$rule_4;
}
if ($rule_4 = "1"){
    rewrite ^/(.*)$ http://www.mozilla-hispano.org/$1 permanent;
}
if ($args ~ "^f=1$"){
    set $rule_5 1$rule_5;
}
if ($rule_5 = "1"){
    rewrite ^/foro/(.*)$ https://support.mozilla.org/es/questions/new? permanent;
}
if ($args ~ "^f=1&sid=(.*)$"){
    set $rule_6 1$rule_6;
}
if ($rule_6 = "1"){
    rewrite ^/foro/(.*)$ https://support.mozilla.org/es/questions/new? permanent;
}
if ($args ~ "^f=2$"){
    set $rule_7 1$rule_7;
}
if ($rule_7 = "1"){
    rewrite ^/foro/(.*)$ https://support.mozilla.org/es/questions/new/desktop? permanent;
}
if ($args ~ "^f=2&sid=(.*)$"){
    set $rule_8 1$rule_8;
}
if ($rule_8 = "1"){
    rewrite ^/foro/(.*)$ https://support.mozilla.org/es/questions/new/desktop? permanent;
}
if ($args ~ "^f=46$"){
    set $rule_9 1$rule_9;
}
if ($rule_9 = "1"){
    rewrite ^/foro/(.*)$ https://support.mozilla.org/es/questions/new/mobile? permanent;
}
if ($args ~ "^f=46&sid=(.*)$"){
    set $rule_10 1$rule_10;
}
if ($rule_10 = "1"){
    rewrite ^/foro/(.*)$ https://support.mozilla.org/es/questions/new/mobile? permanent;
}
if ($args ~ "^f=3$"){
    set $rule_11 1$rule_11;
}
if ($rule_11 = "1"){
    rewrite ^/foro/(.*)$ https://support.mozilla.org/es/questions/new/thunderbird? permanent;
}
if ($args ~ "^f=3&sid=(.*)$"){
    set $rule_12 1$rule_12;
}
if ($rule_12 = "1"){
    rewrite ^/foro/(.*)$ https://support.mozilla.org/es/questions/new/thunderbird? permanent;
}
if ($args ~ "^f=47$"){
    set $rule_13 1$rule_13;
}
if ($rule_13 = "1"){
    rewrite ^/foro/(.*)$ https://support.mozilla.org/es/questions/new/firefox-os? permanent;
}
if ($args ~ "^f=47&sid=(.*)$"){
    set $rule_14 1$rule_14;
}
if ($rule_14 = "1"){
    rewrite ^/foro/(.*)$ https://support.mozilla.org/es/questions/new/firefox-os? permanent;
}
if ($args ~ "f=6"){
    set $rule_15 1$rule_15;
}
if ($rule_15 = "1"){
    rewrite ^/foro/(.*)$ https://foro.mozilla-hispano.org/? permanent;
}
if ($args ~ "f=12"){
    set $rule_16 1$rule_16;
}
if ($rule_16 = "1"){
    rewrite ^/foro/(.*)$ https://foro.mozilla-hispano.org/c/participa-en-el-proyecto? permanent;
}
if ($args ~ "f=16"){
    set $rule_17 1$rule_17;
}
if ($rule_17 = "1"){
    rewrite ^/foro/(.*)$ https://foro.mozilla-hispano.org/c/discusion-general? permanent;
}
if ($args ~ "f=26"){
    set $rule_18 1$rule_18;
}
if ($rule_18 = "1"){
    rewrite ^/foro/(.*)$ https://foro.mozilla-hispano.org/c/difusion-eventos? permanent;
}
if ($args ~ "f=27"){
    set $rule_19 1$rule_19;
}
if ($rule_19 = "1"){
    rewrite ^/foro/(.*)$ https://foro.mozilla-hispano.org/c/difusion-eventos? permanent;
}
if ($args ~ "f=35"){
    set $rule_20 1$rule_20;
}
if ($rule_20 = "1"){
    rewrite ^/foro/(.*)$ https://foro.mozilla-hispano.org/c/noticias? permanent;
}
if ($args ~ "f=8"){
    set $rule_21 1$rule_21;
}
if ($rule_21 = "1"){
    rewrite ^/foro/(.*)$ https://foro.mozilla-hispano.org/c/desarrollo-mozilla? permanent;
}
if ($args ~ "f=7"){
    set $rule_22 1$rule_22;
}
if ($rule_22 = "1"){
    rewrite ^/foro/(.*)$ https://foro.mozilla-hispano.org/c/traduccion? permanent;
}
if ($args ~ "f=25"){
    set $rule_23 1$rule_23;
}
if ($rule_23 = "1"){
    rewrite ^/foro/(.*)$ https://foro.mozilla-hispano.org/c/labs? permanent;
}
if ($args ~ "f=17"){
    set $rule_24 1$rule_24;
}
if ($rule_24 = "1"){
    rewrite ^/foro/(.*)$ https://foro.mozilla-hispano.org/c/presentaciones-mentoria? permanent;
}
if ($args ~ "f=14"){
    set $rule_25 1$rule_25;
}
if ($rule_25 = "1"){
    rewrite ^/foro/(.*)$ https://foro.mozilla-hispano.org/c/miembros? permanent;
}
if ($args ~ "f=50"){
    set $rule_26 1$rule_26;
}
if ($rule_26 = "1"){
    rewrite ^/foro/(.*)$ https://foro.mozilla-hispano.org/c/discusion-general/firefox-os? permanent;
}

¿Tiene sentido @pochy-ja ?

nukeador commented 9 years ago

Haciendo pruebas esto por ejemplo no funciona:

location /foro {
        if ($args ~ "f=12"){
                rewrite ^/(.*)$ https://foro.mozilla-hispano.org/c/participa-en-el-proyecto? permanent;
        }
    }
ghost commented 9 years ago

Hola a todos:

No soy experto en reglas de nginx, pero he probado esa configuración (location /foro) en un nginx local y funciona bien. Accedo a http://localhost**/foro?f=12** recibo una redirección HTTP 301 hacia https://foro.mozilla-hispano.org/c/participa-en-el-proyecto y accedo bien a esa nueva dirección.

En logs de nginx se ve la petición: GET /foro?f=12 ¿Cómo se refleja en logs de nginx la petición que no funciona?

Saludos

nukeador commented 9 years ago

@jlgetxo el problema es que la petición que tiene que redirigir es:

https://www.mozilla-hispano.org/foro/viewforum.php?f=12

A

https://foro.mozilla-hispano.org/c/participa-en-el-proyecto

Por lo que supongo que la regla está mal y hay que incluir algo más.

ghost commented 9 years ago

OK, se tiene que estar pisando con alguna otra regla. Prueba lo siguiente: 1.- Añadir "^~" delante del prefijo "/foro", así se consigue que si esta regla es la elegida (por prefijo) ya no se comprueben las reglas con expresiones regulares, más complicadas de revisar. location ^~ /foro { if ($args ~ "f=12"){ rewrite ^/(.*)$ https://foro.mozilla-hispano.org/c/participa-en-el-proyecto? permanent; } }

2.- Si con el punto 1 no se soluciona, se puede ver qué regla rewrite se está ejecutando, añade en la configuración de nginx lo siguiente:

error_log logs/error.log notice;

Con estos dos cambios, las peticiones que hagas y se vean afectadas por un rewrite quedarán registradas en el log de errores, con nivel notice. Será algo similar a esto:

[notice] 7477#0: 1 "f=12" matches "f=12", client: 127.0.0.1, server: localhost, request: "GET /foro?f=12 HTTP/1.1", host: "localhost:801" [notice] 7477#0: *1 "^(.)$" matches "/foro", client: 127.0.0.1, server: localhost, request: "GET /foro?f=12 HTTP/1.1", host: "localhost:801" [notice] 7477#0: *1 rewritten redirect: "https://foro.mozilla-hispano.org/c/participa-en-el-proyecto", client: 127.0.0.1, server: localhost, request: "GET /foro?f=12 HTTP/1.1", host: "localhost:801"

Aquí se ve, en dos pasos, que ha entrado por "/foro" con $args="f=12". De esta forma podrás identificar qué regla se está empleando, y ya veríamos qué hacer para evitarlo.

Importante, cuando termines de probarlo vuelve a dejar la configuración de nginx como estaba porque el archivo de errores puede crecer muy rápidamente dependiendo del tráfico del servidor.

nukeador commented 9 years ago

@jlgetxo con 1. quedó solucionado, ahora tengo que ver cómo transformar la traducción que me generó esa web en algo limpio.

nukeador commented 9 years ago

Hay un problema, si añado los if, se rompe la carga del php.

2015/09/28 01:08:57 [error] 8674#0: *19 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, server: www.mozilla-hispano.org, request: "GET /foro/viewtopic.php?f=2&t=4616 HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "www.mozilla-hispano.org"
nukeador commented 9 years ago

Como referencia de lo que hay antes en el config:

## PHP5-FPM
    location ~ (\.php) {
        include /etc/nginx/fastcgi_params;
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass_header Set-Cookie;
        fastcgi_pass_header Cookie;
        fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
        fastcgi_index index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/mozilla-hispano/$fastcgi_script_name;
        fastcgi_pass php-fpm;
    }

    location / {
        try_files $uri $uri/ /index.php?q=$uri$args;
    }

    location @rewriteDoc {
                rewrite ^/(.*)$ /documentacion/index.php?title=$1&$args;
        }

    location /documentacion {
        try_files $uri $uri/ @rewriteDoc;
    }

    location ^~ /foro {
        if ($args ~ "f=12"){
            rewrite ^/(.*)$ https://foro.mozilla-hispano.org/c/participa-en-el-proyecto? permanent;
        }
    }

Si añado el ^~ /foro parece que no aplica el fastcgi al php-fpm.

ghost commented 9 years ago

Con la parte del fcgi de php no te puedo ayudar. Nginx no evalua en el orden en el que aparece en el archivo de config: primero evalua todos los prefijos y "guarda" el de mayor longitud, luego evalua las expresiones regulares (ahora sí en orden) y ejecuta la primera que se cumpla y supere la longitud emparejada por prefijo.

Por lo que he podido probar, la expresión regular ~ (.php) siempre va a tener la mayor prioridad, al emparejarse con el string de mayor longitud y nunca se aplicaría la regla "/foro". Con "^~ /foro" evitamos que se evaluen expresiones regulares y en esta ruta virtual no habrá php, pero fuera de eso sí debería funcionar. Dentro de /foro nos encargamos de dirigir al navegador a donde corresponda en función del argumento.

Si dentro de /foro va a haber otros PHP que tienen que funcionar, se podría repetir la configuración de php dentro de este location. O si no se quiere repetir, dar un nombre a la configuración de PHP, así: location @fastcgi { include /etc/nginx/fastcgi_params; try_files $uri =404; fastcgi_split_path_info ^(.+.php)(/.+)$; fastcgi_pass_header Set-Cookie; fastcgi_pass_header Cookie; fastcgi_ignore_headers Cache-Control Expires Set-Cookie; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/mozilla-hispano/$fastcgi_script_name; fastcgi_pass php-fpm; }

location ~ (.php) { alias @fastcgi; }

location ^~/foro { if ($args ~ "f=12"){ rewrite ^/(.*)$ https://foro.mozilla-hispano.org/c/participa-en-el-proyecto? permanent; } try_files $uri @fastcgi; }

Otra alternativa que se me ocurre es dejar de lado la config de nginx y hacer a mano la página /foro/viewforum.php donde se recoja el parámetro "f" ($_GET["f"] ) y en función del valor saltar a la url que corresponda con http_redirect.