Si necesitamos proteger una web o un directorio de una web con nginx sólo hay que seguir estos 2 pasos:

 

Generar un fichero con el usuario y clave

Si ya tenemos un fichero de usuarios clave de apache lo podemos reutilizar en nginx, pero si lo tenemos que crear hay dos formas de hacerlo:

En el ejemplo crearemos el fichero de claves en /etc/nginx/.htpasswd

Usando el comando de apache2-utils htpasswd

sudo htpasswd -c /etc/nginx/.htpasswd usuario

con openssl

echo -n "usuario:" >> /etc/nginx/.htpasswd
openssl passwd -apr1 >> /etc/nginx/.htpasswd

de esta forma nos quedará algo así en el fichero

test2:$apr1$o4Lmm4.x$joXl8SfzA2tYPVtRQPTtF0

Configurar nginx

Sólo tenemos añadir al location que queremos proteger dos líneas:
auth_basic “acceso prohibido”; para indicar que vamos a usar usuario y contraseña para ese location
auth_basic_user_file /etc/nginx/.htpasswd; para decirle donde está el fichero con el usuario y contraseña

Por ejemplo para proteger el acceso a un wordpress:

location / {
	auth_basic "acceso prohibido";
	auth_basic_user_file /etc/nginx/.htpasswd;
 
	try_files $uri $uri/ /index.php?q=$uri&$args;
}

Hace un tiempo tuvimos que cambiar la estructura de permalinks de wordpress del formato http://dominio/año/mes/contenido a http://dominio/contenido y decidimos hacer que el nginx hiciera un 301 del formato viejo al nuevo.

Es algo tan sencillo como esto:

rewrite "^/[\d]{4}/[\d]{2}/(.*)\/$" /$1/ permanent;

Espero que os sea útil.

nginx
Acabo de ver esta entrada “evitar hotlinking mediante nginx” en el blog de systemadmin.es y me ha recordado una anécdota similar con la que tuve que lidiar hace un tiempo.

Revisando los logs de un un acortador de urls con yourls me encontré una barbaridad de enlaces desde un foro que redirigían a imágenes con contenido porno, y la verdad es que ni ese era el objetivo del acortador ni me apetecía regalar ancho de banda (por poco que sea) a esas cosas, así que aprovechando la versatilidad que da nginx hice que todas las peticiones de ese foro se redirigieran a otra foto un pelín diferente.

if ($http_referer ~* (foro_malo_malo)) {
        #return 403;
        return 301 http://www.photogallery.va/content/dam/photogallery/franciscus/06612_19052013.jpg/_jcr_content/renditions/cq5dam.web.800.800.jpeg;
}

La verdad es que me estuve riendo un buen rato pensando en la cara que le quedaría al chaval que esperaba encontrarse una alegre moza con poca ropa y que de pronto se encuentra a este buen señor con esa cara de cachondeo. 🙂

Al principio había puesto un “return 403;” pero noté que la gente veía el error, recargaba la url del acortador y ya le redirigía a la página de destino correctamente.