Archive for January 2011

WordPress: wp-admin sobre https + nginx

Es importante poder acceder al administrador de wordpress mediante https, nos garantiza que cuando hacemos login nuestro user & pass no van en texto plano hasta el servidor.

En mi blog, que utilizo wordpress + nginx y debo asegurarme que todo funcione perfectemente; Desde la versión 3.x de Wordpres ha cambiado el método a utilizar, a pesar de que aún la documentación oficial [0] es vieja y no tiene aplicación hoy en dia, les daré algunos tips para poder publicar el /wp-admin sobre ssl y con nginx como webserver.

wp-includes/default-constants.php
El archivo implicado, en mi caso el path es: /var/www/ngen.com.ar/blog/wp-includes/default-constants.php donde deben buscar el valor define(‘FORCE_SSL_ADMIN’, false); y cambiarlo a true.

1
2
3
        if ( !defined('FORCE_SSL_ADMIN') )
                define('FORCE_SSL_ADMIN', true);
        force_ssl_admin(FORCE_SSL_ADMIN);
        if ( !defined('FORCE_SSL_ADMIN') )
                define('FORCE_SSL_ADMIN', true);
        force_ssl_admin(FORCE_SSL_ADMIN);

Importante!
Cada vez que actualizen WordPress desde el dashboard este archivo se sobreescribe con la configuración por defecto que es “false”, asi que deben volver a editarlo y cambiar el valor para aplicar nuevamente los cambios.


Configuración nginx

No voy a explicar aqui cómo es la configuración global de nginx y dado que publico mi blog como /blog en nginx la configuración es asi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        location /blog {
                root   /var/www/ngen.com.ar;
                index   index.php;
                }
 
        access_log  /var/log/nginx/blog.access.log;
        error_log      /var/log/nginx/blog.error.log;
 
        location ~ \.php$ {
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  /var/www/ngen.com.ar/blog$fastcgi_script_name;
                include        fastcgi_params;
                }
 
        # rewrite wp-admin to https
        location ~ wp-login.php$ {
                rewrite ^/wp-login.php(.*)$ https://$host/$1 last;
                }
        location /blog {
                root   /var/www/ngen.com.ar;
                index   index.php;
                }

        access_log  /var/log/nginx/blog.access.log;
        error_log      /var/log/nginx/blog.error.log;

        location ~ \.php$ {
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  /var/www/ngen.com.ar/blog$fastcgi_script_name;
                include        fastcgi_params;
                }

        # rewrite wp-admin to https
        location ~ wp-login.php$ {
                rewrite ^/wp-login.php(.*)$ https://$host/$1 last;
                }

No tiene nada fuera de lo común, salvo las lineas donde especifico con rewrite que todo lo que sea ^/wp-login.php lo envié al mismo host pero bajo https.

Tambien debemos configurar el mismo virtualhost en nignx pero con el puerto 443 que en este caso los datos incorporan mas información.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        ssl  on;
        ssl_certificate         /etc/nginx/ssl/server.crt;
        ssl_certificate_key     /etc/nginx/ssl/server.key;
 
        access_log      /var/log/nginx/wp-admin.access.log;
        error_log      /var/log/nginx/wp.admin.error.log;
 
        location /blog {
                alias   /var/www/ngen.com.ar/blog;
                index  index.php;
                }
 
        location ~ \.php$ {
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  /var/www/ngen.com.ar/blog$fastcgi_script_name;
                include        fastcgi_params;
                }
        ssl  on;
        ssl_certificate         /etc/nginx/ssl/server.crt;
        ssl_certificate_key     /etc/nginx/ssl/server.key;

        access_log      /var/log/nginx/wp-admin.access.log;
        error_log      /var/log/nginx/wp.admin.error.log;

        location /blog {
                alias   /var/www/ngen.com.ar/blog;
                index  index.php;
                }

        location ~ \.php$ {
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  /var/www/ngen.com.ar/blog$fastcgi_script_name;
                include        fastcgi_params;
                }

Eso es todo, desde ahora cada vez que quiero acceder al admin del wordpress desde http://ngen.com.ar/blog/wp-admin me redirecciona automáticamente hacia https://ngen.com.ar/blog/wp-admin/

[0] http://codex.wordpress.org/Administration_Over_SSL